]> git.p6c8.net - jirafeau_project.git/commitdiff
Merge branch 'next-release' into 'f_modularization_wip_rebased'
authorBlackeye <14815724-Blackstareye@users.noreply.gitlab.com>
Mon, 19 Aug 2024 12:35:12 +0000 (12:35 +0000)
committerBlackeye <14815724-Blackstareye@users.noreply.gitlab.com>
Mon, 19 Aug 2024 12:35:12 +0000 (12:35 +0000)
# Conflicts:
#   index.php

1  2 
README.md
index.php
lib/functions.php
script.php

diff --combined README.md
index a5b235256bb4c9a4ce410e286d9f6ef188490487,4fff851c3272262e57ff870646e6feb43e9c3973..f343ed9257a37ecf3a357c0dddd97d6233e0ac06
+++ b/README.md
@@@ -63,7 -63,7 +63,7 @@@ Jirafeau project won't evolve to a fil
  ## Installation
  
  This shows how to install Jirafeau by your own, it's quite simple but you can
- also use a [docker image](https://hub.docker.com/r/mojo42/jirafeau/) or build
+ also use a [docker image](https://gitlab.com/jirafeau/Jirafeau/container_registry/) or build
  it yourself. Check [docker folder](docker/README.md) for more informations.
  
  System requirements:
@@@ -311,6 -311,4 +311,6 @@@ Feel free to create an [issue](https://
  
  ### Can I buy you a coffee?
  
 -You can [drop few bucks for Jérôme Jutteau](https://www.paypal.com/paypalme/jeromejutteau).
 +You can [drop few bucks for Jérôme Jutteau](https://www.paypal.com/paypalme/jeromejutteau)
 +
 +Many Thanks <3
diff --combined index.php
index fd8586da143790b67efba663db37c34784c29153,b7e2606930e5207e914d6cae4cbb4979cc58478a..43bb81dddc8c1114a8fa5d99168e43110f152a5b
+++ b/index.php
@@@ -25,7 -25,7 +25,7 @@@ require(JIRAFEAU_ROOT . 'lib/settings.p
  require(JIRAFEAU_ROOT . 'lib/functions.php');
  require(JIRAFEAU_ROOT . 'lib/lang.php');
  
- if ($cfg['download_password_requirement'] === "generated"){
+ if ($cfg['download_password_requirement'] === "generated") {
      $download_pass = jirafeau_gen_download_pass($cfg['download_password_gen_len'], $cfg['download_password_gen_chars']);
  }
  
@@@ -101,8 -101,70 +101,8 @@@ elseif (true === jirafeau_challenge_upl
  }
  
  ?>
 -<div id="upload_finished">
 -    <p><?php echo t('FILE_UP') ?></p>
  
 -    <div id="upload_finished_download_page">
 -    <p>
 -        <a id="upload_link" href=""><?php echo t('DL_PAGE') ?></a>
 -        <a id="upload_link_email" href=""><img id="upload_image_email"/></a>
 -    </p><p>
 -        <code id=upload_link_text></code>
 -        <button id="upload_link_button">&#128203;</button>
 -    </p>
 -    </div>
 -
 -    <?php if ($cfg['download_password_requirement'] === "generated") {
 -        ?>
 -    <div id="show_password">
 -    <p><?php echo t('PSW') ?></p>
 -
 -    <div id="download_password">
 -    <p>
 -        <?php echo '<input id="output_key" value="' . $download_pass . '"/>'?>
 -        <button id="password_copy_button">&#128203;</button>
 -    </p>
 -    </div>
 -    </div>
 -    <?php
 -    }?>
 -
 -    <?php if ($cfg['preview'] == true) {
 -        ?>
 -    <div id="upload_finished_preview">
 -    <p>
 -        <a id="preview_link" href=""><?php echo t('VIEW_LINK') ?></a>
 -    </p><p>
 -        <code id=preview_link_text></code>
 -        <button id="preview_link_button">&#128203;</button>
 -    </p>
 -    </div>
 -    <?php
 -    } ?>
 -
 -    <div id="upload_direct_download">
 -    <p>
 -        <a id="direct_link" href=""><?php echo t('DIRECT_DL') ?></a>
 -    </p><p>
 -        <code id=direct_link_text></code>
 -        <button id="direct_link_button">&#128203;</button>
 -    </p>
 -    </div>
 -
 -    <div id="upload_delete">
 -    <p>
 -        <a id="delete_link" href=""><?php echo t('DELETE_LINK') ?></a>
 -    </p><p>
 -        <code id=delete_link_text></code>
 -        <button id="delete_link_button">&#128203;</button>
 -    </p>
 -    </div>
 -
 -    <div id="upload_validity">
 -    <p><?php echo t('VALID_UNTIL'); ?>:</p>
 -    <p id="date"></p>
 -    </div>
 -</div>
 +<?php jirafeau_create_upload_finished_box($cfg['preview']); ?>
  
  <div id="uploading">
      <p>
  
              echo ' /></td></tr>';
          }
-         if ($cfg['download_password_requirement'] === 'generated'){
+         if ($cfg['download_password_requirement'] === 'generated') {
              echo '<input type="hidden" name="key" id="input_key" value="' . $download_pass .'"/>';
-         }else{
+         } else {
              echo '<tr><td><label for="input_key">' . t('PSW') . ':' . '</label></td>';
              echo '<td><input type="password" name="key" id="input_key" autocomplete = "new-password"';
-             if ($cfg['download_password_policy'] === 'regex'){
+             if ($cfg['download_password_policy'] === 'regex') {
                  echo ' pattern="' . substr($cfg['download_password_policy_regex'], 1, strlen($cfg['download_password_policy_regex']) - 2) . '"'; //remove php delimiters
              }
-             if ($cfg['download_password_requirement'] === 'required'){
+             if ($cfg['download_password_requirement'] === 'required') {
                  echo ' required';
              }
              echo '/></td></tr>';
          }?>
          <tr>
          <td><label for="select_time"><?php echo t('TIME_LIM') . ':'; ?></label></td>
 -        <td><select name="time" id="select_time">
 -        <?php
 -$expirationTimeOptions = array(
 -  array(
 -    'value' => 'minute',
 -    'label' => '1_MIN'
 -  ),
 -  array(
 -    'value' => 'hour',
 -    'label' => '1_H'
 -  ),
 -  array(
 -    'value' => 'day',
 -    'label' => '1_D'
 -  ),
 -  array(
 -    'value' => 'week',
 -    'label' => '1_W'
 -  ),
 -  array(
 -      'value' => 'fortnight',
 -      'label' => '2_W'
 -  ),
 -  array(
 -    'value' => 'month',
 -    'label' => '1_M'
 -  ),
 -  array(
 -    'value' => 'quarter',
 -    'label' => '1_Q'
 -  ),
 -  array(
 -    'value' => 'year',
 -    'label' => '1_Y'
 -  ),
 -  array(
 -    'value' => 'none',
 -    'label' => 'NONE'
 -  )
 -);
 -foreach ($expirationTimeOptions as $expirationTimeOption) {
 -    $selected = ($expirationTimeOption['value'] === $cfg['availability_default'])? 'selected="selected"' : '';
 -    if (true === $cfg['availabilities'][$expirationTimeOption['value']]) {
 -        echo '<option value="' . $expirationTimeOption['value'] . '" ' .
 -              $selected . '>' . t($expirationTimeOption['label']) . '</option>';
 -    }
 -}
 -?>
 -        </select></td>
 +        <td>
 +            <?php jirafeau_create_selection_array($cfg); ?> 
 +        </td>
          </tr>
  
          <?php
diff --combined lib/functions.php
index 8a82b2abfeaf8ced7cc69927c366154ec8639d81,4736b7f35b2d1b3d9454f631f26e28b824cfadeb..4991f23b0906edb59c3591d68056b3ef8bd050a6
@@@ -143,7 -143,6 +143,6 @@@ function jirafeau_human_size($octets
  // Convert UTC timestamp to a datetime field
  function jirafeau_get_datetimefield($timestamp)
  {
      $ts = date_create("@" . $timestamp);
      $content = '<span class="datetime" data-datetime="' . date_format($ts, 'Y-m-d H:i') . '">'
          . date_format($ts, 'Y-m-d H:i') . ' (GMT)</span>';
@@@ -447,62 -446,25 +446,62 @@@ function jirafeau_upload($file, $one_ti
                   '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']));
      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) {
          $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);
                    '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
@@@ -745,79 -672,103 +744,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)) {
 +    $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;
                  }
 -                $ld = jirafeau_get_download_stats($node);
 -
 -                /* Filter. */
 -                if (!empty($name) && !@preg_match("/$name/i", jirafeau_escape($l['file_name']))) {
 -                    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>';
                  }
 -                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 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);
  }
  
  /**
@@@ -1058,8 -1009,8 +1057,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);
@@@ -1287,7 -1238,7 +1286,7 @@@ function jirafeau_encrypt_file($fp_src
          $enc = sodium_crypto_secretstream_xchacha20poly1305_push($crypt_state, $to_enc);
  
          if (fwrite($w, $enc) === false) {
-            return '';
+             return '';
          }
      }
  
@@@ -1768,229 -1719,3 +1767,229 @@@ function jirafeau_write_download_stats(
      fwrite($handle, $count . NL . time() . NL . $ip);
      fclose($handle);
  }
 +
 +function jirafeau_create_upload_finished_box($preview = true) {
 +    ?>
 +
 +    <div id="upload_finished">
 +    <p><?php echo t('FILE_UP') ?></p>
 +
 +    <div id="upload_finished_download_page">
 +    <p>
 +        <a id="upload_link" href=""><?php echo t('DL_PAGE') ?></a>
 +        <a id="upload_link_email" href=""><img id="upload_image_email"/></a>
 +    </p><p>
 +        <code id=upload_link_text></code>
 +        <button id="upload_link_button">&#128203;</button>
 +    </p>
 +    </div>
 +
 +    <?php if ($preview == true) {
 +    ?>
 +    <div id="upload_finished_preview">
 +    <p>
 +        <a id="preview_link" href=""><?php echo t('VIEW_LINK') ?></a>
 +    </p><p>
 +        <code id=preview_link_text></code>
 +        <button id="preview_link_button">&#128203;</button>
 +    </p>
 +    </div>
 +    <?php
 +} ?>
 +
 +    <div id="upload_direct_download">
 +    <p>
 +        <a id="direct_link" href=""><?php echo t('DIRECT_DL') ?></a>
 +    </p><p>
 +        <code id=direct_link_text></code>
 +        <button id="direct_link_button">&#128203;</button>
 +    </p>
 +    </div>
 +
 +    <div id="upload_delete">
 +    <p>
 +        <a id="delete_link" href=""><?php echo t('DELETE_LINK') ?></a>
 +    </p><p>
 +        <code id=delete_link_text></code>
 +        <button id="delete_link_button">&#128203;</button>
 +    </p>
 +    </div>
 +
 +    <div id="upload_validity">
 +    <p><?php echo t('VALID_UNTIL'); ?>:</p>
 +    <p id="date"></p>
 +    </div>
 +</div>
 +<?php 
 +}
 +
 +function jirafeau_get_expiration_time_options() {
 +    return 
 +    array(
 +        array(
 +          'value' => 'minute',
 +          'label' => '1_MIN'
 +        ),
 +        array(
 +          'value' => 'hour',
 +          'label' => '1_H'
 +        ),
 +        array(
 +          'value' => 'day',
 +          'label' => '1_D'
 +        ),
 +        array(
 +          'value' => 'week',
 +          'label' => '1_W'
 +        ),
 +        array(
 +            'value' => 'fortnight',
 +            'label' => '2_W'
 +        ),
 +        array(
 +          'value' => 'month',
 +          'label' => '1_M'
 +        ),
 +        array(
 +          'value' => 'quarter',
 +          'label' => '1_Q'
 +        ),
 +        array(
 +          'value' => 'year',
 +          'label' => '1_Y'
 +        ),
 +        array(
 +          'value' => 'none',
 +          'label' => 'NONE'
 +        )
 +      );
 +}
 +
 +
 +
 + /**
 +  * 
 +  * creates the time selection field
 +  * @param mixed $cfg 
 +  * @return void 
 +  */
 +  function jirafeau_create_selection_array($cfg) {
 +    echo 
 +    '<select name="time" id="select_time">';
 +        
 +        
 +        $expirationTimeOptions = jirafeau_get_expiration_time_options();
 +
 +        foreach ($expirationTimeOptions as $expirationTimeOption) {
 +            $selected = ($expirationTimeOption['value'] === $cfg['availability_default'])? 'selected="selected"' : '';
 +            if (true === $cfg['availabilities'][$expirationTimeOption['value']]) {
 +                echo '<option value="' . $expirationTimeOption['value'] . '" ' .
 +              $selected . '>' . t($expirationTimeOption['label']) . '</option>';
 +            }
 +        }
 +        echo '</select>';
 + }
 +
 + function jirafeau_datestr_to_int ($time_str) {
 +    $time = time();
 +    switch ($time_str) {
 +        case 'minute':
 +            $time += JIRAFEAU_MINUTE;
 +            break;
 +        case 'hour':
 +            $time += JIRAFEAU_HOUR;
 +            break;
 +        case 'day':
 +            $time += JIRAFEAU_DAY;
 +            break;
 +        case 'week':
 +            $time += JIRAFEAU_WEEK;
 +            break;
 +        case 'fortnight':
 +            $time += JIRAFEAU_FORTNIGHT;
 +            break;
 +        case 'month':
 +            $time += JIRAFEAU_MONTH;
 +            break;
 +        case 'quarter':
 +            $time += JIRAFEAU_QUARTER;
 +            break;
 +        case 'year':
 +            $time += JIRAFEAU_YEAR;
 +            break;
 +       default:
 +            $time = JIRAFEAU_INFINITY;
 +            break;
 +    }
 +    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),
 +    ];
 +}
diff --combined script.php
index 95888b5f7a0e80d266844bc049ae9edfcd642dc1,8ebcce325fd078b50ada64535c7adc372c9f1285..6ef117ed13ee5c0a9c1b5417e7ef3a99a5326fee
@@@ -81,22 -81,51 +81,22 @@@ if (isset($_FILES['file']) && is_writab
      $key = '';
      if (isset($_POST['key'])) {
          $key = $_POST['key'];
-         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
-             if (!preg_match($cfg['download_password_policy_regex'], $key)){
+         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+             if (!preg_match($cfg['download_password_policy_regex'], $key)) {
                  echo 'Error 14: The download password is not complying to the security standards.';
                  exit;
              }
          }
-     }elseif ($cfg['download_password_requirement'] !== 'optional'){
+     } elseif ($cfg['download_password_requirement'] !== 'optional') {
          echo 'Error 13: The parameter password is required.';
          exit;
      }
  
 -    $time = time();
      if (!isset($_POST['time']) || !$cfg['availabilities'][$_POST['time']]) {
          echo 'Error 4: The parameter time is invalid.';
          exit;
      } else {
 -        switch ($_POST['time']) {
 -            case 'minute':
 -                $time += JIRAFEAU_MINUTE;
 -                break;
 -            case 'hour':
 -                $time += JIRAFEAU_HOUR;
 -                break;
 -            case 'day':
 -                $time += JIRAFEAU_DAY;
 -                break;
 -            case 'week':
 -                $time += JIRAFEAU_WEEK;
 -                break;
 -            case 'fortnight':
 -                $time += JIRAFEAU_FORTNIGHT;
 -                break;
 -            case 'month':
 -                $time += JIRAFEAU_MONTH;
 -                break;
 -            case 'quarter':
 -                $time += JIRAFEAU_QUARTER;
 -                break;
 -            case 'year':
 -                $time += JIRAFEAU_YEAR;
 -                break;
 -            default:
 -                $time = JIRAFEAU_INFINITY;
 -                break;
 -        }
 +        $time = jirafeau_datestr_to_int($_POST['time']);
      }
  
      // Check file size
      $key = '';
      if (isset($_POST['key'])) {
          $key = $_POST['key'];
-         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
-             if (!preg_match($cfg['download_password_policy_regex'], $key)){
+         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+             if (!preg_match($cfg['download_password_policy_regex'], $key)) {
                  echo 'Error 14: The download password is not complying to the security standards.';
                  exit;
              }
          }
-     }elseif ($cfg['download_password_requirement'] !== 'optional'){
+     } elseif ($cfg['download_password_requirement'] !== 'optional') {
          echo 'Error 13: The parameter password is required.';
          exit;
      }
@@@ -422,13 -451,13 +422,13 @@@ elseif (isset($_GET['init_async'])) 
      $key = '';
      if (isset($_POST['key'])) {
          $key = $_POST['key'];
-         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
-             if (!preg_match($cfg['download_password_policy_regex'], $key)){
+         if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+             if (!preg_match($cfg['download_password_policy_regex'], $key)) {
                  echo 'Error 14: The download password is not complying to the security standards.';
                  exit;
              }
          }
-     }elseif ($cfg['download_password_requirement'] !== 'optional'){
+     } elseif ($cfg['download_password_requirement'] !== 'optional') {
          echo 'Error 13: The parameter password is required.';
          exit;
      }
          exit;
      }
  
 -    $time = time();
      if (!isset($_POST['time']) || !$cfg['availabilities'][$_POST['time']]) {
          echo 'Error 22';
          exit;
      } else {
 -        switch ($_POST['time']) {
 -            case 'minute':
 -                $time += JIRAFEAU_MINUTE;
 -                break;
 -            case 'hour':
 -                $time += JIRAFEAU_HOUR;
 -                break;
 -            case 'day':
 -                $time += JIRAFEAU_DAY;
 -                break;
 -            case 'week':
 -                $time += JIRAFEAU_WEEK;
 -                break;
 -            case 'fortnight':
 -                $time += JIRAFEAU_FORTNIGHT;
 -                break;
 -            case 'month':
 -                $time += JIRAFEAU_MONTH;
 -                break;
 -            case 'quarter':
 -                $time += JIRAFEAU_QUARTER;
 -                break;
 -            case 'year':
 -                $time += JIRAFEAU_YEAR;
 -                break;
 -            default:
 -                $time = JIRAFEAU_INFINITY;
 -                break;
 -        }
 +        $time = jirafeau_datestr_to_int($_POST['time']);
      }
  
      if ($cfg['store_uploader_ip']) {

patrick-canterino.de