X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Faction%2Fcharger_plugin.php;fp=www%2Fecrire%2Faction%2Fcharger_plugin.php;h=0d9891db9af88a904423113548f874bcce2e07a0;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/action/charger_plugin.php b/www/ecrire/action/charger_plugin.php new file mode 100644 index 0000000..0d9891d --- /dev/null +++ b/www/ecrire/action/charger_plugin.php @@ -0,0 +1,305 @@ + $c) + essaie_ajouter_liste_plugins($url); + } + elseif ($arg == 'supprimer_flux' AND $url = _request('supprimer_flux')) { + $syndic_plug = @unserialize($GLOBALS['meta']['syndic_plug']); + unset($syndic_plug[$url]); + ecrire_meta('syndic_plug', serialize($syndic_plug)); + } + elseif (in_array($arg,array('charger_zip','lib','plugins'))) { + // la verification que c'est bien un zip sera faite apres + $zip = _request('url_zip_plugin'); + } + elseif (strlen($arg)) { + // la verification que c'est bien un zip sera faite apres + $zip = $arg; + } + else { + // indetermine : c'est un zip ou une liste + $arg = 'charger_liste_ou_zip'; + $zip = _request('url_zip_plugin2'); + } + + # si premiere lecture, destination temporaire des fichiers + $tmp = sous_repertoire(_DIR_CACHE, 'chargeur'); + # on ne se contenten pas du basename qui peut etre un simple v1 + # exemple de l'url http://nodeload.github.com/kbjr/Git.php/zipball/v0.1.1-rc + + $fichier = (_request('fichier')? + _request('fichier') + :"h".substr(md5($zip),0,8)."-".basename($zip) + ); + # basename par securite notamment dans le cas ou $fichier viens de l'exterieur + $fichier = $tmp.basename($fichier); + $extension = ""; // a verifier + + # au second tour, le zip designe directement le fichier au lieu de l'url + # initiale + if (!file_exists($fichier)) { + # si on ne dispose pas encore du fichier + # verifier que le zip en est bien un (sans se fier a son extension) + # en chargeant son entete car l'url initiale peut etre une simple + # redirection et ne pas comporter d'extension .zip + include_spip('inc/distant'); + $head = recuperer_page($zip, false, true, 0); + + if (preg_match(",^Content-Type:\s*application/zip$,Uims",$head)) + $extension = "zip"; + elseif (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims",$head,$m)){ + $f = $m[1]; + if (pathinfo($f, PATHINFO_EXTENSION)=="zip"){ + $fichier = (_request('fichier')? + _request('fichier') + :"h".substr(md5($zip),0,8)."-".basename($f) + ); + $fichier = $tmp.basename($fichier); + $extension = "zip"; + } + } + // au cas ou, si le content-type n'est pas la + // mais que l'extension est explicite + elseif(pathinfo($zip, PATHINFO_EXTENSION)=="zip") + $extension = "zip"; + + # si ce n'est pas un zip dans un format connu, + # c'est sans doute une liste de plugins + # si on est dans le bon scenario + if (!$extension) { + if ($arg == 'charger_liste_ou_zip') { + essaie_ajouter_liste_plugins($zip); + } + } + } + else { + $extension = pathinfo($fichier, PATHINFO_EXTENSION); + if (!$extension) + $extension = pathinfo($zip, PATHINFO_EXTENSION); + } + # format de fichier inconnu + if (!$extension) { + spip_log("Extension inconnue pour le paquet $fichier venant de $zip"); + include_spip('inc/headers'); + redirige_url_ecrire('charger_plugin'); + } + + # Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes + # facons jamais pu venir ici avec toutes les securisations faites :^) + if (!_DIR_PLUGINS_AUTO) die('jamais'); + + # dispose-t-on du fichier ? + $status = null; + # forcer l'extension du fichier par securite + $fichier = $tmp.basename($fichier,".$extension").".$extension"; + if (!@file_exists($fichier)) { + include_spip('inc/distant'); + $contenu = recuperer_page($zip, $fichier, false,_COPIE_LOCALE_MAX_SIZE); + if (!$contenu) { + spip_log('charger_decompresser impossible de charger '.$zip); + $status = -1; + } + } + + if ($status === null) { + $status = chargeur_charger_zip( + array( + 'zip' => $zip, + 'arg' => $arg, + 'fichier' => $fichier, + 'tmp' => $tmp, + 'extract' => _request('extract') + ) + ); + if (_request('extract')) { + spip_unlink($fichier); + } + } + + // Vers quoi pointe le bouton "suite" + $suite = ''; + + // le fichier .zip est la et bien forme + if (is_array($status)) { + + // Reconnaitre un plugin par son fichier xml + $get_infos = charger_fonction('get_infos','plugins'); + $infos = $get_infos($status['tmpname'], true, ''); + if ($infos) { + $nom = $infos['nom']; + $image = $infos['icon']; + $description = $infos['description']; + $type = 'plugin'; + $dest = _DIR_PLUGINS_AUTO; + } else { + $type = 'lib'; + $dest = _DIR_RACINE.'lib/'; + } + + // Fixer son emplacement final + $status['dirname'] = $dest + . basename($status['tmpname']) . '/'; + + // repertoire parent accessible en ecriture ? + if (!@is_dir($dest) + OR !@is_writeable($dest)) { + $retour = _T("erreur"); + $texte = "

"._T('plugin_erreur_droit1',array('dest'=>$dest))."

" + . "

"._T('plugin_erreur_droit2').aide('install0')."

"; + } + else + + // C'est un plugin ? + if ($type == 'plugin') { + + $retour = typo($nom); + + // l'icone ne peut pas etre dans tmp/ (lecture http oblige) + // on la copie donc dans local/chargeur/ + if ($image) { + $dir = sous_repertoire(_DIR_VAR,'chargeur'); + @copy($status['tmpname'].'/'.$image, $image2 = $dir.basename($image)); + $retour = "" + . $retour; + } else + $retour = "" + . $retour; + + if (_request('extract')) { + $afficher = charger_fonction('afficher_plugin','plugins'); // pour plugin_propre + $texte = plugin_propre($description) + . '

'._T('plugin_zip_installe_finie',array('zip'=>$zip)).'

' + . "

"._T('plugin_zip_active')."

"; + } else { + $texte = '

'._T('plugin_zip_telecharge',array('zip'=>$zip)).'

'; + $texte .= liste_fichiers_pclzip($status); + $texte .= "

"._T('plugin_zip_installer')."

"; + $suite = 'plugins'; + } + } + + // C'est un paquet quelconque + else { + $retour = _T('plugin_charge_paquet',array('name' => basename($status['tmpname']))); + + if (_request('extract')) { + $texte = '

'._T('plugin_zip_installe_rep_finie', array('zip'=>$zip, 'rep'=>$status['dirname'])).'

'; + } else { + $texte = "

"._T('plugin_zip_telecharge',array('zip'=>$zip))."

\n"; + $texte .= liste_fichiers_pclzip($status); + $suite = 'lib'; + } + } + } + + // fichier absent + else if ($status == -1) { + $retour = _T('erreur'); + $texte = _T('plugin_erreur_charger', array('zip'=>$zip)); + } + + // fichier la mais pas bien dezippe + else { + $retour = _T('erreur'); + $texte = _T('plugin_erreur_zip',array('status'=>$status)); + } + + + include_spip('inc/install'); // pour bouton_suivant() + + $texte = "
$texte
\n"; + + $redirect = rawurldecode(_request('redirect')); + // par defaut on revient sur la page admin_plugin + if($redirect == _DIR_RESTREINT OR $redirect == "./"){ + $redirect_annul = generer_url_ecrire('admin_plugin'); + $redirect_form = 'admin_plugin&voir=recents&'.$type.'='.preg_replace(',^[^/]+/|/$,', '', $status['dirname']); + $redirect_action = ''; + } + else{ + $redirect_annul = $redirect; + $redirect_form = preg_replace(',^.*exec\=,', '', $redirect); + if (!$suite) + $texte .= form_hidden(parametre_url(generer_url_ecrire($redirect_form), $type,preg_replace(',^[^/]+/|/$,', '', $status['dirname']))); + $redirect_action = $redirect_form; + } + echo minipres($retour." ", + $suite + ? redirige_action_post(_request('action'), + $suite, + $redirect_action, + '', + form_hidden('?url_zip_plugin='.urlencode($zip).'&extract=oui&fichier='.urlencode($fichier)) + .$texte + .""._T('bouton_annuler')."" + .bouton_suivant()) + : generer_form_ecrire($redirect_form, $texte . bouton_suivant()) + ); + exit; + + // 0 = rien, pas charge + // liste de fichiers = retour gagnant + // < 0 = erreur pclzip + // ----- Error codes + // -1 : Unable to open file in binary write mode + // -2 : Unable to open file in binary read mode + // -3 : Invalid parameters + // -4 : File does not exist + // -5 : Filename is too long (max. 255) + // -6 : Not a valid zip file + // -7 : Invalid extracted file size + // -8 : Unable to create directory + // -9 : Invalid archive extension + // -10 : Invalid archive format + // -11 : Unable to delete file (unlink) + // -12 : Unable to rename file (rename) + // -13 : Invalid header checksum + // -14 : Invalid archive size + +# redirige_par_entete($url_retour); +} + +?>