require(JIRAFEAU_ROOT . 'lib/settings.php');
require(JIRAFEAU_ROOT . 'lib/functions.php');
require(JIRAFEAU_ROOT . 'lib/lang.php');
+
?>
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
var web_root = "<?php echo $cfg['web_root']; ?>";
}
// Test if content can be previewed
- type = document.getElementById('file_select').files[0].type;
- if (type.indexOf("image") > -1 ||
- type.indexOf("audio") > -1 ||
- type.indexOf("text") > -1 ||
- type.indexOf("video") > -1)
- {
+ 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 = '';
- }
+ }
}
// Direct download link
}
}
+function XHRErrorHandler(e)
+{
+ var text = "${e.type}: ${e.loaded} bytes transferred"
+ console.log(text)
+}
+
function pop_failure (e)
{
- var text = "An error occured";
+ var text = "<p>An error occured";
if (typeof e !== 'undefined')
- text = e;
- text = "<p>" + text + "</p>";
+ text += ": " + e;
+ text += "</p>";
document.getElementById('error_pop').innerHTML = e;
document.getElementById('uploading').style.display = 'none';
d.setSeconds (d.getSeconds() + 604800);
return true;
}
+ if (time == 'fortnight')
+ {
+ d.setSeconds (d.getSeconds() + 1209600);
+ return true;
+ }
if (time == 'month')
{
d.setSeconds (d.getSeconds() + 2592000);
return false;
}
-function classic_upload (file, time, password, one_time, upload_password)
+function classic_upload (file, time, password, one_time)
{
// Delay time estimation init as we can't have file size
upload_time_estimation_init(0);
var req = new XMLHttpRequest ();
req.upload.addEventListener ("progress", upload_progress, false);
- req.addEventListener ("error", pop_failure, false);
- req.addEventListener ("abort", pop_failure, false);
+ req.addEventListener ("error", XHRErrorHandler, false);
+ req.addEventListener ("abort", XHRErrorHandler, false);
req.onreadystatechange = function ()
{
if (req.readyState == 4 && req.status == 200)
form.append ("key", password);
if (one_time)
form.append ("one_time_download", '1');
- if (upload_password.length > 0)
- form.append ("upload_password", upload_password);
-
req.send (form);
}
var async_global_transfering = 0;
var async_global_last_code;
-function async_upload_start (max_size, file, time, password, one_time, upload_password)
+function async_upload_start (max_size, file, time, password, one_time)
{
async_global_transfered = 0;
async_global_file = file;
async_global_time = time;
var req = new XMLHttpRequest ();
- req.addEventListener ("error", pop_failure, false);
- req.addEventListener ("abort", pop_failure, false);
+ req.addEventListener ("error", XHRErrorHandler, false);
+ req.addEventListener ("abort", XHRErrorHandler, false);
req.onreadystatechange = function ()
{
if (req.readyState == 4 && req.status == 200)
form.append ("key", password);
if (one_time)
form.append ("one_time_download", '1');
- if (upload_password.length > 0)
- form.append ("upload_password", upload_password);
// Start time estimation
upload_time_estimation_init(async_global_file.size);
}
var req = new XMLHttpRequest ();
req.upload.addEventListener ("progress", async_upload_progress, false);
- req.addEventListener ("error", pop_failure, false);
- req.addEventListener ("abort", pop_failure, false);
+ req.addEventListener ("error", XHRErrorHandler, false);
+ req.addEventListener ("abort", XHRErrorHandler, false);
req.onreadystatechange = function ()
{
if (req.readyState == 4)
{
var res = req.responseText;
- if (/^Error/.test(res))
+ // This error may be triggered when Jirafeau does not receive any file in POST.
+ // This may be due to bad php configuration where post_max_size is too low
+ // comparing to upload_max_filesize. Let's retry with lower file size.
+ if (res === "Error 23")
+ {
+ async_global_max_size = Math.max(1, async_global_max_size - 500);
+ async_upload_push (async_global_last_code);
+ return;
+ }
+ else if (/^Error/.test(res))
{
pop_failure (res);
return;
var code = res[0]
async_global_transfered = async_global_transfering;
async_upload_push (code);
+ return;
}
else
{
- if (req.status == 413) // Request Entity Too Large
- {
- // lower async_global_max_size and retry
- async_global_max_size = parseInt (async_global_max_size * 0.8);
- }
+ // lower async_global_max_size and retry
+ // This can occurs in several cases:
+ // - Request Entity Too Large (413) due to server bad configuration relative to PHP configuration
+ // - Server Error (500) which can happen when PHP's `max_execution_time` is too low comparared to sent size
+ async_global_max_size = Math.max(1, parseInt (async_global_max_size * 0.5));
async_upload_push (async_global_last_code);
+ return;
}
}
}
function async_upload_end (code)
{
var req = new XMLHttpRequest ();
- req.addEventListener ("error", pop_failure, false);
- req.addEventListener ("abort", pop_failure, false);
+ req.addEventListener ("error", XHRErrorHandler, false);
+ req.addEventListener ("abort", XHRErrorHandler, false);
req.onreadystatechange = function ()
{
if (req.readyState == 4 && req.status == 200)
req.send (form);
}
-function upload (max_size)
+function upload (max_chunk_size)
{
var one_time_checkbox = document.getElementById('one_time_download');
var one_time = one_time_checkbox !== null ? one_time_checkbox.checked : false;
if (check_html5_file_api ())
{
async_upload_start (
- max_size,
+ max_chunk_size,
document.getElementById('file_select').files[0],
document.getElementById('select_time').value,
document.getElementById('input_key').value,
- one_time,
- document.getElementById('upload_password').value
+ one_time
);
}
else
document.getElementById('file_select').files[0],
document.getElementById('select_time').value,
document.getElementById('input_key').value,
- one_time,
- document.getElementById('upload_password').value
+ one_time
);
}
}
// Let's compute the current speed
var d = new Date();
var speed = upload_time_estimation_moving_average_speed;
- if (d.getTime() - upload_time_estimation_transfered_date != 0)
+ if (d.getTime() - upload_time_estimation_transfered_date != 0) {
speed = (total_transfered_size - upload_time_estimation_transfered_size)
/ (d.getTime() - upload_time_estimation_transfered_date);
+ speed = Math.max(0, speed);
+ }
// Let's compute moving average speed on 30 values
var m = (upload_time_estimation_moving_average_speed * 29 + speed) / 30;
// Update global values
function upload_time_estimation_time()
{
// Estimate remaining time
- if (upload_time_estimation_moving_average_speed == 0)
+ if (upload_time_estimation_moving_average_speed <= 0)
return 0;
return (upload_time_estimation_total_size - upload_time_estimation_transfered_size)
/ upload_time_estimation_moving_average_speed;
copyLinkToClipboard(link_id);});
}
}
+
+function copyTextToClipboard(text_id){
+ var copyText = document.getElementById(text_id);
+ copyText.select();
+ copyText.setSelectionRange(0, 99999);
+ navigator.clipboard.writeText(copyText.value);
+}
+
+function addTextCopyListener(button_id, text_id) {
+ if(document.getElementById(button_id)){
+ document.getElementById(button_id)
+ .addEventListener("click", function() {
+ copyTextToClipboard(text_id);});
+ }
+}
+
+function set_dark_mode() {
+ let steel_sheet = "<?php echo 'media/' . $cfg['dark_style'] . '/style.css.php'; ?>";
+ let shortcut_icon = "<?php echo 'media/' . $cfg['dark_style'] . '/favicon.ico'; ?>";
+ document.getElementById('stylesheet').href = steel_sheet;
+ document.getElementById('shortcut_icon').href = steel_sheet;
+}
+
+function set_light_mode() {
+ let steel_sheet = "<?php echo 'media/' . $cfg['style'] . '/style.css.php'; ?>";
+ let shortcut_icon = "<?php echo 'media/' . $cfg['style'] . '/favicon.ico'; ?>";
+ document.getElementById('stylesheet').href = steel_sheet;
+ document.getElementById('shortcut_icon').href = steel_sheet;
+}
+
+function color_scheme_preferences() {
+
+ let dark_mode_steel_sheet = "<?php echo 'media/' . $cfg['dark_style'] . '/style.css.php'; ?>"
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ set_dark_mode();
+ } else {
+ set_light_mode();
+ }
+
+ // When user change its preference
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', lightMode => {
+ lightMode.matches ? set_dark_mode() : set_light_mode();
+ });
+}
+
// @license-end