]> git.p6c8.net - jirafeau_project.git/commitdiff
modularization of functions
authorBlackeye <>
Sun, 11 Aug 2024 13:13:24 +0000 (15:13 +0200)
committerBlackeye <>
Sun, 11 Aug 2024 13:13:24 +0000 (15:13 +0200)
lib/functions.js.php
lib/functions.php

index 3052bf03a45e2b9cf6a21a04d3c401574b322325..17c6d0b8818f74b6c7298db4fcc678328328cd5a 100644 (file)
  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+ function template_js_preview_link() {
+    ?>
+    if (!!document.getElementById('preview_link'))
+    {
+        document.getElementById('upload_finished_preview').style.display = 'none';
+        var preview_link_href = 'f.php?h=' + reference + '&p=1';
+        if (crypt_key.length > 0)
+        {
+            preview_link_href += '&k=' + crypt_key;
+        }
+
+        // Test if content can be previewed
+        type = document.getElementById('file_select').files[0].type;
+        if ((type.startsWith('image/')
+                || type.startsWith('audio')
+                || type.startsWith('text/plain')
+                || type.startsWith('video/'))
+            && !type.includes('image/svg+xml'))
+        {
+            document.getElementById('preview_link').href = preview_link_href;
+            document.getElementById('preview_link_text').innerHTML = web_root + preview_link_href;
+            document.getElementById('upload_finished_preview').style.display = '';
+        }
+    } 
+    <?php
+ }
+function template_js_download_page() {
+    ?>
+    // Download page
+    var download_link_href = 'f.php?h=' + reference;
+    if (crypt_key.length > 0)
+    {
+        download_link_href += '&k=' + crypt_key;
+    }
+    if (!!document.getElementById('upload_finished_download_page'))
+    {
+        document.getElementById('upload_link').href = download_link_href;
+        document.getElementById('upload_link_text').innerHTML = web_root + download_link_href;
+    }
+    <?php
+}
+function template_js_email_link() {
+    ?>
+    // Email link
+    var b = encodeURIComponent("<?php echo t("DL"); ?> \"" + filename + "\":") + "%0D" + "%0A";
+    b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A";
+    if (false == isEmpty(date))
+    {
+        b += "%0D" + "%0A" + encodeURIComponent("<?php echo t("VALID_UNTIL"); ?>: " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D" + "%0A";
+        document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
+    }
+    <?php
+}
+function template_js_delete_link() {
+    ?>
+    // Delete link
+    var delete_link_href = 'f.php?h=' + reference + '&d=' + delete_code;
+    document.getElementById('delete_link').href = delete_link_href;
+    document.getElementById('delete_link_text').innerHTML = web_root + delete_link_href;
+    <?php
+}
+ function template_js_direct_download() {
+    ?>
+    // Direct download link
+    var direct_download_link_href = 'f.php?h=' + reference + '&d=1';
+    if (crypt_key.length > 0)
+    {
+        direct_download_link_href += '&k=' + crypt_key;
+    }
+    document.getElementById('direct_link').href = direct_download_link_href;
+    document.getElementById('direct_link_text').innerHTML = web_root + direct_download_link_href;
+    <?php
+ }
+ function template_js_date_function() {
+    ?>
+    // Validity date
+    if (isEmpty(date))
+    {
+        document.getElementById('date').style.display = 'none';
+    }
+    else {
+        document.getElementById('date').innerHTML = 
+        '<span class="datetime"' 
+            + 'data-datetime="'
+            + dateToUtcString(date) + ' (GMT"'
+            + 'title="'
+            + dateToUtcString(date) + ' (GMT)">'
+            + date.format('YYYY-MM-DD hh:mm (GMT O)')
+            + '</span>';
+            document.getElementById('date').style.display = '';
+    }
+    <?php
+ }
+
+
+
+
 header('Content-Type: text/javascript');
 define('JIRAFEAU_ROOT', dirname(__FILE__) . '/../');
 
@@ -124,6 +221,22 @@ function convertAllDatetimeFields() {
     }
 }
 
