X-Git-Url: https://git.p6c8.net/jirafeau_project.git/blobdiff_plain/b2186ae902b055a52ba879e232c799581a1c657c..6d6c111b80ad13201b7acd7c2f5b8fd6d160e11b:/lib/functions.js.php diff --git a/lib/functions.js.php b/lib/functions.js.php index 79d7c95..14fad1d 100644 --- a/lib/functions.js.php +++ b/lib/functions.js.php @@ -1,7 +1,7 @@ + * Copyright (C) 2015 Jerome Jutteau * Copyright (C) 2015 Nicola Spanti (RyDroid) * * This program is free software: you can redistribute it and/or modify @@ -19,21 +19,30 @@ */ header('Content-Type: text/javascript'); - define('JIRAFEAU_ROOT', dirname(__FILE__) . '/../'); 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 = ""; -function translate (expr) -{ - var lang_array = ; - if (lang_array.hasOwnProperty(expr)) - return lang_array[expr]; - return expr; +var lang_array = ; +var lang_array_fallback = ; + +function translate (expr) { + if (lang_array.hasOwnProperty(expr)) { + var e = lang_array[expr]; + if (!isEmpty(e)) + return e; + } + if (lang_array_fallback.hasOwnProperty(expr)) { + var e = lang_array_fallback[expr]; + if (!isEmpty(e)) + return e; + } + return "FIXME: " + expr; } function isEmpty(str) { @@ -136,11 +145,11 @@ function show_link (reference, delete_code, crypt_key, date) // Email link var filename = document.getElementById('file_select').files[0].name; - var b = encodeURIComponent("Download file \"" + filename + "\":") + "%0D"; - b += encodeURIComponent(web_root + download_link_href) + "%0D"; + var b = encodeURIComponent(" \"" + filename + "\":") + "%0D" + "%0A"; + b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A"; if (false == isEmpty(date)) { - b += "%0D" + encodeURIComponent("This file will be available until " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D"; + b += "%0D" + "%0A" + encodeURIComponent(": " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D" + "%0A"; document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename); } @@ -173,16 +182,17 @@ function show_link (reference, delete_code, crypt_key, date) } // 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 @@ -264,12 +274,18 @@ function control_selected_file_size(max_size, error_str) } } +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 = "

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'; @@ -307,17 +323,17 @@ function add_time_string_to_date(d, time) } if (time == 'month') { - d.setSeconds (d.getSeconds() + 2419200); + d.setSeconds (d.getSeconds() + 2592000); return true; } if (time == 'quarter') { - d.setSeconds (d.getSeconds() + 7257600); + d.setSeconds (d.getSeconds() + 7776000); return true; } if (time == 'year') { - d.setSeconds (d.getSeconds() + 29030400); + d.setSeconds (d.getSeconds() + 31536000); return true; } return false; @@ -330,8 +346,8 @@ function classic_upload (file, time, password, one_time, upload_password) 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) @@ -361,6 +377,10 @@ function classic_upload (file, time, password, one_time, upload_password) show_link (res[0], res[1], res[2], expiryDate); } + else + { + pop_failure (""); + } } req.open ("POST", 'script.php' , true); @@ -389,6 +409,7 @@ var async_global_ref = ''; var async_global_max_size = 0; 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) { @@ -398,8 +419,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) @@ -461,6 +482,7 @@ function async_upload_progress (e) function async_upload_push (code) { + async_global_last_code = code; if (async_global_transfered == async_global_file.size) { hide_upload_progression (); @@ -469,31 +491,53 @@ 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 && req.status == 200) + if (req.readyState == 4) { - var res = req.responseText; + if (req.status == 200) + { + 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; + } + + res = res.split ("\n"); + var code = res[0] + async_global_transfered = async_global_transfering; + async_upload_push (code); + return; + } + else { - pop_failure (res); + if (req.status == 413) // Request Entity Too Large + { + // lower async_global_max_size and retry + async_global_max_size = Math.max(1, parseInt (async_global_max_size * 0.8)); + } + async_upload_push (async_global_last_code); return; } - - res = res.split ("\n"); - var code = res[0] - async_global_transfered = async_global_transfering; - async_upload_push (code); } } req.open ("POST", 'script.php?push_async' , true); - var chunk_size = parseInt (async_global_max_size * 0.50); var start = async_global_transfered; - var end = start + chunk_size; + var end = start + async_global_max_size; if (end >= async_global_file.size) end = async_global_file.size; var blob = async_global_file.slice (start, end); @@ -509,8 +553,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) @@ -549,15 +593,16 @@ function async_upload_end (code) function upload (max_size) { - if (check_html5_file_api () - && document.getElementById('file_select').files[0].size >= max_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, document.getElementById('file_select').files[0], document.getElementById('select_time').value, document.getElementById('input_key').value, - document.getElementById('one_time_download').checked, + one_time, document.getElementById('upload_password').value ); } @@ -567,7 +612,7 @@ function upload (max_size) document.getElementById('file_select').files[0], document.getElementById('select_time').value, document.getElementById('input_key').value, - document.getElementById('one_time_download').checked, + one_time, document.getElementById('upload_password').value ); } @@ -612,17 +657,17 @@ function upload_time_estimation_speed_string() if (s <= 1000) { res = s.toString(); - scale = "Bit/s"; + scale = "B/s"; } else if (s < 1000000) { res = Math.floor(s/100) / 10; - scale = "KBit/s"; + scale = "KB/s"; } else { res = Math.floor(s/100000) / 10; - scale = "Mbit/s"; + scale = "MB/s"; } if (res == 0) return ''; @@ -632,38 +677,31 @@ function upload_time_estimation_speed_string() function milliseconds_to_time_string (milliseconds) { function numberEnding (number) { - var currentLanguage = ''; - - if(currentLanguage == 'de') { - return (number > 1) ? 'n' : ''; - } - else { - return (number > 1) ? 's' : ''; - } + return (number > 1) ? translate ('PLURAL_ENDING') : ''; } var temp = Math.floor(milliseconds / 1000); var years = Math.floor(temp / 31536000); if (years) { - return years + ' ' + translate ('year') + numberEnding(years); + return years + ' ' + translate ('YEAR') + numberEnding(years); } var days = Math.floor((temp %= 31536000) / 86400); if (days) { - return days + ' ' + translate ('day') + numberEnding(days); + return days + ' ' + translate ('DAY') + numberEnding(days); } var hours = Math.floor((temp %= 86400) / 3600); if (hours) { - return hours + ' ' + translate ('hour') + numberEnding(hours); + return hours + ' ' + translate ('HOUR') + numberEnding(hours); } var minutes = Math.floor((temp %= 3600) / 60); if (minutes) { - return minutes + ' ' + translate ('minute') + numberEnding(minutes); + return minutes + ' ' + translate ('MINUTE') + numberEnding(minutes); } var seconds = temp % 60; if (seconds) { - return seconds + ' ' + translate ('second') + numberEnding(seconds); + return seconds + ' ' + translate ('SECOND') + numberEnding(seconds); } - return translate ('less than a second'); + return translate ('LESS_1_SEC'); } function upload_time_estimation_time() @@ -740,7 +778,10 @@ function copyLinkToClipboard(link_id) { } function addCopyListener(button_id, link_id) { - document.getElementById(button_id) + if(document.getElementById(button_id)){ + document.getElementById(button_id) .addEventListener("click", function() { copyLinkToClipboard(link_id);}); + } } +// @license-end