Changeset 55332 in spip-zone


Ignore:
Timestamp:
Dec 10, 2011, 12:17:11 PM (9 years ago)
Author:
cedric@…
Message:

"Merci mille fois au travail merveilleux de kent1" :
Integration du support du format tar.gz & tgz pour les archives que l'on sait deballer
Generalisation de la detection du format de l'archive par son head+filename
Il faut faire attention aux faux cas .gz qui peuvent cacher un .tar.gz ou un .tgz (mime type incorrect)

Location:
_plugins_/svp
Files:
1 added
2 edited
2 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/svp/teleporter/http.php

    r55323 r55332  
    2828
    2929        list($fichier,$extension) = $res;
    30         if (!$deballe = charger_fonction("http_deballe_$extension","teleporter",true))
     30        if (!$deballe = charger_fonction("http_deballe_".preg_replace(",\W,","_",$extension),"teleporter",true))
    3131                return _T('svp:erreur_teleporter_format_archive_non_supporte',array('extension' => $extension));
    3232
     
    7373        $head = recuperer_page($source, false, true, 0);
    7474
    75         if (preg_match(",^Content-Type:\s*application/zip$,Uims",$head))
    76                 $extension = "zip";
    77         elseif (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims",$head,$m)){
    78                 $f = $m[1];
    79                 if (pathinfo($f, PATHINFO_EXTENSION)=="zip"){
    80                         $extension = "zip";
     75        if (preg_match(",^Content-Type:\s*?(.*)$,Uims",$head,$m)
     76                AND include_spip('base/typedoc')){
     77                $mime = $m[1];
     78                // passer du mime a l'extension !
     79                if ($e = array_search($mime,$GLOBALS['tables_mime']))
     80                        $extension = $e;
     81        }
     82
     83        if (!$extension
     84          // cas des extensions incertaines car mime-type ambigu
     85          OR in_array($extension,array('bin','gz'))){
     86                if (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)['\"]?$,Uims",$head,$m)
     87                  AND $e=teleporter_http_extension($m[1])){
     88                        $extension = $e;
     89                }
     90                // au cas ou, si le content-type n'est pas la
     91                // mais que l'extension est explicite
     92                else{
     93                        $extension = teleporter_http_extension($source);
    8194                }
    8295        }
    83         // au cas ou, si le content-type n'est pas la
    84         // mais que l'extension est explicite
    85         elseif(pathinfo($source, PATHINFO_EXTENSION)=="zip")
    86                 $extension = "zip";
    8796
    8897        # format de fichier inconnu
     
    104113        return array($dest_tmp,$extension);
    105114}
     115
     116function teleporter_http_extension($file){
     117        $e = pathinfo($file, PATHINFO_EXTENSION);
     118
     119        // cas particuliers : redresser .tar.gz
     120        if ($e=='gz'
     121                AND preg_match(',tar\.gz,i',$file))
     122                $e = 'tgz';
     123
     124        return $e;
     125}
     126
     127function http_deballe_recherche_racine($list){
     128        // on cherche la plus longue racine commune a tous les fichiers
     129        // pour l'enlever au deballage
     130        $max_n = 999999;
     131        $paths = array();
     132        foreach($list as $n) {
     133                $p = array();
     134                foreach(explode('/', $n['filename']) as $n => $x) {
     135                        if ($n>$max_n)
     136                                continue;
     137                        $sofar = join('/',$p);
     138                        $paths[$n][$sofar]++;
     139                        $p[] = $x;
     140                }
     141                $max_n = min($n,$max_n);
     142        }
     143
     144        $total = $paths[0][''];
     145        $i = 0;
     146        while (isset($paths[$i])
     147        AND count($paths[$i]) <= 1
     148        AND array_values($paths[$i]) == array($total))
     149                $i++;
     150
     151        $racine = $i
     152                ? array_pop(array_keys($paths[$i-1])).'/'
     153                : '';
     154
     155        return $racine;
     156}
  • _plugins_/svp/teleporter/http_deballe_zip.php

    r55323 r55332  
    1111 * en utilisant le dossier temporaire $tmp si besoin
    1212 *
    13  * @param string $zip
     13 * @param string $archive
    1414 * @param string $dest
    1515 * @param string $tmp
    1616 * @return bool|string
    1717 */
    18 function teleporter_http_deballe_zip_dist($zip, $dest, $tmp){
     18function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){
    1919        $status = teleporter_http_charger_zip(
    2020                array(
    21                         'zip' => $zip, // normalement l'url source mais on l'a pas ici
    22                         'fichier' => $zip,
     21                        'archive' => $archive, // normalement l'url source mais on l'a pas ici
     22                        'fichier' => $archive,
    2323                        'dest' => $dest,
    2424                        'tmp' => $tmp,
     
    3434        // fichier absent
    3535        else if ($status == -1) {
    36                 spip_log("dezip de $zip impossible : fichier absent","teleport"._LOG_ERREUR);
     36                spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR);
    3737                return false;
    3838        }
    3939        // fichier la mais pas bien dezippe
    4040        else {
    41                 spip_log("probleme lors du dezip de $zip","teleport"._LOG_ERREUR);
     41                spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR);
    4242                return false;
    4343        }
     
    7373        $list = $zip->listContent();
    7474
    75         // on cherche la plus longue racine commune a tous les fichiers
    76         // pour l'enlever au deballage
    77         $max_n = 999999;
    78         $paths = array();
    79         foreach($list as $n) {
    80                 $p = array();
    81                 foreach(explode('/', $n['filename']) as $n => $x) {
    82                         if ($n>$max_n)
    83                                 continue;
    84                         $sofar = join('/',$p);
    85                         $paths[$n][$sofar]++;
    86                         $p[] = $x;
    87                 }
    88                 $max_n = min($n,$max_n);
    89         }
    90 
    91         $total = $paths[0][''];
    92         $i = 0;
    93         while (isset($paths[$i])
    94         AND count($paths[$i]) <= 1
    95         AND array_values($paths[$i]) == array($total))
    96                 $i++;
    97 
    98         $racine = $i
    99                 ? array_pop(array_keys($paths[$i-1])).'/'
    100                 : '';
    101 
     75        $racine = http_deballe_recherche_racine($list);
    10276        $quoi['remove'] = $racine;
    10377
     
    132106        );
    133107        if ($zip->error_code < 0) {
    134                 spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['zip'],"teleport"._LOG_ERREUR);
     108                spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
    135109                return //$zip->error_code
    136110                        $zip->errorName(true);
    137111        }
    138112
    139         spip_log('charger_decompresser OK pour paquet: ' . $quoi['zip'],"teleport");
     113        spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport");
    140114
    141115        $size = $compressed_size = 0;
     
    152126                "installation: charger_plugin\n"
    153127                ."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n"
    154                 ."source: ".$quoi['zip']."\n"
     128                ."source: ".$quoi['archive']."\n"
    155129        );
    156130
Note: See TracChangeset for help on using the changeset viewer.