+// evil copy and paste from show_link - TODO refactor show link 
+function show_link_from_php (file_name,file_type, reference, delete_code, crypt_key, date)
+{
+    <?php template_js_download_page(); ?>
+    
+
+    var filename = file_name;
+    <?php template_js_email_link(); ?>
+    <?php template_js_delete_link(); ?>
+    <?php template_js_date_function(); ?>
+    var type = file_type;
+    <?php template_js_direct_download();?>
+}
+
+
+
 function show_link (reference, delete_code, crypt_key, date)
 {
     // Upload finished
@@ -132,78 +245,23 @@ function show_link (reference, delete_code, crypt_key, date)
     document.getElementById('upload_finished').style.display = '';
     document.title = "100% - <?php echo empty($cfg['title']) ? 'Jirafeau' : $cfg['title']; ?>";
 
-    // Download page
-    var download_link_href = 'f.php?h=' + reference;
-    if (crypt_key.length > 0)
-    {
-        download_link_href += '&k=' + crypt_key;
-    }
-    if (!!document.getElementById('upload_finished_download_page'))
-    {
-        document.getElementById('upload_link').href = download_link_href;
-        document.getElementById('upload_link_text').innerHTML = web_root + download_link_href;
-    }
-
+    <?php template_js_download_page(); ?>
     // Email link
     var filename = document.getElementById('file_select').files[0].name;
-    var b = encodeURIComponent("<?php echo t("DL"); ?> \"" + filename + "\":") + "%0D" + "%0A";
-    b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A";
-    if (false == isEmpty(date))
-    {
-        b += "%0D" + "%0A" + encodeURIComponent("<?php echo t("VALID_UNTIL"); ?>: " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D" + "%0A";
-        document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
-    }
 
-    // Delete link
-    var delete_link_href = 'f.php?h=' + reference + '&d=' + delete_code;
-    document.getElementById('delete_link').href = delete_link_href;
-    document.getElementById('delete_link_text').innerHTML = web_root + delete_link_href;
+    <?php template_js_email_link(); ?>
+    
+    <?php template_js_delete_link(); ?>
+    <?php template_js_date_function(); ?>
 
-    // Validity date
-    if (isEmpty(date))
-    {
-        document.getElementById('date').style.display = 'none';
-    }
-    else {
-        document.getElementById('date').innerHTML = '<span class="datetime" title="'
-            + dateToUtcString(date) + ' (GMT)">'
-            + date.format('YYYY-MM-DD hh:mm (GMT O)')
-            + '</span>';
-        document.getElementById('date').style.display = '';
-    }
 
     // Preview link (if allowed)
-    if (!!document.getElementById('preview_link'))
-    {
-        document.getElementById('upload_finished_preview').style.display = 'none';
-        var preview_link_href = 'f.php?h=' + reference + '&p=1';
-        if (crypt_key.length > 0)
-        {
-            preview_link_href += '&k=' + crypt_key;
-        }
+   
+    var type = document.getElementById('file_select').files[0].type;
+    <?php template_js_preview_link(); ?>
 
-        // Test if content can be previewed
-        type = document.getElementById('file_select').files[0].type;
-        if ((type.startsWith('image/')
-                || type.startsWith('audio')
-                || type.startsWith('text/plain')
-                || type.startsWith('video/'))
-            && !type.includes('image/svg+xml'))
-        {
-            document.getElementById('preview_link').href = preview_link_href;
-            document.getElementById('preview_link_text').innerHTML = web_root + preview_link_href;
-            document.getElementById('upload_finished_preview').style.display = '';
-        }
-    }
+    <?php template_js_direct_download();?>
 
-    // Direct download link
-    var direct_download_link_href = 'f.php?h=' + reference + '&d=1';
-    if (crypt_key.length > 0)
-    {
-        direct_download_link_href += '&k=' + crypt_key;
-    }
-    document.getElementById('direct_link').href = direct_download_link_href;
-    document.getElementById('direct_link_text').innerHTML = web_root + direct_download_link_href;
 
     // Hide preview and direct download link if password is set
     if (document.getElementById('input_key').value.length > 0)
index fd0fe2c657957848c6e6251a18956379b45d2eeb..1d0241e9912bd7770cb1a8cae402840e6d4b9afb 100644 (file)
@@ -447,25 +447,62 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                  'link' => '',
                  'delete_link' => ''));
     }
+    jirafeau_add_file($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method);
+}
 
