]> git.p6c8.net - jirafeau_mojo42.git/commitdiff
Fixes #7 Jirafeau can now limit file size
authorJerome Jutteau <mojo@couak.net>
Thu, 12 Mar 2015 19:16:34 +0000 (20:16 +0100)
committerJerome Jutteau <mojo@couak.net>
Thu, 12 Mar 2015 19:16:34 +0000 (20:16 +0100)
- Can limit file size whatever upload method is used
- Add a <div> for error handling
- Fix courgette style

index.php
lib/config.original.php
lib/functions.js
lib/functions.php
lib/lang/fr.php
media/courgette/style.css.php
script.php

index 8c2898aad67bcdebe4c87dec5bbbb8c1c6a53386..36ef29ee537c2b9b9776b8016956878090d02dbe 100644 (file)
--- a/index.php
+++ b/index.php
@@ -141,6 +141,9 @@ if (jirafeau_has_upload_password ($cfg))
     </p>
 </div>
 
+<div id="error_pop" class="error">
+</div>
+
 <div id="upload">
 <fieldset>
     <legend>
@@ -148,12 +151,9 @@ if (jirafeau_has_upload_password ($cfg))
     </legend>
     <p>
     <input type="file" id="file_select" size="30"
-    onchange="
-        document.getElementById('options').style.display = '';
-        document.getElementById('send').style.display = '';
-    "/>
+    onchange="control_selected_file_size(<?php echo $cfg['maximal_upload_size'] ?>, '<?php echo t ('File is too big') . ', ' . t ('File size is limited to') . " " . $cfg['maximal_upload_size'] . " MB"; ?>')"/>
     </p>
-    
+
     <div id="options">
         <table id="option_table">
         <tr>
@@ -190,6 +190,15 @@ if (jirafeau_has_upload_password ($cfg))
         <?php } ?>
         </select></td>
         </tr>
+
+        <?php
+        if ($cfg['maximal_upload_size'] > 0)
+        {
+        echo '<p class="config">' . t ('File size is limited to');
+        echo " " . $cfg['maximal_upload_size'] . " MB</p>";
+        }
+        ?>
+
                <p id="max_file_size" class="config"></p>
     <p>
     <?php
@@ -231,6 +240,7 @@ if (jirafeau_has_upload_password ($cfg))
 </div>
 
 <script lang="Javascript">
+    document.getElementById('error_pop').style.display = 'none';
     document.getElementById('uploading').style.display = 'none';
     document.getElementById('upload_finished').style.display = 'none';
     document.getElementById('options').style.display = 'none';
index fa0f03468baa37c6f8d645cbf1c4937939fea8b6..4e14155f8527ecea6fe7eef1f546d02f5d212f06 100644 (file)
@@ -80,6 +80,10 @@ $cfg['availabilities'] = array ('minute' => true,
                                 'month' => true,
                                 'year' => false,
                                 'none' => false);
+/* Set maximal upload size expressed in MB.
+ * 0 mean unlimited upload size.
+ */
+$cfg['maximal_upload_size'] = 0;
 /* Installation is done ? */
 $cfg['installation_done'] = false;
 
index e3800158e51241f291d2cb7d678599e6a4e885f2..f25ee6f586534e12a0ba9acc38482d950fd37572 100644 (file)
@@ -125,25 +125,52 @@ function upload_progress (e)
         show_upload_progression (p.toString() + '%');
 }
 
