* 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__) . '/../');
}
}
+// 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
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)
'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
}
/**
- * 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);
}
/**
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);
}
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),
+ ];
+}