-    /* array representing no error */
-    $noerr = array('has_error' => false, 'why' => '');
-
+/**
+ * 
+ * @param bool $crypt_module_enabled 
+ * @param string $file_path 
+ * @return array [bool, string]
+ */
+function jirafeau_handle_add_file_encryption($crypt_module_enabled, $file_path) {
     /* Crypt file if option is enabled. */
     $crypted = false;
     $crypt_key = '';
-    if ($crypt == true && !(extension_loaded('sodium') == true)) {
+    if ($crypt_module_enabled == true && !(extension_loaded('sodium') == true)) {
         error_log("PHP extension sodium not loaded, won't encrypt in Jirafeau");
     }
-    if ($crypt == true && extension_loaded('sodium') == true) {
-        $crypt_key = jirafeau_encrypt_file($file['tmp_name'], $file['tmp_name'].'crypt');
+    if ($crypt_module_enabled == true && extension_loaded('sodium') == true) {
+        $crypt_key = jirafeau_encrypt_file($file_path, $file_path.'crypt');
         if (strlen($crypt_key) > 0) {
-            if (rename($file['tmp_name'].'crypt', $file['tmp_name']) === true) {
+            if (rename($file_path.'crypt', $file_path) === true) {
                 $crypted = true;
             }
         }
     }
 
+    return [$crypted, $crypt_key];
+}
+
+/**
+ * adds an uploaded or copy/linked local file
+ * @param $file the file struct given by $_FILE[]
+ * @param $one_time_download is the file a one time download ?
+ * @param $key if not empty, protect the file with this key
+ * @param $time the time of validity of the file
+ * @param $ip uploader's ip
+ * @param $crypt boolean asking to crypt or not
+ * @param $link_name_length size of the link name
+ * @param $is_upload, determines if the file is uploaded or local - it controls which file-functions are used
+ * @return array  an array containing some information
+ *   'error' => information on possible errors
+ *   'link' => the link name of the uploaded file
+ *   'delete_link' => the link code to delete file
+ */
+function jirafeau_add_file($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method, $is_upload = true)
+{
+    // TODO needs to be adapted
+    $move_operation = $is_upload ? 'move_uploaded_file' : 'symlink';
+
+    /* array representing no error */
+    $noerr = array('has_error' => false, 'why' => '');
+
+    $crypted = false;
+    $crypt_key = '';
+    list($crypted, $crypt_key) = jirafeau_handle_add_file_encryption($crypt, $file['tmp_name']);
+
+    
     /* file information */
     $hash = jirafeau_hash_file($file_hash_method, $file['tmp_name']);
     $name = str_replace(NL, '', trim($file['name']));
@@ -478,7 +515,11 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
     if (file_exists(VAR_FILES . $p .  $hash)) {
         $rc = unlink($file['tmp_name']);
     } elseif ((file_exists(VAR_FILES . $p) || @mkdir(VAR_FILES . $p, 0755, true))
-            && move_uploaded_file($file['tmp_name'], VAR_FILES . $p . $hash)) {
+            && 
+            //move_uploaded_file($file['tmp_name'], VAR_FILES . $p . $hash)) 
+            $move_operation($file['tmp_name'], VAR_FILES . $p . $hash))
+            {
+            
         $rc = true;
     }
     if (!$rc) {
@@ -517,7 +558,7 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
         $handle,
         $name . NL. $mime_type . NL. $size . NL. $password . NL. $time .
             NL . $hash. NL . ($one_time_download ? 'O' : 'R') . NL . time() .
-            NL . $ip . NL. $delete_link_code . NL . ($crypted ? 'C2' : 'O')
+            NL . $ip . NL. $delete_link_code . NL . ($crypted ? 'C' : 'O')
     );
     fclose($handle);
     $hash_link = substr(base_16_to_64(md5_file($link_tmp_name)), 0, $link_name_length);
@@ -549,6 +590,37 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                   'crypt_key' => $crypt_key);
 }
 
+
+function jirafeau_admin_list_table ($name, $file_hash, $link_hash, $visitor_function = null) {
+    echo '<fieldset><legend>';
+    if (!empty($name)) {
+        echo t('FILENAME') . ": " . jirafeau_escape($name);
+    }
+    if (!empty($file_hash)) {
+        echo t('FILE') . ": " . jirafeau_escape($file_hash);
+    }
+    if (!empty($link_hash)) {
+        echo t('LINK') . ": " . jirafeau_escape($link_hash);
+    }
+    if (empty($name) && empty($file_hash) && empty($link_hash)) {
+        echo t('LS_FILES');
+    }
+    echo '</legend>';
+    echo '<table>';
+    echo '<tr>';
+    echo '<th></th>';
+    echo '<th>' . t('ACTION') . '</th>';
+    echo '</tr>';
+    if ($visitor_function != null) {
+        $visitor_function($name, $file_hash, $link_hash);
+    }
+    echo '</table></fieldset>';
+}
+
+
+
+
+
 /**
  * Tells if a mime-type is viewable in a browser
  * @param $mime the mime type
@@ -673,103 +745,79 @@ function jirafeau_get_link($hash)
 }
 
 /**
- * List files in admin interface.
+ * List files ii folder in admin interface.
  */
 function jirafeau_admin_list($name, $file_hash, $link_hash)
 {
-    echo '<fieldset><legend>';
-    if (!empty($name)) {
-        echo t('FILENAME') . ": " . jirafeau_escape($name);
-    }
-    if (!empty($file_hash)) {
-        echo t('FILE') . ": " . jirafeau_escape($file_hash);
-    }
-    if (!empty($link_hash)) {
-        echo t('LINK') . ": " . jirafeau_escape($link_hash);
-    }
-    if (empty($name) && empty($file_hash) && empty($link_hash)) {
-        echo t('LS_FILES');
-    }
-    echo '</legend>';
-    echo '<table>';
-    echo '<tr>';
-    echo '<th></th>';
-    echo '<th>' . t('ACTION') . '</th>';
-    echo '</tr>';
-
-    /* Get all links files. */
-    $stack = array(VAR_LINKS);
-    while (($d = array_shift($stack)) && $d != null) {
-        $dir = scandir($d);
-        foreach ($dir as $node) {
-            if (strcmp($node, '.') == 0 || strcmp($node, '..') == 0 ||
-                preg_match('/\.tmp/i', "$node")) {
-                continue;
-            }
-            if (is_dir($d . $node)) {
-                /* Push new found directory. */
-                $stack[] = $d . $node . '/';
-            } elseif (is_file($d . $node)) {
-                /* Read link information. */
-                $l = jirafeau_get_link($node);
-                if (!count($l)) {
-                    continue;
-                }
-                $ld = jirafeau_get_download_stats($node);
-
-                /* Filter. */
-                if (!empty($name) && !@preg_match("/$name/i", jirafeau_escape($l['file_name']))) {
-                    continue;
-                }
-                if (!empty($file_hash) && $file_hash != $l['hash']) {
+    $function = function($name, $file_hash, $link_hash) {
+         /* Get all links files. */
+        $stack = array(VAR_LINKS);
+        while (($d = array_shift($stack)) && $d != null) {
+            $dir = scandir($d);
+            foreach ($dir as $node) {
+                if (strcmp($node, '.') == 0 || strcmp($node, '..') == 0 ||
+                    preg_match('/\.tmp/i', "$node")) {
                     continue;
                 }
-                if (!empty($link_hash) && $link_hash != $node) {
-                    continue;
+                if (is_dir($d . $node)) {
+                    /* Push new found directory. */
+                    $stack[] = $d . $node . '/';
+                } elseif (is_file($d . $node)) {
+                    /* Read link information. */
+                    $l = jirafeau_get_link($node);
+                    if (!count($l)) {
+                        continue;
+                    }
+
+                    /* Filter. */
+                    if (!empty($name) && !@preg_match("/$name/i", jirafeau_escape($l['file_name']))) {
+                        continue;
+                    }
+                    if (!empty($file_hash) && $file_hash != $l['hash']) {
+                        continue;
+                    }
+                    if (!empty($link_hash) && $link_hash != $node) {
+                        continue;
+                    }
+                    /* Print link information. */
+                    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><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/>';
+                    if (strlen($l['ip']) > 0) {
+                        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() .
+                    '<input type = "submit" value = "' . t('DL') . '" />' .
+                    '</form>' .
+                    '<form method="post">' .
+                    '<input type = "hidden" name = "action" value = "delete_link"/>' .
+                    '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
+                    jirafeau_admin_csrf_field() .
+                    '<input type = "submit" value = "' . t('DEL_LINK') . '" />' .
+                    '</form>' .
+                    '<form method="post">' .
+                    '<input type = "hidden" name = "action" value = "delete_file"/>' .
+                    '<input type = "hidden" name = "hash" value = "' . $l['hash'] . '"/>' .
+                    jirafeau_admin_csrf_field() .
+                    '<input type = "submit" value = "' . t('DEL_FILE_LINKS') . '" />' .
+                    '</form>' .
+                    '</td>';
+                    echo '</tr>';
                 }
-                /* Print link information. */
-                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><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/>';
-                if (strlen($l['ip']) > 0) {
-                    echo t('ORIGIN') . ': ' . $l['ip'] . '<br/>';
-                }
-                echo t('DOWNLOAD_COUNT') . ': ' . $ld['count'] . '<br/>';
-                if ($ld['count'] > 0) {
-                    echo t('DOWNLOAD_DATE') . ': ' . jirafeau_get_datetimefield($ld['date']) . '<br/>';
-                    echo t('DOWNLOAD_IP') . ': ' . $ld['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() .
-                '<input type = "submit" value = "' . t('DL') . '" />' .
-                '</form>' .
-                '<form method="post">' .
-                '<input type = "hidden" name = "action" value = "delete_link"/>' .
-                '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
-                jirafeau_admin_csrf_field() .
-                '<input type = "submit" value = "' . t('DEL_LINK') . '" />' .
-                '</form>' .
-                '<form method="post">' .
-                '<input type = "hidden" name = "action" value = "delete_file"/>' .
-                '<input type = "hidden" name = "hash" value = "' . $l['hash'] . '"/>' .
-                jirafeau_admin_csrf_field() .
-                '<input type = "submit" value = "' . t('DEL_FILE_LINKS') . '" />' .
-                '</form>' .
-                '</td>';
-                echo '</tr>';
             }
         }
-    }
-    echo '</table></fieldset>';
+        };
+        jirafeau_admin_list_table($name, $file_hash, $link_hash, $function);
 }
 
 /**
@@ -1010,8 +1058,8 @@ function jirafeau_async_delete($ref)
 function jirafeau_async_init($filename, $type, $one_time, $key, $time, $ip)
 {
     /* Create temporary folder. */
-    $ref;
-    $p;
+    $ref = '';
+    $p = '';
     $code = jirafeau_gen_random(4);
     do {
         $ref = jirafeau_gen_random(32);
@@ -1876,3 +1924,73 @@ function jirafeau_get_expiration_time_options() {
     }
     return $time;
 }
+
+
+
+
+/**
+ * links or copy a local file 
+ * TODO: boolean in config for linking
+ * @param string $filepath 
+ * @param $one_time_download is the file a one time download ?
+ * @param $key if not empty, protect the file with this key
+ * @param $time the time of validity of the file
+ * @param $ip uploader's ip
+ * @param $crypt boolean asking to crypt or not
+ * @param $link_name_length size of the link name
+ * @returns an array containing some information
+ *   'error' => information on possible errors
+ *   'link' => the link name of the uploaded file
+ *   'delete_link' => the link code to delete file
+ */
+function jirafeau_copy_local_file($local_file_path, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method) {
+    
+    if (!file_exists($local_file_path)) {
+        return (array(
+            'error' =>
+              array('has_error' => true,
+                     'why' => t('INTERNAL_ERROR_FILE_NOT_EXIST')),
+            'link' =>'',
+            'delete_link' => ''));
+    }
+    if(
+        // sanity check if file can be opened
+        $file = fopen($local_file_path, "r")
+    )
+    {
+        // close file pointer - it's not needed here
+        fclose($file);
+        $time_in_int = jirafeau_datestr_to_int($time);
+        return jirafeau_add_file(
+            jirafeau_create_file_array($local_file_path),
+            $one_time_download,
+            $key,
+            $time_in_int,
+            $ip,
+            $crypt,
+            $link_name_length,
+            $file_hash_method,
+            false
+        );
+    }
+    else {
+        return (array(
+            'error' =>
+              array('has_error' => true,
+                     'why' => t('INTERNAL_ERROR_FP_OPEN_LOCAL')),
+            'link' =>'',
+            'delete_link' => ''));
+    }
+    
+}
+
+
+function jirafeau_create_file_array($file_path) {
+    return 
+    [
+       'type' => mime_content_type($file_path),
+       'tmp_name' => $file_path,
+       'name' => basename($file_path),
+       'size' => filesize($file_path),
+    ];
+}

patrick-canterino.de