X-Git-Url: https://git.p6c8.net/jirafeau.git/blobdiff_plain/2cca8753a5d894f285a3dfbbac7bb7f76baf3cf9..a45ef3c4a65a3ad0fe137989de85098441364962:/lib/functions.js.php
diff --git a/lib/functions.js.php b/lib/functions.js.php
index 1527d01..17c6d0b 100644
--- a/lib/functions.js.php
+++ b/lib/functions.js.php
@@ -18,12 +18,110 @@
* along with this program. If not, see
An error occured"; if (typeof e !== 'undefined') - text = e; - text = "
" + text + "
"; + text += ": " + e; + text += ""; document.getElementById('error_pop').innerHTML = e; document.getElementById('uploading').style.display = 'none'; @@ -314,6 +380,11 @@ function add_time_string_to_date(d, time) 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); @@ -332,15 +403,15 @@ function add_time_string_to_date(d, time) 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) @@ -385,9 +456,6 @@ function classic_upload (file, time, password, one_time, upload_password) 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); } @@ -404,7 +472,7 @@ var async_global_time; 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; @@ -412,8 +480,8 @@ function async_upload_start (max_size, file, time, password, one_time, upload_pa 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) @@ -443,8 +511,6 @@ function async_upload_start (max_size, file, time, password, one_time, upload_pa 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); @@ -484,8 +550,8 @@ function async_upload_push (code) } 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) @@ -494,7 +560,16 @@ function async_upload_push (code) { 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; @@ -504,15 +579,17 @@ function async_upload_push (code) 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; } } } @@ -535,8 +612,8 @@ function async_upload_push (code) 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) @@ -573,20 +650,18 @@ function async_upload_end (code) 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 () - && document.getElementById('file_select').files[0].size >= max_size) + 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 @@ -595,8 +670,7 @@ function upload (max_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 ); } } @@ -620,9 +694,11 @@ function upload_time_estimation_add(total_transfered_size) // 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 @@ -690,7 +766,7 @@ function milliseconds_to_time_string (milliseconds) 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; @@ -767,4 +843,49 @@ function addCopyListener(button_id, link_id) { 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 = ""; + let shortcut_icon = ""; + document.getElementById('stylesheet').href = steel_sheet; + document.getElementById('shortcut_icon').href = shortcut_icon; +} + +function set_light_mode() { + let steel_sheet = ""; + let shortcut_icon = ""; + document.getElementById('stylesheet').href = steel_sheet; + document.getElementById('shortcut_icon').href = shortcut_icon; +} + +function color_scheme_preferences() { + + let dark_mode_steel_sheet = "" + 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