-function upload_failed (e)
+function control_selected_file_size(max_size, error_str)
 {
-    /* Todo: Considere showing a error div. */
-    alert ('Sorry, upload failed');
+    f_size = document.getElementById('file_select').files[0].size;
+    if (max_size > 0 && f_size > max_size * 1024 * 1024)
+    {
+        pop_failure(error_str);
+        document.getElementById('send').style.display = 'none';
+    }
+    else
+    {
+        document.getElementById('options').style.display = '';
+        document.getElementById('send').style.display = '';
+        document.getElementById('error_pop').style.display = 'none';
+    }
+}
+
+function pop_failure (e)
+{
+    var text = "An error occured";
+    if (typeof e !== 'undefined')
+        text = e;
+    text = "<p>" + text + "</p>";
+    document.getElementById('error_pop').innerHTML = e;
+
+    document.getElementById('uploading').style.display = 'none';
+    document.getElementById('error_pop').style.display = '';
+    document.getElementById('upload').style.display = '';
+    document.getElementById('send').style.display = '';
 }
 
 function classic_upload (url, file, time, password, one_time, upload_password)
 {
     var req = new XMLHttpRequest ();
     req.upload.addEventListener ("progress", upload_progress, false);
-    req.addEventListener ("error", upload_failed, false);
-    req.addEventListener ("abort", upload_failed, false);
+    req.addEventListener ("error", pop_failure, false);
+    req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
             if (res == "Error")
+            {
+                pop_failure ();
                 return;
+            }
             res = res.split ("\n");
             if (time != 'none')
             {
@@ -208,15 +235,18 @@ function async_upload_start (url, max_size, file, time, password, one_time, uplo
     async_global_time = time;
 
     var req = new XMLHttpRequest ();
-    req.addEventListener ("error", upload_failed, false);
-    req.addEventListener ("abort", upload_failed, false);
+    req.addEventListener ("error", pop_failure, false);
+    req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
             if (res == "Error")
+            {
+                pop_failure ();
                 return;
+            }
             res = res.split ("\n");
             async_global_ref = res[0];
             var code = res[1];
@@ -260,15 +290,18 @@ function async_upload_push (code)
     }
     var req = new XMLHttpRequest ();
     req.upload.addEventListener ("progress", async_upload_progress, false);
-    req.addEventListener ("error", upload_failed, false);
-    req.addEventListener ("abort", upload_failed, false);
+    req.addEventListener ("error", pop_failure, false);
+    req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
             if (res == "Error")
+            {
+                pop_failure ();
                 return;
+            }
             res = res.split ("\n");
             var code = res[0]
             async_global_transfered = async_global_transfering;
@@ -295,15 +328,18 @@ function async_upload_push (code)
 function async_upload_end (code)
 {
     var req = new XMLHttpRequest ();
-    req.addEventListener ("error", upload_failed, false);
-    req.addEventListener ("abort", upload_failed, false);
+    req.addEventListener ("error", pop_failure, false);
+    req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
             if (res == "Error")
+            {
+                pop_failure ();
                 return;
+            }
             res = res.split ("\n");
             if (async_global_time != 'none')
             {
index 3a304a427128031b05ca10d6f9cfe4d3e8d4d2a4..b98486f80fd4ed59888b1f086e2b78079d59f08f 100644 (file)
@@ -841,10 +841,11 @@ jirafeau_async_init ($filename, $type, $one_time, $key, $time, $ip)
   * @param $ref asynchronous upload reference
   * @param $file piece of data
   * @param $code client code for this operation
+  * @param $max_file_size maximum allowed file size
   * @return  a string containing a next code to use or the string "Error"
   */
 function
-jirafeau_async_push ($ref, $data, $code)
+jirafeau_async_push ($ref, $data, $code, $max_file_size)
 {
     /* Get async infos. */
     $a = jirafeau_get_async_ref ($ref);
@@ -858,9 +859,21 @@ jirafeau_async_push ($ref, $data, $code)
     
     $p = s2p ($ref);
 
+    /* File path. */
+    $r_path = $data['tmp_name'];
+    $w_path = VAR_ASYNC . $p . $ref . '_data';
+
+    /* Check that file size is not above upload limit. */
+    if ($max_file_size > 0 &&
+        filesize ($r_path) + filesize ($w_path) > $max_file_size * 1024 * 1024)
+    {
+        jirafeau_async_delete ($ref);
+        return "Error";
+    }
+
     /* Concatenate data. */
-    $r = fopen ($data['tmp_name'], 'r');
-    $w = fopen (VAR_ASYNC . $p . $ref . '_data', 'a');
+    $r = fopen ($r_path, 'r');
+    $w = fopen ($w_path, 'a');
     while (!feof ($r))
     {
         if (fwrite ($w, fread ($r, 1024)) === false)
@@ -873,7 +886,7 @@ jirafeau_async_push ($ref, $data, $code)
     }
     fclose ($r);
     fclose ($w);
-    unlink ($data['tmp_name']);
+    unlink ($r_path);
     
     /* Update async file. */
     $code = jirafeau_gen_random (4);
index 6b1472bfabac383782fac4be803c0757712fb9b8..8b66cb011a49cbbedbaab29ba847055c5ce8d8d4 100644 (file)
@@ -39,6 +39,8 @@ $tr = array (
              'One year' => 'Une année',
              'None' => 'Aucune',
              'Upload password' => 'Mot de passe',
+             'File is too big' => 'Le fichier est trop volumineux',
+             'File size is limited to' => 'La taille de fichier est limité à',
              'The file directory is not writable' => 'Le dossier \'file\' ne peut être écrit.',
              'The link directory is not writable' => 'Le dossier \'link\' ne peut être écrit.',
              'The async directory is not writable!' => 'Le dossier \'async\' ne peut être écrit.',
@@ -143,6 +145,8 @@ $tr = array (
             'This interface permits to script your uploads and downloads.' => 'Cette interface permet de programmer vos envoie et téléversements.',
             'The instructions above show how to query this interface.' => 'Les instructions ci-dessous montrent comment interroger cette interface.',
             'Get server capacity' => 'Récupérer la capacité d\'envoie du serveur',
+            'Maximal allowed size of an uploaded file' => 'Récupérer la taille maximal autorisée d\'un envoie de fichier',
+            'First line returns size (in MB).' => 'La première ligne correspond à la taille exprimée en MB.',
             'Get Jirafeau\'s version' => 'Récupérer la version de Jirafeau',
             'Send a GET query to' => 'Envoyez une requette GET à',
             'Send a POST query to' => 'Envoyez une requette POST à',
index e4812dc8baedd402bde79f4852ad659bdcc91e4a..d5baafeaede38bd65d5705fa88f151967b2bade8 100644 (file)
@@ -239,7 +239,9 @@ input[type="submit"]:focus {
 
 .message,
 .error {
+  color: #d55548;
   font-style: italic;
+  font-weight: bold;
 }
 
 /* ==========================================================================
index a3568ee961deebd0755b8df424bb265e9723c065..c7d847fc53f50a2fdc50dfc25a42a1adbf994dd3 100644 (file)
@@ -82,6 +82,19 @@ if ($_SERVER['REQUEST_METHOD'] == "GET" && count ($_GET) == 0)
     echo '<p>';
     echo t('Example') . ": <a href=\"" . $web_root . "script.php?get_capacity=1\">" . $web_root . "script.php?get_capacity=1</a> ";
     echo '</p>';
+
+    echo '<h3>' . t('Maximal allowed size of an uploaded file') . ':</h3>';
+    echo '<p>';
+    echo t('Send a GET query to') . ': <i>' . $web_root . 'script.php</i><br />';
+    echo '<br />';
+    echo t('Parameters') . ':<br />';
+    echo "<b>get_maximal_upload_size=</b>1<i> (" . t('Required') . ")</i> <br />";
+    echo '</p>';
+    echo '<p>' . t('This will return brut text content.') . ' ' .
+            t('First line returns size (in MB).') . '<br /></p>';
+    echo '<p>';
+    echo t('Example') . ": <a href=\"" . $web_root . "script.php?get_maximal_upload_size=1\">" . $web_root . "script.php?get_maximal_upload_size=1</a> ";
+    echo '</p>';
     
     echo '<h3>' . t('Upload a file') . ':</h3>';
     echo '<p>';
@@ -248,6 +261,15 @@ if (isset ($_FILES['file']) && is_writable (VAR_FILES)
                 $time = JIRAFEAU_INFINITY;
                 break;
         }
+
+    // Check file size
+    if ($cfg['maximal_upload_size'] > 0 &&
+        $_FILES['file']['size'] > $cfg['maximal_upload_size'] * 1024 * 1024)
+    {
+        echo "Error";
+        exit;
+    }
+
     $res = jirafeau_upload ($_FILES['file'],
                             isset ($_POST['one_time_download']),
                             $key, $time, $_SERVER['REMOTE_ADDR'],
@@ -336,6 +358,10 @@ elseif (isset ($_GET['get_capacity']))
     echo min (jirafeau_ini_to_bytes (ini_get ('post_max_size')),
               jirafeau_ini_to_bytes (ini_get ('upload_max_filesize')));
 }
+elseif (isset ($_GET['get_maximal_upload_size']))
+{
+    echo $cfg['maximal_upload_size'];
+}
 elseif (isset ($_GET['get_version']))
 {
     echo JIRAFEAU_VERSION;
@@ -547,7 +573,12 @@ elseif (isset ($_GET['push_async']))
         || (!isset ($_POST['code'])))
         echo "Error";
     else
-        echo jirafeau_async_push ($_POST['ref'], $_FILES['data'], $_POST['code']);                                      
+    {
+        echo jirafeau_async_push ($_POST['ref'],
+                                  $_FILES['data'],
+                                  $_POST['code'],
+                                  $cfg['maximal_upload_size']);
+    }
 }
 /* Finalize an asynchronous upload. */
 elseif (isset ($_GET['end_async']))

patrick-canterino.de