From 99534f8c96dab76348aa1f73cf0307e95f59e359 Mon Sep 17 00:00:00 2001 From: "cedric@yterium.com" <> Date: Sun, 13 Dec 2015 11:57:33 +0000 Subject: [PATCH] Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage --- action/actionner.php | 29 +- action/actualiser_depot.php | 18 +- action/editer_depot.php | 39 +- action/supprimer_depot.php | 6 +- action/teleporter.php | 62 +- base/svp_declarer.php | 341 +- exec/admin_plugin.php | 85 +- formulaires/admin_plugin.php | 72 +- formulaires/ajouter_depot.php | 41 +- formulaires/charger_plugin.php | 49 +- formulaires/charger_plugin_archive.php | 33 +- formulaires/editer_depot.php | 26 +- formulaires/inc-admin_plugin_fonctions.php | 12 +- genie/svp_actualiser_depots.php | 8 +- genie/svp_taches_generales_cron.php | 9 +- inc/pcltar.php | 6872 ++++++++--------- inc/svp_actionner.php | 440 +- inc/svp_decider.php | 315 +- inc/svp_depoter_distant.php | 379 +- inc/svp_depoter_local.php | 238 +- inc/svp_outiller.php | 212 +- inc/svp_phraser.php | 160 +- inc/svp_rechercher.php | 144 +- inc/where_compatible_spip.php | 47 +- plugins/fusion_paquet.php | 19 +- plugins/fusion_plugin.php | 120 +- plugins/preparer_sql_paquet.php | 94 +- plugins/preparer_sql_plugin.php | 142 +- .../inclure/voir_en_ligne_fonctions.php | 3 +- .../navigation/svp_admin_plugin_fonctions.php | 6 +- svp_administrations.php | 31 +- svp_fonctions.php | 336 +- svp_ieconfig.php | 14 +- svp_pipelines.php | 69 +- teleporter/git.php | 112 +- teleporter/http.php | 130 +- teleporter/http_deballe_tgz.php | 92 +- teleporter/http_deballe_zip.php | 86 +- teleporter/svn.php | 88 +- 39 files changed, 5706 insertions(+), 5273 deletions(-) diff --git a/action/actionner.php b/action/actionner.php index b887273..e0417bc 100644 --- a/action/actionner.php +++ b/action/actionner.php @@ -7,8 +7,10 @@ * @license GPL * @package SPIP\SVP\Actions */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Action effectuant 1 action dans la liste des actions à réaliser @@ -38,7 +40,7 @@ function action_actionner_dist() { if ($actionneur->tester_si_svp_desactive()) { $url = _request('redirect'); } else { - $url = generer_action_auteur('actionner', '', _request('redirect')); + $url = generer_action_auteur('actionner', '', _request('redirect')); } // en mode pas à pas, on affiche un bilan entre chaque action @@ -55,18 +57,20 @@ function action_actionner_dist() { #minipres #actionner ul {margin-left: 0.5em;} #minipres #actionner li {list-style-type:square; margin-left: 0.5em;} "; - echo minipres( _T('svp:installation_en_cours'), $pres . '

' . $btn . $styles); + echo minipres(_T('svp:installation_en_cours'), $pres . '

' . $btn . $styles); die(); } - redirige_par_entete(str_replace('&','&', $url)); + redirige_par_entete(str_replace('&', '&', $url)); } - foreach($actionneur->done as $done){ - if ($done['todo']=='on'){ + foreach ($actionneur->done as $done) { + if ($done['todo'] == 'on') { if ($voir = session_get('svp_admin_plugin_voir') - AND $voir=='inactif') - session_set('svp_admin_plugin_voir','actif'); + AND $voir == 'inactif' + ) { + session_set('svp_admin_plugin_voir', 'actif'); + } break; } } @@ -74,10 +78,11 @@ function action_actionner_dist() { include_spip('inc/svp_depoter_local'); svp_actualiser_paquets_locaux(); - if (!_request('redirect')) + if (!_request('redirect')) { $GLOBALS['redirect'] = generer_url_ecrire('admin_plugin'); - else - $GLOBALS['redirect'] = str_replace('&','&', _request('redirect')); + } else { + $GLOBALS['redirect'] = str_replace('&', '&', _request('redirect')); + } } diff --git a/action/actualiser_depot.php b/action/actualiser_depot.php index 61419ef..49dacc1 100644 --- a/action/actualiser_depot.php +++ b/action/actualiser_depot.php @@ -6,12 +6,12 @@ * @license GPL * @package SPIP\SVP\Actions */ - + /** * Action de mise à jour en base de données de la liste des plugins * d'un ou de tous les dépots */ -function action_actualiser_depot_dist(){ +function action_actualiser_depot_dist() { // Securisation: aucun argument attendu $securiser_action = charger_fonction('securiser_action', 'inc'); @@ -32,16 +32,18 @@ function action_actualiser_depot_dist(){ if ($arg === 'tout') { if ($ids_depots = sql_allfetsel('id_depot', 'spip_depots')) { $ids_depots = array_map('reset', $ids_depots); - foreach ($ids_depots as $_id_depot) + foreach ($ids_depots as $_id_depot) { svp_actualiser_depot($_id_depot); + } // On consigne l'action spip_log("ACTION ACTUALISER TOUS LES DEPOTS (manuel)", 'svp_actions.' . _LOG_INFO); } - } - else if ($id_depot = intval($arg)) { - svp_actualiser_depot($id_depot); - // On consigne l'action - spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO); + } else { + if ($id_depot = intval($arg)) { + svp_actualiser_depot($id_depot); + // On consigne l'action + spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = " . $id_depot, 'svp_actions.' . _LOG_INFO); + } } } diff --git a/action/editer_depot.php b/action/editer_depot.php index 9674a94..8fbbeef 100644 --- a/action/editer_depot.php +++ b/action/editer_depot.php @@ -17,14 +17,16 @@ * @license GPL * @package SPIP\SVP\Actions */ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** - * Action de mise à jour des descriptions d'un dépot + * Action de mise à jour des descriptions d'un dépot * * @return array * Liste identifiant du dépot, texte d'erreur éventuel -**/ + **/ function action_editer_depot_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); @@ -49,17 +51,22 @@ function action_editer_depot_dist() { } // On met a jour le depot avec les saisies - if (sql_updateq('spip_depots', - array('titre'=> _request('titre'), - 'descriptif'=> _request('descriptif'), - 'type'=> _request('type')), - 'id_depot=' . sql_quote($id_depot))); - // Enregistre l'envoi dans la BD - // Dans le cas du depot rien n'est fait actuellement, on garde cette fonction - // par souci de coherence avec les autres editions d'objet et pour usage futur - $err = depots_set($id_depot); - if (!$err) - spip_log("ACTION MODIFIER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO); + if (sql_updateq('spip_depots', + array( + 'titre' => _request('titre'), + 'descriptif' => _request('descriptif'), + 'type' => _request('type') + ), + 'id_depot=' . sql_quote($id_depot))) { + ; + } + // Enregistre l'envoi dans la BD + // Dans le cas du depot rien n'est fait actuellement, on garde cette fonction + // par souci de coherence avec les autres editions d'objet et pour usage futur + $err = depots_set($id_depot); + if (!$err) { + spip_log("ACTION MODIFIER DEPOT (manuel) : id_depot = " . $id_depot, 'svp_actions.' . _LOG_INFO); + } } return array($id_depot, $err); @@ -72,12 +79,12 @@ function action_editer_depot_dist() { * * @note * Cette fonction ne fait rien actuellement !! - * + * * @param int $id_depot * Identifiant du dépot * @return string * Texte d'une eventuelle erreur -**/ + **/ function depots_set($id_depot) { $err = ''; diff --git a/action/supprimer_depot.php b/action/supprimer_depot.php index 30e9f13..d4eb3db 100644 --- a/action/supprimer_depot.php +++ b/action/supprimer_depot.php @@ -6,14 +6,14 @@ * @license GPL * @package SPIP\SVP\Actions */ - + /** * Action de suppression en base de données d'un dépot et de ses plugins * * @uses svp_supprimer_depot() * @return void */ -function action_supprimer_depot_dist(){ +function action_supprimer_depot_dist() { // Securisation: aucun argument attendu $securiser_action = charger_fonction('securiser_action', 'inc'); @@ -30,7 +30,7 @@ function action_supprimer_depot_dist(){ if ($id_depot = intval($arg)) { include_spip('inc/svp_depoter_distant'); svp_supprimer_depot($id_depot); - spip_log("ACTION SUPPRIMER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO); + spip_log("ACTION SUPPRIMER DEPOT (manuel) : id_depot = " . $id_depot, 'svp_actions.' . _LOG_INFO); } } diff --git a/action/teleporter.php b/action/teleporter.php index 6543d20..1a5febc 100644 --- a/action/teleporter.php +++ b/action/teleporter.php @@ -6,11 +6,11 @@ * @license GPL * @package SPIP\SVP\Actions */ - + /** * Téléporter et déballer un composant - * + * * @param string $methode * http|git|svn|... * @param string $source @@ -24,23 +24,26 @@ * String : texte d'une erreur * true si l'opération est correctement réalisée */ -function action_teleporter_composant_dist($methode, $source, $dest, $options = array()){ +function action_teleporter_composant_dist($methode, $source, $dest, $options = array()) { # Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes # facons jamais pu venir ici avec toutes les securisations faites :^) # sauf si on doit télécharger une lib dans _DIR_LIB - if (!preg_match(','.substr(_DIR_LIB,0,-1).',',$dest) && !_DIR_PLUGINS_AUTO) + if (!preg_match(',' . substr(_DIR_LIB, 0, -1) . ',', $dest) && !_DIR_PLUGINS_AUTO) { die('Vous ne pouvez pas télécharger, absence de _DIR_PLUGINS_AUTO'); + } // verifier que la methode est connue - if (!$teleporter = charger_fonction($methode,"teleporter",true)){ - spip_log("Methode $methode inconnue pour teleporter $source vers $dest","teleport"._LOG_ERREUR); - return _T('svp:erreur_teleporter_methode_inconue',array('methode' => $methode)); + if (!$teleporter = charger_fonction($methode, "teleporter", true)) { + spip_log("Methode $methode inconnue pour teleporter $source vers $dest", "teleport" . _LOG_ERREUR); + + return _T('svp:erreur_teleporter_methode_inconue', array('methode' => $methode)); } - if (!$dest = teleporter_verifier_destination($d = $dest)){ - spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d","teleport"._LOG_ERREUR); - return _T('svp:erreur_teleporter_destination_erreur',array('dir' => $d)); + if (!$dest = teleporter_verifier_destination($d = $dest)) { + spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d", "teleport" . _LOG_ERREUR); + + return _T('svp:erreur_teleporter_destination_erreur', array('dir' => $d)); #$texte = "

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

" # . "

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

"; } @@ -48,7 +51,7 @@ function action_teleporter_composant_dist($methode, $source, $dest, $options = a # destination temporaire des fichiers si besoin $options['dir_tmp'] = sous_repertoire(_DIR_CACHE, 'chargeur'); - return $teleporter($methode,$source,$dest,$options); + return $teleporter($methode, $source, $dest, $options); } @@ -60,28 +63,31 @@ function action_teleporter_composant_dist($methode, $source, $dest, $options = a * false en cas d'échec * Chemin du répertoire sinon */ -function teleporter_verifier_destination($dest){ - $dest = rtrim($dest,"/"); +function teleporter_verifier_destination($dest) { + $dest = rtrim($dest, "/"); $final = basename($dest); $base = dirname($dest); $create = array(); // on cree tout le chemin jusqu'a dest non inclus - while (!is_dir($base)){ + while (!is_dir($base)) { $create[] = basename($base); $base = dirname($base); } - while (count($create)){ - if (!is_writable($base)) + while (count($create)) { + if (!is_writable($base)) { return false; - $base = sous_repertoire($base,array_pop($create)); - if (!$base) + } + $base = sous_repertoire($base, array_pop($create)); + if (!$base) { return false; + } } - if (!is_writable($base)) + if (!is_writable($base)) { return false; + } - return $base."/$final"; + return $base . "/$final"; } /** @@ -90,22 +96,24 @@ function teleporter_verifier_destination($dest){ * Si le répertoire donné existe, le déplace dans un répertoire de backup. * Si ce backup existe déjà, il est supprimé auparavant. * Retourne le nouveau chemin du répertoire. - * + * * @param string $dest * Chemin du répertoire à déplacer * @return string * Nouveau chemin du répertoire s'il existait, * Chaîne vide sinon -**/ -function teleporter_nettoyer_vieille_version($dest){ + **/ +function teleporter_nettoyer_vieille_version($dest) { $old = ""; - if (is_dir($dest)){ + if (is_dir($dest)) { $dir = dirname($dest); $base = basename($dest); - $old="$dir/.$base.bck"; - if (is_dir($old)) + $old = "$dir/.$base.bck"; + if (is_dir($old)) { supprimer_repertoire($old); - rename($dest,$old); + } + rename($dest, $old); } + return $old; } diff --git a/base/svp_declarer.php b/base/svp_declarer.php index e76d307..f0b1ef9 100644 --- a/base/svp_declarer.php +++ b/base/svp_declarer.php @@ -1,11 +1,11 @@ 'depots', - 'type' => 'depot', - 'field' => array( - "id_depot" => "bigint(21) NOT NULL", - "titre" => "text DEFAULT '' NOT NULL", - "descriptif" => "text DEFAULT '' NOT NULL", - "type" => "varchar(10) DEFAULT '' NOT NULL", - "url_serveur" => "varchar(255) DEFAULT '' NOT NULL", // url du serveur svn ou git - "url_brouteur" => "varchar(255) DEFAULT '' NOT NULL", // url de l'interface de gestion du repository (trac, redmine...) - "url_archives" => "varchar(255) DEFAULT '' NOT NULL", // url de base des zips - "url_commits" => "varchar(255) DEFAULT '' NOT NULL", // url du flux rss des commits du serveur svn ou git - "xml_paquets" => "varchar(255) DEFAULT '' NOT NULL", // chemin complet du fichier xml du depot - "sha_paquets" => "varchar(40) DEFAULT '' NOT NULL", - "nbr_paquets" => "integer DEFAULT 0 NOT NULL", - "nbr_plugins" => "integer DEFAULT 0 NOT NULL", - "nbr_autres" => "integer DEFAULT 0 NOT NULL", // autres contributions, non plugin - "maj" => "timestamp"), - 'key' => array( - "PRIMARY KEY" => "id_depot"), - 'tables_jointures' => array('id_plugin' => 'depots_plugins'), - 'principale' => 'oui', + 'table_objet' => 'depots', + 'type' => 'depot', + 'field' => array( + "id_depot" => "bigint(21) NOT NULL", + "titre" => "text DEFAULT '' NOT NULL", + "descriptif" => "text DEFAULT '' NOT NULL", + "type" => "varchar(10) DEFAULT '' NOT NULL", + "url_serveur" => "varchar(255) DEFAULT '' NOT NULL", + // url du serveur svn ou git + "url_brouteur" => "varchar(255) DEFAULT '' NOT NULL", + // url de l'interface de gestion du repository (trac, redmine...) + "url_archives" => "varchar(255) DEFAULT '' NOT NULL", + // url de base des zips + "url_commits" => "varchar(255) DEFAULT '' NOT NULL", + // url du flux rss des commits du serveur svn ou git + "xml_paquets" => "varchar(255) DEFAULT '' NOT NULL", + // chemin complet du fichier xml du depot + "sha_paquets" => "varchar(40) DEFAULT '' NOT NULL", + "nbr_paquets" => "integer DEFAULT 0 NOT NULL", + "nbr_plugins" => "integer DEFAULT 0 NOT NULL", + "nbr_autres" => "integer DEFAULT 0 NOT NULL", + // autres contributions, non plugin + "maj" => "timestamp" + ), + 'key' => array( + "PRIMARY KEY" => "id_depot" + ), + 'tables_jointures' => array('id_plugin' => 'depots_plugins'), + 'principale' => 'oui', // Titre, date et gestion du statut - 'titre' => "titre, '' AS lang", - + 'titre' => "titre, '' AS lang", + // Edition, affichage et recherche - 'page' => 'depot', - 'url_voir' => 'depot', - 'url_edit' => 'depot_edit', - 'editable' => lire_config('svp/depot_editable', 'non'), - 'champs_editables' => array('titre', 'descriptif'), - 'icone_objet' => 'depot', - + 'page' => 'depot', + 'url_voir' => 'depot', + 'url_edit' => 'depot_edit', + 'editable' => lire_config('svp/depot_editable', 'non'), + 'champs_editables' => array('titre', 'descriptif'), + 'icone_objet' => 'depot', + // Textes standard - 'texte_retour' => 'icone_retour', - 'texte_modifier' => 'svp:bouton_modifier_depot', - 'texte_creer' => '', - 'texte_creer_associer' => '', + 'texte_retour' => 'icone_retour', + 'texte_modifier' => 'svp:bouton_modifier_depot', + 'texte_creer' => '', + 'texte_creer_associer' => '', 'texte_signale_edition' => '', - 'texte_objet' => 'svp:titre_depot', - 'texte_objets' => 'svp:titre_depots', - 'info_aucun_objet' => 'svp:info_aucun_depot', - 'info_1_objet' => 'svp:info_1_depot', - 'info_nb_objets' => 'svp:info_nb_depots', - 'texte_logo_objet' => 'svp:titre_logo_depot', + 'texte_objet' => 'svp:titre_depot', + 'texte_objets' => 'svp:titre_depots', + 'info_aucun_objet' => 'svp:info_aucun_depot', + 'info_1_objet' => 'svp:info_1_depot', + 'info_nb_objets' => 'svp:info_nb_depots', + 'texte_logo_objet' => 'svp:titre_logo_depot', ); // Table des plugins $tables['spip_plugins'] = array( // Base de donnees - 'table_objet' => 'plugins', - 'type' => 'plugin', - 'field' => array( - "id_plugin" => "bigint(21) NOT NULL", - "prefixe" => "varchar(30) DEFAULT '' NOT NULL", - "nom" => "text DEFAULT '' NOT NULL", - "slogan" => "text DEFAULT '' NOT NULL", - "categorie" => "varchar(100) DEFAULT '' NOT NULL", - "tags" => "text DEFAULT '' NOT NULL", - "vmax" => "varchar(24) DEFAULT '' NOT NULL", // version la plus elevee des paquets du plugin - "date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus ancienne des paquets du plugin - "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus recente des paquets du plugin - "compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL", // union des intervalles des paquets du plugin - "branches_spip" => "varchar(255) DEFAULT '' NOT NULL"), // union des branches spip supportees par les paquets du plugin - 'key' => array( - "PRIMARY KEY" => "id_plugin", - "KEY prefixe" => "prefixe"), - 'tables_jointures' => array('id_depot' => 'depots_plugins'), - 'principale' => 'oui', + 'table_objet' => 'plugins', + 'type' => 'plugin', + 'field' => array( + "id_plugin" => "bigint(21) NOT NULL", + "prefixe" => "varchar(30) DEFAULT '' NOT NULL", + "nom" => "text DEFAULT '' NOT NULL", + "slogan" => "text DEFAULT '' NOT NULL", + "categorie" => "varchar(100) DEFAULT '' NOT NULL", + "tags" => "text DEFAULT '' NOT NULL", + "vmax" => "varchar(24) DEFAULT '' NOT NULL", // version la plus elevee des paquets du plugin + "date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus ancienne des paquets du plugin + "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus recente des paquets du plugin + "compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL", // union des intervalles des paquets du plugin + "branches_spip" => "varchar(255) DEFAULT '' NOT NULL" + ), // union des branches spip supportees par les paquets du plugin + 'key' => array( + "PRIMARY KEY" => "id_plugin", + "KEY prefixe" => "prefixe" + ), + 'tables_jointures' => array('id_depot' => 'depots_plugins'), + 'principale' => 'oui', // Titre, date et gestion du statut - 'titre' => "prefixe AS titre, '' AS lang", - + 'titre' => "prefixe AS titre, '' AS lang", + // Edition, affichage et recherche - 'page' => 'plugin', - 'url_voir' => 'plugin', - 'editable' => 'non', - 'champs_editables' => array(), - 'rechercher_champs' => array('prefixe' => 8, 'nom' => 8, 'slogan' => 4), - 'rechercher_jointures' => array('paquet' => array('auteur' => 8, 'description' => 2)), - 'icone_objet' => 'plugin', - + 'page' => 'plugin', + 'url_voir' => 'plugin', + 'editable' => 'non', + 'champs_editables' => array(), + 'rechercher_champs' => array('prefixe' => 8, 'nom' => 8, 'slogan' => 4), + 'rechercher_jointures' => array('paquet' => array('auteur' => 8, 'description' => 2)), + 'icone_objet' => 'plugin', + // Textes standard - 'texte_retour' => 'icone_retour', - 'texte_modifier' => '', - 'texte_creer' => '', - 'texte_creer_associer' => '', + 'texte_retour' => 'icone_retour', + 'texte_modifier' => '', + 'texte_creer' => '', + 'texte_creer_associer' => '', 'texte_signale_edition' => '', - 'texte_objet' => 'svp:titre_plugin', - 'texte_objets' => 'svp:titre_plugins', - 'info_aucun_objet' => 'svp:info_aucun_plugin', - 'info_1_objet' => 'svp:info_1_plugin', - 'info_nb_objets' => 'svp:info_nb_plugins', - 'texte_logo_objet' => 'svp:titre_logo_plugin', + 'texte_objet' => 'svp:titre_plugin', + 'texte_objets' => 'svp:titre_plugins', + 'info_aucun_objet' => 'svp:info_aucun_plugin', + 'info_1_objet' => 'svp:info_1_plugin', + 'info_nb_objets' => 'svp:info_nb_plugins', + 'texte_logo_objet' => 'svp:titre_logo_plugin', ); $tables['spip_paquets'] = array( // Base de donnees - 'table_objet' => 'paquets', - 'type' => 'paquet', - 'field' => array( - "id_paquet" => "bigint(21) NOT NULL", - "id_plugin" => "bigint(21) NOT NULL", - "prefixe" => "varchar(30) DEFAULT '' NOT NULL", - "logo" => "varchar(255) DEFAULT '' NOT NULL", // chemin du logo depuis la racine du plugin - "version" => "varchar(24) DEFAULT '' NOT NULL", - "version_base" => "varchar(24) DEFAULT '' NOT NULL", - "compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL", - "branches_spip" => "varchar(255) DEFAULT '' NOT NULL", // branches spip supportees (cf meta) - "description" => "text DEFAULT '' NOT NULL", - "auteur" => "text DEFAULT '' NOT NULL", - "credit" => "text DEFAULT '' NOT NULL", - "licence" => "text DEFAULT '' NOT NULL", - "copyright" => "text DEFAULT '' NOT NULL", - "lien_doc" => "text DEFAULT '' NOT NULL", // lien vers la documentation - "lien_demo" => "text DEFAULT '' NOT NULL", // lien vers le site de demo - "lien_dev" => "text DEFAULT '' NOT NULL", // lien vers le site de dev - "etat" => "varchar(16) DEFAULT '' NOT NULL", - "etatnum" => "int(1) DEFAULT 0 NOT NULL", // 0 aucune indication - 1 exp - 2 dev - 3 test - 4 stable - "dependances" => "text DEFAULT '' NOT NULL", - "procure" => "text DEFAULT '' NOT NULL", - "date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "id_depot" => "bigint(21) DEFAULT 0 NOT NULL", // 0 pour un paquet local - "nom_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", // nom du zip du paquet, depuis l'adresse de la zone - "nbo_archive" => "integer DEFAULT 0 NOT NULL", // taille de l'archive en octets - "maj_archive" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date de mise a jour de l'archive - "src_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", // source de l'archive sur le depot - "traductions" => "text DEFAULT '' NOT NULL", // tableau serialise par module des langues traduites et de leurs traducteurs - "actif" => "varchar(3) DEFAULT 'non' NOT NULL", // est actif ? oui / non - "installe" => "varchar(3) DEFAULT 'non' NOT NULL", // est desinstallable ? oui / non - "recent" => "int(2) DEFAULT 0 NOT NULL", // a ete utilise recemment ? > 0 : oui - "maj_version" => "VARCHAR(255) DEFAULT '' NOT NULL", // version superieure existante (mise a jour possible) - "superieur" => "varchar(3) DEFAULT 'non' NOT NULL", // superieur : version plus recente disponible (distant) d'un plugin (actif?) existant - "obsolete" => "varchar(3) DEFAULT 'non' NOT NULL", // obsolete : version plus ancienne (locale) disponible d'un plugin local existant - "attente" => "varchar(3) DEFAULT 'non' NOT NULL", // attente : plugin semi actif (il etait actif, mais il lui manque maintenant une dependance : il reste coche actif jusqu'a resolution ou desactivation manuelle) - "constante" => "VARCHAR(30) DEFAULT '' NOT NULL", // nom de la constante _DIR_(PLUGINS|EXTENSIONS|PLUGINS_SUPP) - "signature" => "VARCHAR(32) DEFAULT '' NOT NULL"), // hash MD5 d'un paquet - 'key' => array( - "PRIMARY KEY" => "id_paquet", - "KEY id_plugin" => "id_plugin"), - 'join' => array( - "id_paquet" => "id_paquet", - "id_plugin" => "id_plugin"), - 'principale' => 'oui', + 'table_objet' => 'paquets', + 'type' => 'paquet', + 'field' => array( + "id_paquet" => "bigint(21) NOT NULL", + "id_plugin" => "bigint(21) NOT NULL", + "prefixe" => "varchar(30) DEFAULT '' NOT NULL", + "logo" => "varchar(255) DEFAULT '' NOT NULL", + // chemin du logo depuis la racine du plugin + "version" => "varchar(24) DEFAULT '' NOT NULL", + "version_base" => "varchar(24) DEFAULT '' NOT NULL", + "compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL", + "branches_spip" => "varchar(255) DEFAULT '' NOT NULL", + // branches spip supportees (cf meta) + "description" => "text DEFAULT '' NOT NULL", + "auteur" => "text DEFAULT '' NOT NULL", + "credit" => "text DEFAULT '' NOT NULL", + "licence" => "text DEFAULT '' NOT NULL", + "copyright" => "text DEFAULT '' NOT NULL", + "lien_doc" => "text DEFAULT '' NOT NULL", + // lien vers la documentation + "lien_demo" => "text DEFAULT '' NOT NULL", + // lien vers le site de demo + "lien_dev" => "text DEFAULT '' NOT NULL", + // lien vers le site de dev + "etat" => "varchar(16) DEFAULT '' NOT NULL", + "etatnum" => "int(1) DEFAULT 0 NOT NULL", + // 0 aucune indication - 1 exp - 2 dev - 3 test - 4 stable + "dependances" => "text DEFAULT '' NOT NULL", + "procure" => "text DEFAULT '' NOT NULL", + "date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "id_depot" => "bigint(21) DEFAULT 0 NOT NULL", + // 0 pour un paquet local + "nom_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", + // nom du zip du paquet, depuis l'adresse de la zone + "nbo_archive" => "integer DEFAULT 0 NOT NULL", + // taille de l'archive en octets + "maj_archive" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + // date de mise a jour de l'archive + "src_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", + // source de l'archive sur le depot + "traductions" => "text DEFAULT '' NOT NULL", + // tableau serialise par module des langues traduites et de leurs traducteurs + "actif" => "varchar(3) DEFAULT 'non' NOT NULL", + // est actif ? oui / non + "installe" => "varchar(3) DEFAULT 'non' NOT NULL", + // est desinstallable ? oui / non + "recent" => "int(2) DEFAULT 0 NOT NULL", + // a ete utilise recemment ? > 0 : oui + "maj_version" => "VARCHAR(255) DEFAULT '' NOT NULL", + // version superieure existante (mise a jour possible) + "superieur" => "varchar(3) DEFAULT 'non' NOT NULL", + // superieur : version plus recente disponible (distant) d'un plugin (actif?) existant + "obsolete" => "varchar(3) DEFAULT 'non' NOT NULL", + // obsolete : version plus ancienne (locale) disponible d'un plugin local existant + "attente" => "varchar(3) DEFAULT 'non' NOT NULL", + // attente : plugin semi actif (il etait actif, mais il lui manque maintenant une dependance : il reste coche actif jusqu'a resolution ou desactivation manuelle) + "constante" => "VARCHAR(30) DEFAULT '' NOT NULL", + // nom de la constante _DIR_(PLUGINS|EXTENSIONS|PLUGINS_SUPP) + "signature" => "VARCHAR(32) DEFAULT '' NOT NULL" + ), // hash MD5 d'un paquet + 'key' => array( + "PRIMARY KEY" => "id_paquet", + "KEY id_plugin" => "id_plugin" + ), + 'join' => array( + "id_paquet" => "id_paquet", + "id_plugin" => "id_plugin" + ), + 'principale' => 'oui', // Titre, date et gestion du statut - 'titre' => "nom_archive AS titre, '' AS lang", - + 'titre' => "nom_archive AS titre, '' AS lang", + // Edition, affichage et recherche - 'page' => 'paquet', - 'url_voir' => '', - 'editable' => 'non', - 'champs_editables' => array(), - 'rechercher_champs' => array(), - 'rechercher_jointures' => array(), - 'icone_objet' => 'paquet', - + 'page' => 'paquet', + 'url_voir' => '', + 'editable' => 'non', + 'champs_editables' => array(), + 'rechercher_champs' => array(), + 'rechercher_jointures' => array(), + 'icone_objet' => 'paquet', + // Textes standard - 'texte_retour' => '', - 'texte_modifier' => '', - 'texte_creer' => '', - 'texte_creer_associer' => '', + 'texte_retour' => '', + 'texte_modifier' => '', + 'texte_creer' => '', + 'texte_creer_associer' => '', 'texte_signale_edition' => '', - 'texte_objet' => 'svp:titre_paquet', - 'texte_objets' => 'svp:titre_paquets', - 'info_aucun_objet' => 'svp:info_aucun_paquet', - 'info_1_objet' => 'svp:info_1_paquet', - 'info_nb_objets' => 'svp:info_nb_paquets', - 'texte_logo_objet' => '', + 'texte_objet' => 'svp:titre_paquet', + 'texte_objets' => 'svp:titre_paquets', + 'info_aucun_objet' => 'svp:info_aucun_paquet', + 'info_1_objet' => 'svp:info_1_paquet', + 'info_nb_objets' => 'svp:info_nb_paquets', + 'texte_logo_objet' => '', ); return $tables; @@ -216,15 +249,15 @@ function svp_declarer_tables_objets_sql($tables) { function svp_declarer_tables_auxiliaires($tables_auxiliaires) { // Tables de liens entre plugins et depots : spip_depots_plugins $spip_depots_plugins = array( - "id_depot" => "bigint(21) NOT NULL", - "id_plugin" => "bigint(21) NOT NULL" + "id_depot" => "bigint(21) NOT NULL", + "id_plugin" => "bigint(21) NOT NULL" ); $spip_depots_plugins_key = array( - "PRIMARY KEY" => "id_depot, id_plugin" + "PRIMARY KEY" => "id_depot, id_plugin" ); - $tables_auxiliaires['spip_depots_plugins'] = + $tables_auxiliaires['spip_depots_plugins'] = array('field' => &$spip_depots_plugins, 'key' => &$spip_depots_plugins_key); return $tables_auxiliaires; @@ -241,7 +274,7 @@ function svp_declarer_tables_auxiliaires($tables_auxiliaires) { */ function svp_declarer_tables_interfaces($interface) { // Les tables : permet d'appeler une boucle avec le *type* de la table uniquement - $interface['table_des_tables']['depots'] = 'depots'; + $interface['table_des_tables']['depots'] = 'depots'; $interface['table_des_tables']['plugins'] = 'plugins'; $interface['table_des_tables']['paquets'] = 'paquets'; $interface['table_des_tables']['depots_plugins'] = 'depots_plugins'; diff --git a/exec/admin_plugin.php b/exec/admin_plugin.php index 717712b..d396b4d 100644 --- a/exec/admin_plugin.php +++ b/exec/admin_plugin.php @@ -21,7 +21,9 @@ * @license GPL * @package SPIP\SVP\Exec */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/presentation'); @@ -33,7 +35,7 @@ include_spip('inc/presentation'); * @uses plugin_installes_meta() * @uses plugin_donne_erreurs() * @uses svp_vider_tables() - * + * * @pipeline_appel affiche_gauche * @pipeline_appel affiche_droite */ @@ -48,10 +50,10 @@ function exec_admin_plugin_dist() { // et l'installation des qu'on est dans la colonne principale // si jamais la liste des plugins actifs change, il faut faire un refresh du hit // pour etre sur que les bons fichiers seront charges lors de l'install - include_spip('inc/plugin'); + include_spip('inc/plugin'); $new = actualise_plugins_actifs(); - if ($new AND _request('actualise')<2) { - $url = parametre_url(self(),'actualise',_request('actualise')+1,'&'); + if ($new AND _request('actualise') < 2) { + $url = parametre_url(self(), 'actualise', _request('actualise')+1, '&'); include_spip('inc/headers'); echo redirige_formulaire($url); exit; @@ -73,18 +75,18 @@ function exec_admin_plugin_dist() { // car dans le html d'un squelette, encapsule dans un ob_start()/ob_flush(), // la redirection en cas de timeout sur une installation ne se fait pas. -/* - // on installe les plugins maintenant, - // cela permet aux scripts d'install de faire des affichages (moches...) - plugin_installes_meta(); - - // les squelettes ne peuvent pas s'appeler 'admin_plugin' - // sinon Z les charge en priorite par rapport a ce fichier exec en PHP - set_request('fond', 'svp_admin_plugin'); - - // on lance l'affichage standard Z - include_spip('exec/fond'); -*/ + /* + // on installe les plugins maintenant, + // cela permet aux scripts d'install de faire des affichages (moches...) + plugin_installes_meta(); + + // les squelettes ne peuvent pas s'appeler 'admin_plugin' + // sinon Z les charge en priorite par rapport a ce fichier exec en PHP + set_request('fond', 'svp_admin_plugin'); + + // on lance l'affichage standard Z + include_spip('exec/fond'); + */ // liste des erreurs mises en forme @@ -98,8 +100,8 @@ function exec_admin_plugin_dist() { echo pipeline('affiche_gauche', array( - 'args'=>array('exec'=>'admin_plugin'), - 'data'=> recuperer_fond('prive/squelettes/navigation/svp_admin_plugin') + 'args' => array('exec' => 'admin_plugin'), + 'data' => recuperer_fond('prive/squelettes/navigation/svp_admin_plugin') ) ); @@ -107,50 +109,53 @@ function exec_admin_plugin_dist() { // alerte si mode de compatibilité forcée $mode_compat = defined('_DEV_PLUGINS') ? - ''. _T('svp:alerte_compatibilite') .'' : ''; - + '' . _T('svp:alerte_compatibilite') . '' : ''; + echo gros_titre(_T('icone_admin_plugin') . $mode_compat, '', false); // message d'erreur au retour d'une operation - if ($erreur_activation){ + if ($erreur_activation) { include_spip('inc/filtres_boites'); - echo "
" . boite_ouvrir(_T('svp:actions_en_erreur'), 'error') . $erreur_activation . boite_fermer() . "
"; + echo "
" . boite_ouvrir(_T('svp:actions_en_erreur'), + 'error') . $erreur_activation . boite_fermer() . "
"; } // afficher les actions realisees s'il y en a eu // (activation/desactivation/telechargement...) echo svp_presenter_actions_realisees(); - + // on installe les plugins maintenant, // cela permet aux scripts d'install de faire des affichages (moches...) plugin_installes_meta(); $args = $_REQUEST; // quand on demande un 'voir', on le memorise en session utilisateur - if (isset($args['voir'])){ - session_set('svp_admin_plugin_voir',$args['voir']); + if (isset($args['voir'])) { + session_set('svp_admin_plugin_voir', $args['voir']); } if (!isset($args['voir']) - AND $voir = session_get('svp_admin_plugin_voir') - AND in_array($voir,array('tous','actif','inactif'))){ + AND $voir = session_get('svp_admin_plugin_voir') + AND in_array($voir, array('tous', 'actif', 'inactif')) + ) { $args['voir'] = $voir; } - if (!isset($args['voir'])){ + if (!isset($args['voir'])) { /*$args['voir'] = 'tous'; $count = count(liste_plugin_files()); if ($count>256) */ - $args['voir'] = 'actif'; + $args['voir'] = 'actif'; } - - if (isset($args['verrouille'])){ - session_set('svp_admin_plugin_verrouille',$args['verrouille']); + + if (isset($args['verrouille'])) { + session_set('svp_admin_plugin_verrouille', $args['verrouille']); } if (!isset($args['verrouille']) - AND $verrouille = session_get('svp_admin_plugin_verrouille') - AND in_array($verrouille,array('tous','oui','non'))){ + AND $verrouille = session_get('svp_admin_plugin_verrouille') + AND in_array($verrouille, array('tous', 'oui', 'non')) + ) { $args['verrouille'] = $verrouille; } - if (!isset($args['verrouille'])){ + if (!isset($args['verrouille'])) { $args['verrouille'] = 'non'; //'tous'; } @@ -158,8 +163,8 @@ function exec_admin_plugin_dist() { echo pipeline('affiche_milieu', array( - 'args'=>array('exec'=>'admin_plugin'), - 'data'=>'' + 'args' => array('exec' => 'admin_plugin'), + 'data' => '' ) ); @@ -178,11 +183,11 @@ function exec_admin_plugin_dist() { * dans l'URL (ce lien est justement disponible si l'auteur des actions * tombe sur cette page alors qu'il reste des actions à faire, ce qui * signale en général un problème) - * + * * @return string * Code HTML présentant les actions réalisées * Vide si rien ne s'est passé ! -**/ + **/ function svp_presenter_actions_realisees() { // presenter les traitements realises... si tel est le cas... include_spip('inc/svp_actionner'); diff --git a/formulaires/admin_plugin.php b/formulaires/admin_plugin.php index 48e5fa0..c199716 100644 --- a/formulaires/admin_plugin.php +++ b/formulaires/admin_plugin.php @@ -1,14 +1,16 @@ $xml)); - } - elseif (sql_countsel('spip_depots','xml_paquets='.sql_quote($xml))) { + } elseif (sql_countsel('spip_depots', 'xml_paquets=' . sql_quote($xml))) { // L'url est deja ajoutee $erreurs['xml_paquets'] = _T('svp:message_nok_depot_deja_ajoute', array('url' => $xml)); } + return $erreurs; } @@ -57,12 +58,12 @@ function formulaires_ajouter_depot_verifier_dist(){ * Ajoute le dépot. * Retourne une éventuelle erreur si le dépot a un XML mal formé * ou s'il n'a aucun plugin. - * + * * @uses svp_ajouter_depot() * @return array * Retours du traitement -**/ -function formulaires_ajouter_depot_traiter_dist(){ + **/ +function formulaires_ajouter_depot_traiter_dist() { include_spip('inc/svp_depoter_distant'); $retour = array(); @@ -75,11 +76,11 @@ function formulaires_ajouter_depot_traiter_dist(){ $ok = svp_ajouter_depot($xml, $erreur); // Determination des messages de retour - if (!$ok) + if (!$ok) { $retour['message_erreur'] = $erreur; - else { + } else { $retour['message_ok'] = _T('svp:message_ok_depot_ajoute', array('url' => $xml)); - spip_log("ACTION AJOUTER DEPOT (manuel) : url = ". $xml, 'svp_actions.' . _LOG_INFO); + spip_log("ACTION AJOUTER DEPOT (manuel) : url = " . $xml, 'svp_actions.' . _LOG_INFO); } $retour['editable'] = true; @@ -92,13 +93,13 @@ function formulaires_ajouter_depot_traiter_dist(){ * * Pour cela on tente de rapatrier le fichier distant * en local. Si on réussi, c'est bon. - * + * * @param string $url * URL du fichier xml de description du depot * @return bool * Le dépot est-il valide ? */ -function svp_verifier_adresse_depot($url){ +function svp_verifier_adresse_depot($url) { include_spip('inc/distant'); // evitons de recuperer 2 fois le XML demandé. // si on le recupere ici, il sera deja a jour pour le prochain copie_locale diff --git a/formulaires/charger_plugin.php b/formulaires/charger_plugin.php index f712747..9c6079d 100644 --- a/formulaires/charger_plugin.php +++ b/formulaires/charger_plugin.php @@ -8,16 +8,18 @@ * @license GPL * @package SPIP\SVP\Formulaires */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Chargement du formulaire de recherche et téléchargement de plugins * * @return array * Environnement du formulaire -**/ -function formulaires_charger_plugin_charger_dist(){ + **/ +function formulaires_charger_plugin_charger_dist() { return array( 'phrase' => _request('phrase'), 'categorie' => _request('categorie'), @@ -44,12 +46,12 @@ function formulaires_charger_plugin_charger_dist(){ * de conséquence. * * Si on reçoit une demande de confirmation, on sort sans lever d'erreur ! - * + * * @uses svp_decider_verifier_actions_demandees() * @return array * Tableau des erreurs -**/ -function formulaires_charger_plugin_verifier_dist(){ + **/ +function formulaires_charger_plugin_verifier_dist() { $erreurs = array(); $a_installer = array(); @@ -58,10 +60,10 @@ function formulaires_charger_plugin_verifier_dist(){ // Requete : Annulation des actions d'installation en cours // -- On vide la liste d'actions en cours set_request('_todo', ''); - + } elseif (_request('valider_actions')) { - - + + } elseif (_request('rechercher')) { // annuler les selections si nouvelle recherche set_request('ids_paquet', array()); @@ -72,28 +74,30 @@ function formulaires_charger_plugin_verifier_dist(){ // L'utilisateur a demande une installation multiple de paquets // -- on verifie la liste des id_paquets uniquement if ($id_paquets = _request('ids_paquet')) { - foreach ($id_paquets as $_id_paquet) + foreach ($id_paquets as $_id_paquet) { $a_installer[$_id_paquet] = 'geton'; + } } - } - else { + } else { // L'utilisateur a demande l'installation d'un paquet en cliquant sur le bouton en regard // du resume du plugin -> installer_paquet - if ($install = _request('installer_paquet')) - if ($id_paquet = key($install)) + if ($install = _request('installer_paquet')) { + if ($id_paquet = key($install)) { $a_installer[$id_paquet] = 'geton'; + } + } } - if (!$a_installer) + if (!$a_installer) { $erreurs['message_erreur'] = _T('svp:message_nok_aucun_plugin_selectionne'); - else { + } else { // On fait appel au decideur pour determiner la liste exacte des commandes apres // verification des dependances include_spip('inc/svp_decider'); svp_decider_verifier_actions_demandees($a_installer, $erreurs); } } - + return $erreurs; } @@ -102,18 +106,17 @@ function formulaires_charger_plugin_verifier_dist(){ * * Si une liste d'action est validée, on redirige de formulaire sur * l'action 'actionner' qui les traitera une par une. - * + * * @return array * Retours du traitement -**/ -function formulaires_charger_plugin_traiter_dist(){ + **/ +function formulaires_charger_plugin_traiter_dist() { $retour = array(); if (_request('rechercher') OR _request('annuler_actions')) { - } - elseif (_request('valider_actions')) { + } elseif (_request('valider_actions')) { #refuser_traiter_formulaire_ajax(); // Ajout de la liste des actions à l'actionneur // c'est lui qui va effectuer rellement les actions diff --git a/formulaires/charger_plugin_archive.php b/formulaires/charger_plugin_archive.php index 57c05ea..36aeead 100644 --- a/formulaires/charger_plugin_archive.php +++ b/formulaires/charger_plugin_archive.php @@ -7,19 +7,21 @@ * @license GPL * @package SPIP\SVP\Formulaires */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Chargement du formulaire de téléchargement de plugin * * @return array * Environnement du formulaire -**/ + **/ function formulaires_charger_plugin_archive_charger_dist() { return array( - 'archive' =>'', - 'destination' =>'' + 'archive' => '', + 'destination' => '' ); } @@ -28,11 +30,11 @@ function formulaires_charger_plugin_archive_charger_dist() { * * Vérifie qu'une archive est saisie, et si la destination existe * demande à confirmer l'écrasement - * + * * @return array * Tableau des erreurs -**/ -function formulaires_charger_plugin_archive_verifier_dist(){ + **/ +function formulaires_charger_plugin_archive_verifier_dist() { include_spip('inc/plugin'); // _DIR_PLUGINS_AUTO $erreurs = array(); if (!$archive = _request('archive')) { @@ -42,8 +44,7 @@ function formulaires_charger_plugin_archive_verifier_dist(){ $infos_archive = pathinfo($archive); if (!isset($infos_archive['extension'])) { $erreurs['archive'] = _T('svp:message_nok_url_archive'); - } - else { + } else { // calcul du répertoire de destination if (!$destination = _request('destination')) { $destination = $infos_archive['filename']; @@ -59,7 +60,8 @@ function formulaires_charger_plugin_archive_verifier_dist(){ $backup = "$base/.$nom.bck"; $erreurs['confirmer'] = _T("svp:confirmer_telecharger_dans", array( 'dir' => joli_repertoire($dir), - 'dir_backup' => joli_repertoire($backup))); + 'dir_backup' => joli_repertoire($backup) + )); } } } @@ -71,11 +73,11 @@ function formulaires_charger_plugin_archive_verifier_dist(){ * Traitement du formulaire de téléchargement de plugin * * Télécharge le plugin via le téléporteur et rend la main. - * + * * @return array * Retours du traitement -**/ -function formulaires_charger_plugin_archive_traiter_dist(){ + **/ +function formulaires_charger_plugin_archive_traiter_dist() { $retour = array(); $archive = _request('archive'); @@ -88,9 +90,10 @@ function formulaires_charger_plugin_archive_traiter_dist(){ $retour['message_erreur'] = $ok; } else { $retour['message_ok'] = _T('svp:message_telechargement_archive_effectue', - array('dir' => joli_repertoire( _DIR_PLUGINS_AUTO . $dest ))); + array('dir' => joli_repertoire(_DIR_PLUGINS_AUTO . $dest))); } $retour['editable'] = true; + return $retour; } diff --git a/formulaires/editer_depot.php b/formulaires/editer_depot.php index a845da1..75e3ce0 100644 --- a/formulaires/editer_depot.php +++ b/formulaires/editer_depot.php @@ -7,8 +7,10 @@ * @license GPL * @package SPIP\SVP\Formulaires */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} include_spip('inc/editer'); @@ -21,9 +23,10 @@ include_spip('inc/editer'); * URL de redirection * @return array * Environnement du formulaire -**/ -function formulaires_editer_depot_charger_dist($id_depot, $redirect){ + **/ +function formulaires_editer_depot_charger_dist($id_depot, $redirect) { $valeurs = formulaires_editer_objet_charger('depot', $id_depot, 0, 0, $redirect, 'depots_edit_config'); + return $valeurs; } @@ -36,9 +39,10 @@ function formulaires_editer_depot_charger_dist($id_depot, $redirect){ * URL de redirection * @return array * Tableau des erreurs -**/ -function formulaires_editer_depot_verifier_dist($id_depot, $redirect){ + **/ +function formulaires_editer_depot_verifier_dist($id_depot, $redirect) { $erreurs = formulaires_editer_objet_verifier('depot', $id_depot, array('titre')); + return $erreurs; } @@ -51,8 +55,8 @@ function formulaires_editer_depot_verifier_dist($id_depot, $redirect){ * URL de redirection * @return array * Retours du traitement -**/ -function formulaires_editer_depot_traiter_dist($id_depot, $redirect){ + **/ +function formulaires_editer_depot_traiter_dist($id_depot, $redirect) { return formulaires_editer_objet_traiter('depot', $id_depot, 0, 0, $redirect); } @@ -64,14 +68,14 @@ function formulaires_editer_depot_traiter_dist($id_depot, $redirect){ * @return array * Tableau de configurations qui seront ajoutés à l'environnement * du formulaire sous la clé 'config' -**/ -function depots_edit_config($row) -{ + **/ +function depots_edit_config($row) { global $spip_ecran, $spip_lang; $config = $GLOBALS['meta']; $config['lignes'] = ($spip_ecran == "large") ? 8 : 5; $config['langue'] = $spip_lang; + return $config; } diff --git a/formulaires/inc-admin_plugin_fonctions.php b/formulaires/inc-admin_plugin_fonctions.php index 695cea3..df72047 100644 --- a/formulaires/inc-admin_plugin_fonctions.php +++ b/formulaires/inc-admin_plugin_fonctions.php @@ -1,28 +1,30 @@ "; - // -------------------------------------------------------------------------------- - function PclTarList($p_tarname, $p_mode = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarList", "tar=$p_tarname, mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = PclTarHandleExtract($p_tarname, 0, $p_list, "list", "", $p_mode, "")) != 1) - { - unset($p_list); - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarExtract() - // Description : - // Extract all the files present in the archive $p_tarname, in the directory - // $p_path. The relative path of the archived files are keep and become - // relative to $p_path. - // If a file with the same name already exists it will be replaced. - // If the path to the file does not exist, it will be created. - // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the - // function will determine the type of the archive. - // Parameters : - // $p_tarname : Name of an existing tar file. - // $p_path : Path where the files will be extracted. The files will use - // their memorized path from $p_path. - // If $p_path is "", files will be extracted in "./". - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_path and $p_remove_path are commulative. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // Return Values : - // Same as PclTarList() - // -------------------------------------------------------------------------------- - function PclTarExtract($p_tarname, $p_path = "./", $p_remove_path = "", $p_mode = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarExtract", "tar='$p_tarname', path='$p_path', remove_path='$p_remove_path', mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Call the extracting fct - if (($v_result = PclTarHandleExtract($p_tarname, 0, $p_list, "complete", $p_path, $v_tar_mode, $p_remove_path)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarExtractList() - // Description : - // Extract the files present in the archive $p_tarname and specified in - // $p_filelist, in the directory - // $p_path. The relative path of the archived files are keep and become - // relative to $p_path. - // If a directory is sp�cified in the list, all the files from this directory - // will be extracted. - // If a file with the same name already exists it will be replaced. - // If the path to the file does not exist, it will be created. - // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the - // function will determine the type of the archive. - // Parameters : - // $p_tarname : Name of an existing tar file - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_path : Path where the files will be extracted. The files will use - // their memorized path from $p_path. - // If $p_path is "", files will be extracted in "./". - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_path and $p_remove_path are commulative. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // Return Values : - // Same as PclTarList() - // -------------------------------------------------------------------------------- - function PclTarExtractList($p_tarname, $p_filelist, $p_path = "./", $p_remove_path = "", $p_mode = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarExtractList", "tar=$p_tarname, list, path=$p_path, remove_path='$p_remove_path', mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) - { - // ----- Call the extracting fct - if (($v_result = PclTarHandleExtract($p_tarname, $p_filelist, $p_list, "partial", $p_path, $v_tar_mode, $p_remove_path)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) - { - // ----- Create a list with the elements from the string - $v_list = explode(" ", $p_filelist); - - // ----- Call the extracting fct - if (($v_result = PclTarHandleExtract($p_tarname, $v_list, $p_list, "partial", $p_path, $v_tar_mode, $p_remove_path)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclErrorLog(-3, "Invalid variable type p_filelist"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarExtractIndex() - // Description : - // Extract the files present in the archive $p_tarname and specified at - // the indexes in $p_index, in the directory - // $p_path. The relative path of the archived files are keep and become - // relative to $p_path. - // If a directory is specified in the list, the directory only is created. All - // the file stored in this archive for this directory - // are not extracted. - // If a file with the same name already exists it will be replaced. - // If the path to the file does not exist, it will be created. - // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the - // function will determine the type of the archive. - // Parameters : - // $p_tarname : Name of an existing tar file - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files will be extracted. The files will use - // their memorized path from $p_path. - // If $p_path is "", files will be extracted in "./". - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_path and $p_remove_path are commulative. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // Return Values : - // Same as PclTarList() - // -------------------------------------------------------------------------------- - function PclTarExtractIndex($p_tarname, $p_index, $p_path = "./", $p_remove_path = "", $p_mode = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarExtractIndex", "tar=$p_tarname, index='$p_index', path=$p_path, remove_path='$p_remove_path', mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Look if the $p_index is really an integer - if (is_integer($p_index)) - { - // ----- Call the extracting fct - if (($v_result = PclTarHandleExtractByIndexList($p_tarname, "$p_index", $p_list, $p_path, $p_remove_path, $v_tar_mode)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_index)) - { - // ----- Call the extracting fct - if (($v_result = PclTarHandleExtractByIndexList($p_tarname, $p_index, $p_list, $p_path, $p_remove_path, $v_tar_mode)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclErrorLog(-3, "Invalid variable type $p_index"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarDelete() - // Description : - // This function deletes from the archive $p_tarname the files which are listed - // in $p_filelist. $p_filelist can be a string with file names separated by - // spaces, or an array containing the file names. - // Parameters : - // $p_tarname : Name of an existing tar file - // $p_filelist : An array or a string containing file names to remove from the - // archive. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // Return Values : - // List of the files which are kept in the archive (same format as PclTarList()) - // -------------------------------------------------------------------------------- - function PclTarDelete($p_tarname, $p_filelist, $p_mode = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarDelete", "tar='$p_tarname', list='$p_filelist', mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) - { - // ----- Call the extracting fct - if (($v_result = PclTarHandleDelete($p_tarname, $p_filelist, $p_list, $p_mode)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) - { - // ----- Create a list with the elements from the string - $v_list = explode(" ", $p_filelist); - - // ----- Call the extracting fct - if (($v_result = PclTarHandleDelete($p_tarname, $v_list, $p_list, $p_mode)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclErrorLog(-3, "Invalid variable type p_filelist"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarUpdate() - // Description : - // This function updates the files in $p_filelist which are already in the - // $p_tarname archive with an older last modified date. If the file does not - // exist, it is added at the end of the archive. - // Parameters : - // $p_tarname : Name of an existing tar file - // $p_filelist : An array or a string containing file names to update from the - // archive. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // Return Values : - // List of the files contained in the archive. The field status contains - // "updated", "not_updated", "added" or "ok" for the files not concerned. - // -------------------------------------------------------------------------------- - function PclTarUpdate($p_tarname, $p_filelist, $p_mode = "", $p_add_dir = "", $p_remove_dir = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarUpdate", "tar='$p_tarname', list='$p_filelist', mode='$p_mode'"); - $v_result=1; - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } + // ----- Global variables + $g_pcltar_version = "1.3.1"; + + // ----- Extract extension type (.php3/.php/...) + $g_pcltar_extension = "php"; + + // ----- Include other libraries + // This library should be called by each script before the include of PhpZip + // Library in order to limit the potential 'lib' directory path problem. + if (!defined("PCLERROR_LIB")) { + include($g_pcltar_lib_dir . "/pclerror.lib." . $g_pcltar_extension); + } + if (!defined("PCLTRACE_LIB")) { + include($g_pcltar_lib_dir . "/pcltrace.lib." . $g_pcltar_extension); + } + + // -------------------------------------------------------------------------------- + // Function : PclTarCreate() + // Description : + // Creates a new archive with name $p_tarname containing the files and/or + // directories indicated in $p_list. If the tar filename extension is + // ".tar", the file will not be compressed. If it is ".tar.gz" or ".tgz" + // it will be a gzip compressed tar archive. + // If you want to use an other extension, you must indicate the mode in + // $p_mode ("tar" or "tgz"). + // $p_add_dir and $p_remove_dir give you the ability to store a path + // which is not the real path of the files. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive, + // if $p_mode is not specified, it will be determined by the extension. + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // 1 on success, or an error code (see table at the beginning). + // -------------------------------------------------------------------------------- + function PclTarCreate($p_tarname, $p_filelist = "", $p_mode = "", $p_add_dir = "", $p_remove_dir = "") { + TrFctStart(__FILE__, __LINE__, "PclTarCreate", + "tar=$p_tarname, file='$p_filelist', mode=$p_mode, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result = 1; + + // ----- Look for default mode + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + // ----- Extract the tar format from the extension + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 1, "Auto mode selected : found $p_mode"); + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the create fct + $v_result = PclTarHandleCreate($p_tarname, $p_filelist, $p_mode, $p_add_dir, $p_remove_dir); + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the create fct + $v_result = PclTarHandleCreate($p_tarname, $v_list, $p_mode, $p_add_dir, $p_remove_dir); + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + $v_result = -3; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarAdd() + // Description : + // PLEASE DO NOT USE ANY MORE THIS FUNCTION. Use PclTarAddList(). + // + // This function is maintained only for compatibility reason + // + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // Return Values : + // 1 on success, + // Or an error code (see list on top). + // -------------------------------------------------------------------------------- + function PclTarAdd($p_tarname, $p_filelist) { + TrFctStart(__FILE__, __LINE__, "PclTarAdd", "tar=$p_tarname, file=$p_filelist"); + $v_result = 1; + $v_list_detail = array(); + + // ----- Extract the tar format from the extension + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the add fct + $v_result = PclTarHandleAppend($p_tarname, $p_filelist, $p_mode, $v_list_detail, "", ""); + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the add fct + $v_result = PclTarHandleAppend($p_tarname, $v_list, $p_mode, $v_list_detail, "", ""); + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + $v_result = -3; + } + } + + // ----- Cleaning + unset($v_list_detail); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarAddList() + // Description : + // Add a list of files or directories ($p_filelist) in the tar archive $p_tarname. + // The list can be an array of file/directory names or a string with names + // separated by one space. + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // If $p_mode is not set it will be automatically computed from the $p_tarname + // extension (.tar, .tar.gz or .tgz). + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // 1 on success, + // Or an error code (see list on top). + // -------------------------------------------------------------------------------- + function PclTarAddList($p_tarname, $p_filelist, $p_add_dir = "", $p_remove_dir = "", $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarAddList", + "tar=$p_tarname, file=$p_filelist, p_add_dir='$p_add_dir', p_remove_dir='$p_remove_dir', mode=$p_mode"); + $v_result = 1; + $p_list_detail = array(); + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the add fct + $v_result = PclTarHandleAppend($p_tarname, $p_filelist, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir); + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the add fct + $v_result = PclTarHandleAppend($p_tarname, $v_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir); + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + $v_result = -3; + } + } + + // ----- Return + if ($v_result != 1) { + TrFctEnd(__FILE__, __LINE__, 0); + + return 0; + } + TrFctEnd(__FILE__, __LINE__, $p_list_detail); + + return $p_list_detail; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarList() + // Description : + // Gives the list of all the files present in the tar archive $p_tarname. + // The list is the function result, it will be 0 on error. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // 0 on error (Use PclErrorCode() and PclErrorString() for more info) + // or + // An array containing file properties. Each file properties is an array of + // properties. + // The properties (array field names) are : + // filename, size, mode, uid, gid, mtime, typeflag, status + // Exemple : $v_list = PclTarList("my.tar"); + // for ($i=0; $i"; + // -------------------------------------------------------------------------------- + function PclTarList($p_tarname, $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarList", "tar=$p_tarname, mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = PclTarHandleExtract($p_tarname, 0, $p_list, "list", "", $p_mode, "")) != 1) { + unset($p_list); + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtract() + // Description : + // Extract all the files present in the archive $p_tarname, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtract($p_tarname, $p_path = "./", $p_remove_path = "", $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarExtract", + "tar='$p_tarname', path='$p_path', remove_path='$p_remove_path', mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, 0, $p_list, "complete", $p_path, $v_tar_mode, + $p_remove_path)) != 1 + ) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtractList() + // Description : + // Extract the files present in the archive $p_tarname and specified in + // $p_filelist, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a directory is sp�cified in the list, all the files from this directory + // will be extracted. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtractList($p_tarname, $p_filelist, $p_path = "./", $p_remove_path = "", $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarExtractList", + "tar=$p_tarname, list, path=$p_path, remove_path='$p_remove_path', mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, $p_filelist, $p_list, "partial", $p_path, $v_tar_mode, + $p_remove_path)) != 1 + ) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, $v_list, $p_list, "partial", $p_path, $v_tar_mode, + $p_remove_path)) != 1 + ) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtractIndex() + // Description : + // Extract the files present in the archive $p_tarname and specified at + // the indexes in $p_index, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a directory is specified in the list, the directory only is created. All + // the file stored in this archive for this directory + // are not extracted. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtractIndex($p_tarname, $p_index, $p_path = "./", $p_remove_path = "", $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarExtractIndex", + "tar=$p_tarname, index='$p_index', path=$p_path, remove_path='$p_remove_path', mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Look if the $p_index is really an integer + if (is_integer($p_index)) { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtractByIndexList($p_tarname, "$p_index", $p_list, $p_path, $p_remove_path, + $v_tar_mode)) != 1 + ) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_index)) { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtractByIndexList($p_tarname, $p_index, $p_list, $p_path, $p_remove_path, + $v_tar_mode)) != 1 + ) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type $p_index"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarDelete() + // Description : + // This function deletes from the archive $p_tarname the files which are listed + // in $p_filelist. $p_filelist can be a string with file names separated by + // spaces, or an array containing the file names. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array or a string containing file names to remove from the + // archive. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // List of the files which are kept in the archive (same format as PclTarList()) + // -------------------------------------------------------------------------------- + function PclTarDelete($p_tarname, $p_filelist, $p_mode = "") { + TrFctStart(__FILE__, __LINE__, "PclTarDelete", "tar='$p_tarname', list='$p_filelist', mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the extracting fct + if (($v_result = PclTarHandleDelete($p_tarname, $p_filelist, $p_list, $p_mode)) != 1) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleDelete($p_tarname, $v_list, $p_list, $p_mode)) != 1) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarUpdate() + // Description : + // This function updates the files in $p_filelist which are already in the + // $p_tarname archive with an older last modified date. If the file does not + // exist, it is added at the end of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array or a string containing file names to update from the + // archive. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // List of the files contained in the archive. The field status contains + // "updated", "not_updated", "added" or "ok" for the files not concerned. + // -------------------------------------------------------------------------------- + function PclTarUpdate($p_tarname, $p_filelist, $p_mode = "", $p_add_dir = "", $p_remove_dir = "") { + TrFctStart(__FILE__, __LINE__, "PclTarUpdate", "tar='$p_tarname', list='$p_filelist', mode='$p_mode'"); + $v_result = 1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Call the extracting fct + if (($v_result = PclTarHandleUpdate($p_tarname, $p_filelist, $p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleUpdate($p_tarname, $v_list, $p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + + return (0); + } + } // ----- Invalid variable + else { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + + return $p_list; + } + + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : PclTarMerge() + // Description : + // This function add the content of $p_tarname_add at the end of $p_tarname. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_tarname_add : Name of an existing tar file taht will be added at the end + // of $p_tarname. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // $p_mode_add : 'tar' or 'tgz', if not set, will be determined by $p_tarname_add + // extension + // Return Values : + // List of the files contained in the archive. The field status contains + // "updated", "not_updated", "added" or "ok" for the files not concerned. + // -------------------------------------------------------------------------------- + function PclTarMerge($p_tarname, $p_tarname_add, $p_mode = "", $p_mode_add = "") { + TrFctStart(__FILE__, __LINE__, "PclTarMerge", + "tar='$p_tarname', tar_add='$p_tarname_add', mode='$p_mode', mode_add='$p_mode_add'"); + $v_result = 1; + + // ----- Check the parameters + if (($p_tarname == "") || ($p_tarname_add == "")) { + // ----- Error log + PclErrorLog(-3, "Invalid empty archive name"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + if (($p_mode_add == "") || (($p_mode_add != "tar") && ($p_mode_add != "tgz"))) { + if (($p_mode_add = PclTarHandleExtension($p_tarname_add)) == "") { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return 0; + } + } + + // ----- Clear filecache + clearstatcache(); + + // ----- Check the file size + if ((!is_file($p_tarname)) || + (((($v_size = filesize($p_tarname))%512) != 0) && ($p_mode == "tar")) + ) { + // ----- Error log + if (!is_file($p_tarname)) { + PclErrorLog(-4, "Archive '$p_tarname' does not exist"); + } else { + PclErrorLog(-6, "Archive '$p_tarname' has invalid size " . filesize($p_tarname) . "(not a 512 block multiple)"); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + if ((!is_file($p_tarname_add)) || + (((($v_size_add = filesize($p_tarname_add))%512) != 0) && ($p_mode_add == "tar")) + ) { + // ----- Error log + if (!is_file($p_tarname_add)) { + PclErrorLog(-4, "Archive '$p_tarname_add' does not exist"); + } else { + PclErrorLog(-6, + "Archive '$p_tarname_add' has invalid size " . filesize($p_tarname_add) . "(not a 512 block multiple)"); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Look for compressed archive + if ($p_mode == "tgz") { + // ----- Open the file in read mode + if (($p_tar = @gzopen($p_tarname, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-") . ".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) { + // ----- Close tar file + gzclose($p_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = gzread($p_tar, 512); + + // ----- Read the following blocks but not the last one + if (!gzeof($p_tar)) { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i = 1; + + // ----- Read new 512 block and write the already read + do { + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + gzputs($v_temp_tar, $v_binary_data); + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = gzread($p_tar, 512); + + } while (!gzeof($p_tar)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + } // ----- Look for uncompressed tar file + else { + if ($p_mode == "tar") { + // ----- Open the tar file + if (($p_tar = fopen($p_tarname, "r+b")) == 0) { + // ----- Error log + PclErrorLog(-1, "Unable to open file '$p_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Go to the beginning of last block + TrFctMessage(__FILE__, __LINE__, 4, "Position before :" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + fseek($p_tar, $v_size-512); + TrFctMessage(__FILE__, __LINE__, 4, "Position after :" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + } // ----- Look for unknown type + else { + // ----- Error log + PclErrorLog(-3, "Invalid tar mode $p_mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + } + + // ----- Look for type of archive to add + if ($p_mode_add == "tgz") { + TrFctMessage(__FILE__, __LINE__, 4, "Opening file $p_tarname_add"); + + // ----- Open the file in read mode + if (($p_tar_add = @gzopen($p_tarname_add, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = gzread($p_tar_add, 512); + + // ----- Read the following blocks but not the last one + if (!gzeof($p_tar_add)) { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i = 1; + + // ----- Read new 512 block and write the already read + do { + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data); + } else { + gzputs($v_temp_tar, $v_binary_data); + } + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = gzread($p_tar_add, 512); + + } while (!gzeof($p_tar_add)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + + // ----- Close the files + gzclose($p_tar_add); + } // ----- Look for uncompressed tar file + else { + if ($p_mode == "tar") { + // ----- Open the file in read mode + if (($p_tar_add = @fopen($p_tarname_add, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = fread($p_tar_add, 512); + + // ----- Read the following blocks but not the last one + if (!feof($p_tar_add)) { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i = 1; + + // ----- Read new 512 block and write the already read + do { + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data); + } else { + gzputs($v_temp_tar, $v_binary_data); + } + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = fread($p_tar_add, 512); + + } while (!feof($p_tar_add)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + + // ----- Close the files + fclose($p_tar_add); + } + } + + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($p_tar, $p_mode); + + // ----- Look for closing compressed archive + if ($p_mode == "tgz") { + // ----- Close the files + gzclose($p_tar); + gzclose($v_temp_tar); - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) - { - // ----- Call the extracting fct - if (($v_result = PclTarHandleUpdate($p_tarname, $p_filelist, $p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) - { - // ----- Create a list with the elements from the string - $v_list = explode(" ", $p_filelist); - - // ----- Call the extracting fct - if (($v_result = PclTarHandleUpdate($p_tarname, $v_list, $p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) - { - TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); - return(0); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclErrorLog(-3, "Invalid variable type p_filelist"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : PclTarMerge() - // Description : - // This function add the content of $p_tarname_add at the end of $p_tarname. - // Parameters : - // $p_tarname : Name of an existing tar file - // $p_tarname_add : Name of an existing tar file taht will be added at the end - // of $p_tarname. - // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension - // $p_mode_add : 'tar' or 'tgz', if not set, will be determined by $p_tarname_add - // extension - // Return Values : - // List of the files contained in the archive. The field status contains - // "updated", "not_updated", "added" or "ok" for the files not concerned. - // -------------------------------------------------------------------------------- - function PclTarMerge($p_tarname, $p_tarname_add, $p_mode = "", $p_mode_add = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarMerge", "tar='$p_tarname', tar_add='$p_tarname_add', mode='$p_mode', mode_add='$p_mode_add'"); - $v_result=1; - - // ----- Check the parameters - if (($p_tarname == "") || ($p_tarname_add == "")) - { - // ----- Error log - PclErrorLog(-3, "Invalid empty archive name"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Extract the tar format from the extension - if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) - { - if (($p_mode = PclTarHandleExtension($p_tarname)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - if (($p_mode_add == "") || (($p_mode_add!="tar") && ($p_mode_add!="tgz"))) - { - if (($p_mode_add = PclTarHandleExtension($p_tarname_add)) == "") - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return 0; - } - } - - // ----- Clear filecache - clearstatcache(); - - // ----- Check the file size - if ((!is_file($p_tarname)) || - (((($v_size = filesize($p_tarname)) % 512) != 0) && ($p_mode=="tar"))) - { - // ----- Error log - if (!is_file($p_tarname)) - PclErrorLog(-4, "Archive '$p_tarname' does not exist"); - else - PclErrorLog(-6, "Archive '$p_tarname' has invalid size ".filesize($p_tarname)."(not a 512 block multiple)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - if ((!is_file($p_tarname_add)) || - (((($v_size_add = filesize($p_tarname_add)) % 512) != 0) && ($p_mode_add=="tar"))) - { - // ----- Error log - if (!is_file($p_tarname_add)) - PclErrorLog(-4, "Archive '$p_tarname_add' does not exist"); - else - PclErrorLog(-6, "Archive '$p_tarname_add' has invalid size ".filesize($p_tarname_add)."(not a 512 block multiple)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } + // ----- Unlink tar file + if (!@unlink($p_tarname)) { + // ----- Error log + PclErrorLog(-11, "Error while deleting archive name $p_tarname"); + } - // ----- Look for compressed archive - if ($p_mode == "tgz") - { - // ----- Open the file in read mode - if (($p_tar = @gzopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - gzclose($p_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Read the first 512 bytes block - $v_buffer = gzread($p_tar, 512); - - // ----- Read the following blocks but not the last one - if (!gzeof($p_tar)) - { - TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); - $i=1; - - // ----- Read new 512 block and write the already read - do{ - // ----- Write the already read block - $v_binary_data = pack("a512", "$v_buffer"); - gzputs($v_temp_tar, $v_binary_data); - - $i++; - TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); - - // ----- Read next block - $v_buffer = gzread($p_tar, 512); - - } while (!gzeof($p_tar)); - - TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); - } - } + // ----- Rename tar file + if (!@rename($v_temp_tarname, $p_tarname)) { + // ----- Error log + PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); - // ----- Look for uncompressed tar file - else if ($p_mode=="tar") - { - // ----- Open the tar file - if (($p_tar = fopen($p_tarname, "r+b")) == 0) - { - // ----- Error log - PclErrorLog(-1, "Unable to open file '$p_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Go to the beginning of last block - TrFctMessage(__FILE__, __LINE__, 4, "Position before :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - fseek($p_tar, $v_size-512); - TrFctMessage(__FILE__, __LINE__, 4, "Position after :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - } + return $v_result; + } // ----- Look for closing uncompressed tar file + else { + if ($p_mode == "tar") { + // ----- Close the tarfile + fclose($p_tar); + } + } - // ----- Look for unknown type - else - { - // ----- Error log - PclErrorLog(-3, "Invalid tar mode $p_mode"); + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } + return $v_result; + } - // ----- Look for type of archive to add - if ($p_mode_add == "tgz") - { - TrFctMessage(__FILE__, __LINE__, 4, "Opening file $p_tarname_add"); - - // ----- Open the file in read mode - if (($p_tar_add = @gzopen($p_tarname_add, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Read the first 512 bytes block - $v_buffer = gzread($p_tar_add, 512); - - // ----- Read the following blocks but not the last one - if (!gzeof($p_tar_add)) - { - TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); - $i=1; - - // ----- Read new 512 block and write the already read - do{ - // ----- Write the already read block - $v_binary_data = pack("a512", "$v_buffer"); - if ($p_mode=="tar") - fputs($p_tar, $v_binary_data); - else - gzputs($v_temp_tar, $v_binary_data); - - $i++; - TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); - - // ----- Read next block - $v_buffer = gzread($p_tar_add, 512); - - } while (!gzeof($p_tar_add)); - - TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); - } - - // ----- Close the files - gzclose($p_tar_add); - } - - // ----- Look for uncompressed tar file - else if ($p_mode=="tar") - { - // ----- Open the file in read mode - if (($p_tar_add = @fopen($p_tarname_add, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Read the first 512 bytes block - $v_buffer = fread($p_tar_add, 512); - - // ----- Read the following blocks but not the last one - if (!feof($p_tar_add)) - { - TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); - $i=1; - - // ----- Read new 512 block and write the already read - do{ - // ----- Write the already read block - $v_binary_data = pack("a512", "$v_buffer"); - if ($p_mode=="tar") - fputs($p_tar, $v_binary_data); - else - gzputs($v_temp_tar, $v_binary_data); - - $i++; - TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); - - // ----- Read next block - $v_buffer = fread($p_tar_add, 512); - - } while (!feof($p_tar_add)); - - TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); - } - - // ----- Close the files - fclose($p_tar_add); - } - - // ----- Call the footer of the tar archive - $v_result = PclTarHandleFooter($p_tar, $p_mode); - - // ----- Look for closing compressed archive - if ($p_mode == "tgz") - { - // ----- Close the files - gzclose($p_tar); - gzclose($v_temp_tar); - - // ----- Unlink tar file - if (!@unlink($p_tarname)) - { - // ----- Error log - PclErrorLog(-11, "Error while deleting archive name $p_tarname"); - } - - // ----- Rename tar file - if (!@rename($v_temp_tarname, $p_tarname)) - { - // ----- Error log - PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for closing uncompressed tar file - else if ($p_mode=="tar") - { - // ----- Close the tarfile - fclose($p_tar); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- @@ -1033,2343 +1012,2301 @@ if (!defined("PCL_TAR")) // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleCreate() - // Description : - // Parameters : - // $p_tarname : Name of the tar file - // $p_list : An array containing the file or directory names to add in the tar - // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleCreate($p_tarname, $p_list, $p_mode, $p_add_dir = "", $p_remove_dir = "") - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleCreate", "tar=$p_tarname, list, mode=$p_mode, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); - $v_result=1; - $v_list_detail = array(); - - // ----- Check the parameters - if (($p_tarname == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) - { - // ----- Error log - if ($p_tarname == "") - PclErrorLog(-3, "Invalid empty archive name"); - else - PclErrorLog(-3, "Unknown mode '$p_mode'"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Look for tar file - if ($p_mode == "tar") - { - // ----- Open the tar file - if (($p_tar = fopen($p_tarname, "wb")) == 0) - { - // ----- Error log - PclErrorLog(-1, "Unable to open file [$p_tarname] in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Call the adding fct inside the tar - if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $v_list_detail, $p_add_dir, $p_remove_dir)) == 1) - { - // ----- Call the footer of the tar archive - $v_result = PclTarHandleFooter($p_tar, $p_mode); - } - - // ----- Close the tarfile - fclose($p_tar); - } - // ----- Look for tgz file - else - { - // ----- Open the tar file - if (($p_tar = @gzopen($p_tarname, "wb")) == 0) - { - // ----- Error log - PclErrorLog(-1, "Unable to open file [$p_tarname] in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Call the adding fct inside the tar - if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $v_list_detail, $p_add_dir, $p_remove_dir)) == 1) - { - // ----- Call the footer of the tar archive - $v_result = PclTarHandleFooter($p_tar, $p_mode); - } - - // ----- Close the tarfile - gzclose($p_tar); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleAppend() - // Description : - // Parameters : - // $p_tarname : Name of the tar file - // $p_list : An array containing the file or directory names to add in the tar - // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleAppend($p_tarname, $p_list, $p_mode, &$p_list_detail, $p_add_dir, $p_remove_dir) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleAppend", "tar=$p_tarname, list, mode=$p_mode"); - $v_result=1; - - // ----- Check the parameters - if ($p_tarname == "") - { - // ----- Error log - PclErrorLog(-3, "Invalid empty archive name"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - clearstatcache(); - - // ----- Check the file size - if ((!is_file($p_tarname)) || - (((($v_size = filesize($p_tarname)) % 512) != 0) && ($p_mode=="tar"))) - { - // ----- Error log - if (!is_file($p_tarname)) - PclErrorLog(-4, "Archive '$p_tarname' does not exist"); - else - PclErrorLog(-6, "Archive '$p_tarname' has invalid size ".filesize($p_tarname)."(not a 512 block multiple)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Look for compressed archive - if ($p_mode == "tgz") - { - // ----- Open the file in read mode - if (($p_tar = @gzopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - gzclose($p_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Read the first 512 bytes block - $v_buffer = gzread($p_tar, 512); - - // ----- Read the following blocks but not the last one - if (!gzeof($p_tar)) - { - TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); - $i=1; - - // ----- Read new 512 block and write the already read - do{ - // ----- Write the already read block - $v_binary_data = pack("a512", "$v_buffer"); - gzputs($v_temp_tar, $v_binary_data); - - $i++; - TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); - - // ----- Read next block - $v_buffer = gzread($p_tar, 512); - - } while (!gzeof($p_tar)); - - TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); - } - - // ----- Call the adding fct inside the tar - if (($v_result = PclTarHandleAddList($v_temp_tar, $p_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir)) == 1) - { - // ----- Call the footer of the tar archive - $v_result = PclTarHandleFooter($v_temp_tar, $p_mode); - } - - // ----- Close the files - gzclose($p_tar); - gzclose($v_temp_tar); - - // ----- Unlink tar file - if (!@unlink($p_tarname)) - { - // ----- Error log - PclErrorLog(-11, "Error while deleting archive name $p_tarname"); - } - - // ----- Rename tar file - if (!@rename($v_temp_tarname, $p_tarname)) - { - // ----- Error log - PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for uncompressed tar file - else if ($p_mode=="tar") - { - // ----- Open the tar file - if (($p_tar = fopen($p_tarname, "r+b")) == 0) - { - // ----- Error log - PclErrorLog(-1, "Unable to open file '$p_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Go to the beginning of last block - TrFctMessage(__FILE__, __LINE__, 4, "Position before :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - fseek($p_tar, $v_size-512); - TrFctMessage(__FILE__, __LINE__, 4, "Position after :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - - // ----- Call the adding fct inside the tar - if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir)) == 1) - { - // ----- Call the footer of the tar archive - $v_result = PclTarHandleFooter($p_tar, $p_mode); - } - - // ----- Close the tarfile - fclose($p_tar); - } - - // ----- Look for unknown type - else - { - // ----- Error log - PclErrorLog(-3, "Invalid tar mode $p_mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_tar : File descriptor of the tar archive - // $p_list : An array containing the file or directory names to add in the tar - // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive - // $p_list_detail : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleAddList($p_tar, $p_list, $p_mode, &$p_list_detail, $p_add_dir, $p_remove_dir) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleAddList", "tar='$p_tar', list, mode='$p_mode', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_list_detail); - - // ----- Check the parameters - if ($p_tar == 0) - { - // ----- Error log - PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Check the arguments - if (sizeof($p_list) == 0) - { - // ----- Error log - PclErrorLog(-3, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Loop on the files - for ($j=0; ($j 99) - { - // ----- Error log - PclErrorLog(-5, "File name is too long (max. 99) : '$p_filename'"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - TrFctMessage(__FILE__, __LINE__, 4, "File position before header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - - // ----- Add the file - if (($v_result = PclTarHandleAddFile($p_tar, $p_filename, $p_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) - { - // ----- Return status - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the file infos - $p_list_detail[$v_nb++] = $v_header; - - // ----- Look for directory - if (is_dir($p_filename)) - { - TrFctMessage(__FILE__, __LINE__, 2, "$p_filename is a directory"); - - // ----- Look for path - if ($p_filename != ".") - $v_path = $p_filename."/"; - else - $v_path = ""; - - // ----- Read the directory for files and sub-directories - $p_hdir = opendir($p_filename); - $p_hitem = readdir($p_hdir); // '.' directory - $p_hitem = readdir($p_hdir); // '..' directory - while ($p_hitem = readdir($p_hdir)) - { - // ----- Look for a file - if (is_file($v_path.$p_hitem)) - { - TrFctMessage(__FILE__, __LINE__, 4, "Add the file '".$v_path.$p_hitem."'"); - - // ----- Add the file - if (($v_result = PclTarHandleAddFile($p_tar, $v_path.$p_hitem, $p_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) - { - // ----- Return status - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the file infos - $p_list_detail[$v_nb++] = $v_header; - } - - // ----- Recursive call to PclTarHandleAddFile() - else - { - TrFctMessage(__FILE__, __LINE__, 4, "'".$v_path.$p_hitem."' is a directory"); - - // ----- Need an array as parameter - $p_temp_list[0] = $v_path.$p_hitem; - $v_result = PclTarHandleAddList($p_tar, $p_temp_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir); - } - } - - // ----- Free memory for the recursive loop - unset($p_temp_list); - unset($p_hdir); - unset($p_hitem); - } - else - { - TrFctMessage(__FILE__, __LINE__, 4, "File position after blocks =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - } - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleAddFile($p_tar, $p_filename, $p_mode, &$p_header, $p_add_dir, $p_remove_dir) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleAddFile", "tar='$p_tar', filename='$p_filename', p_mode='$p_mode', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); - $v_result=1; - - // ----- Check the parameters - if ($p_tar == 0) - { - // ----- Error log - PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Skip empty file names - if ($p_filename == "") - { - // ----- Error log - PclErrorLog(-3, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - if ($p_remove_dir != "") - { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) - { - if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) - $p_remove_dir = "./".$p_remove_dir; - if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) - $p_remove_dir = substr($p_remove_dir, 2); - } - - if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) - { - $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); - TrFctMessage(__FILE__, __LINE__, 3, "Remove path '$p_remove_dir' in file '$p_filename' = '$v_stored_filename'"); - } - } - if ($p_add_dir != "") - { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - TrFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'"); - } - - // ----- Check the path length - if (strlen($v_stored_filename) > 99) - { - // ----- Error log - PclErrorLog(-5, "Stored file name is too long (max. 99) : '$v_stored_filename'"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Look for a file - if (is_file($p_filename)) - { - // ----- Open the source file - if (($v_file = fopen($p_filename, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_filename' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Call the header generation - if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) - { - // ----- Return status - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - TrFctMessage(__FILE__, __LINE__, 4, "File position after header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - - // ----- Read the file by 512 octets blocks - $i=0; - while (($v_buffer = fread($v_file, 512)) != "") - { - $v_binary_data = pack("a512", "$v_buffer"); - if ($p_mode == "tar") - fputs($p_tar, $v_binary_data); - else - gzputs($p_tar, $v_binary_data); - $i++; - } - TrFctMessage(__FILE__, __LINE__, 2, "$i 512 bytes blocks"); - - // ----- Close the file - fclose($v_file); - - TrFctMessage(__FILE__, __LINE__, 4, "File position after blocks =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - } - - // ----- Look for a directory - else - { - // ----- Call the header generation - if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) - { - // ----- Return status - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - TrFctMessage(__FILE__, __LINE__, 4, "File position after header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleHeader() - // Description : - // This function creates in the TAR $p_tar, the TAR header for the file - // $p_filename. - // - // 1. The informations needed to compose the header are recuperated and formatted - // 2. Two binary strings are composed for the first part of the header, before - // and after checksum field. - // 3. The checksum is calculated from the two binary strings - // 4. The header is write in the tar file (first binary string, binary string - // for checksum and last binary string). - // Parameters : - // $p_tar : a valid file descriptor, opened in write mode, - // $p_filename : The name of the file the header is for, - // $p_mode : The mode of the archive ("tar" or "tgz"). - // $p_header : A pointer to a array where will be set the file properties - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleHeader($p_tar, $p_filename, $p_mode, &$p_header, $p_stored_filename) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleHeader", "tar=$p_tar, file='$p_filename', mode='$p_mode', stored_filename='$p_stored_filename'"); - $v_result=1; - - // ----- Check the parameters - if (($p_tar == 0) || ($p_filename == "")) - { - // ----- Error log - PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Filename (reduce the path of stored name) - if ($p_stored_filename == "") - $p_stored_filename = $p_filename; - $v_reduce_filename = PclTarHandlePathReduction($p_stored_filename); - TrFctMessage(__FILE__, __LINE__, 2, "Filename (reduced) '$v_reduce_filename', strlen ".strlen($v_reduce_filename)); - - // ----- Get file info - $v_info = stat($p_filename); - $v_uid = sprintf("%6s ", DecOct($v_info[4])); - $v_gid = sprintf("%6s ", DecOct($v_info[5])); - TrFctMessage(__FILE__, __LINE__, 3, "uid=$v_uid, gid=$v_gid"); - $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename))); - TrFctMessage(__FILE__, __LINE__, 3, "file permissions $v_perms"); - - // ----- File mtime - $v_mtime_data = filemtime($p_filename); - TrFctMessage(__FILE__, __LINE__, 2, "File mtime : $v_mtime_data"); - $v_mtime = sprintf("%11s", DecOct($v_mtime_data)); - - // ----- File typeflag - // '0' or '\0' is the code for regular file - // '5' is directory - if (is_dir($p_filename)) - { - $v_typeflag = "5"; - $v_size = 0; - } - else - { - $v_typeflag = ""; - - // ----- Get the file size - clearstatcache(); - $v_size = filesize($p_filename); - } - - TrFctMessage(__FILE__, __LINE__, 2, "File size : $v_size"); - $v_size = sprintf("%11s ", DecOct($v_size)); - - TrFctMessage(__FILE__, __LINE__, 2, "File typeflag : $v_typeflag"); - - // ----- Linkname - $v_linkname = ""; - - // ----- Magic - $v_magic = ""; - - // ----- Version - $v_version = ""; - - // ----- uname - $v_uname = ""; - - // ----- gname - $v_gname = ""; - - // ----- devmajor - $v_devmajor = ""; - - // ----- devminor - $v_devminor = ""; - - // ----- prefix - $v_prefix = ""; - - // ----- Compose the binary string of the header in two parts arround the checksum position - $v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime); - $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, ""); - - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - { - $v_checksum += ord(substr($v_binary_data_first,$i,1)); - } - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - { - $v_checksum += ord(' '); - } - // ..... Last part of the header - for ($i=156, $j=0; $i<512; $i++, $j++) - { - $v_checksum += ord(substr($v_binary_data_last,$j,1)); - } - TrFctMessage(__FILE__, __LINE__, 3, "Calculated checksum : $v_checksum"); - - // ----- Write the first 148 bytes of the header in the archive - if ($p_mode == "tar") - fputs($p_tar, $v_binary_data_first, 148); - else - gzputs($p_tar, $v_binary_data_first, 148); - - // ----- Write the calculated checksum - $v_checksum = sprintf("%6s ", DecOct($v_checksum)); - $v_binary_data = pack("a8", $v_checksum); - if ($p_mode == "tar") - fputs($p_tar, $v_binary_data, 8); - else - gzputs($p_tar, $v_binary_data, 8); - - // ----- Write the last 356 bytes of the header in the archive - if ($p_mode == "tar") - fputs($p_tar, $v_binary_data_last, 356); - else - gzputs($p_tar, $v_binary_data_last, 356); - - // ----- Set the properties in the header "structure" - $p_header[filename] = $v_reduce_filename; - $p_header[mode] = $v_perms; - $p_header[uid] = $v_uid; - $p_header[gid] = $v_gid; - $p_header[size] = $v_size; - $p_header[mtime] = $v_mtime; - $p_header[typeflag] = $v_typeflag; - $p_header[status] = "added"; - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleFooter() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleFooter($p_tar, $p_mode) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleFooter", "tar='$p_tar', p_mode=$p_mode"); - $v_result=1; - - // ----- Write the last 0 filled block for end of archive - $v_binary_data = pack("a512", ""); - if ($p_mode == "tar") - fputs($p_tar, $v_binary_data); - else - gzputs($p_tar, $v_binary_data); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleExtract() - // Description : - // Parameters : - // $p_tarname : Filename of the tar (or tgz) archive - // $p_file_list : An array which contains the list of files to extract, this - // array may be empty when $p_mode is 'complete' - // $p_list_detail : An array where will be placed the properties of each extracted/listed file - // $p_mode : 'complete' will extract all files from the archive, - // 'partial' will look for files in $p_file_list - // 'list' will only list the files from the archive without any extract - // $p_path : Path to add while writing the extracted files - // $p_tar_mode : 'tar' for GNU TAR archive, 'tgz' for compressed archive - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleExtract($p_tarname, $p_file_list, &$p_list_detail, $p_mode, $p_path, $p_tar_mode, $p_remove_path) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleExtract", "archive='$p_tarname', list, mode=$p_mode, path=$p_path, tar_mode=$p_tar_mode, remove_path='$p_remove_path'"); - $v_result=1; - $v_nb = 0; - $v_extract_all = TRUE; - $v_listing = FALSE; - - // ----- Check the path - if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../"))) - $p_path = "./".$p_path; - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Study the mode - switch ($p_mode) { - case "complete" : - // ----- Flag extract of all files - $v_extract_all = TRUE; - $v_listing = FALSE; - break; - case "partial" : - // ----- Flag extract of specific files - $v_extract_all = FALSE; - $v_listing = FALSE; - break; - case "list" : - // ----- Flag list of all files - $v_extract_all = FALSE; - $v_listing = TRUE; - break; - default : - // ----- Error log - PclErrorLog(-3, "Invalid extract mode ($p_mode)"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open the tar file - if ($p_tar_mode == "tar") - { - TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - $v_tar = fopen($p_tarname, "rb"); - } - else - { - TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); - $v_tar = @gzopen($p_tarname, "rb"); - } - - // ----- Check that the archive is open - if ($v_tar == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Read the blocks - While (!($v_end_of_file = ($p_tar_mode == "tar"?feof($v_tar):gzeof($v_tar)))) - { - TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); - - // ----- Clear cache of file infos - clearstatcache(); - - // ----- Reset extract tag - $v_extract_file = FALSE; - $v_extraction_stopped = 0; - - // ----- Read the 512 bytes header - if ($p_tar_mode == "tar") - $v_binary_data = fread($v_tar, 512); - else - $v_binary_data = gzread($v_tar, 512); - - // ----- Read the header properties - if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) - { - // ----- Close the archive file - if ($p_tar_mode == "tar") - fclose($v_tar); - else - gzclose($v_tar); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for empty blocks to skip - if ($v_header[filename] == "") - { - TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); - continue; - } - - TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); - - // ----- Look for partial extract - if ((!$v_extract_all) && (is_array($p_file_list))) - { - TrFctMessage(__FILE__, __LINE__, 2, "Look if the file '$v_header[filename]' need to be extracted"); - - // ----- By default no unzip if the file is not found - $v_extract_file = FALSE; - - // ----- Look into the file list - for ($i=0; $i strlen($p_file_list[$i])) && (substr($v_header[filename], 0, strlen($p_file_list[$i])) == $p_file_list[$i])) - { - // ----- The file is in the directory, so extract it - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is in directory '$p_file_list[$i]' : extract it"); - $v_extract_file = TRUE; - - // ----- End of loop - break; - } - } - - // ----- It is a file, so compare the file names - else if ($p_file_list[$i] == $v_header[filename]) - { - // ----- File found - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should be extracted"); - $v_extract_file = TRUE; - - // ----- End of loop - break; - } - } - - // ----- Trace - if (!$v_extract_file) - { - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should not be extracted"); - } - } - else - { - // ----- All files need to be extracted - $v_extract_file = TRUE; - } - - // ----- Look if this file need to be extracted - if (($v_extract_file) && (!$v_listing)) - { - // ----- Look for path to remove - if (($p_remove_path != "") - && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path)) - { - TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); - // ----- Remove the path - $v_header[filename] = substr($v_header[filename], $p_remove_path_size); - TrFctMessage(__FILE__, __LINE__, 3, "Reslting file is '$v_header[filename]'"); - } - - // ----- Add the path to the file - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); - $p_path = substr($p_path, 0, strlen($p_path)-1); - TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); - } - - // ----- Add the path - if (substr($v_header[filename], 0, 1) == "/") - $v_header[filename] = $p_path.$v_header[filename]; - else - $v_header[filename] = $p_path."/".$v_header[filename]; - } - - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); - - // ----- Check that the file does not exists - if (file_exists($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); - - // ----- Look if file is a directory - if (is_dir($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); - - // ----- Change the file status - $v_header[status] = "already_a_directory"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - // ----- Look if file is write protected - else if (!is_writeable($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); - - // ----- Change the file status - $v_header[status] = "write_protected"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - // ----- Look if the extracted file is older - else if (filemtime($v_header[filename]) > $v_header[mtime]) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is newer (".date("l dS of F Y h:i:s A", filemtime($v_header[filename])).") than the extracted file (".date("l dS of F Y h:i:s A", $v_header[mtime]).")"); - - // ----- Change the file status - $v_header[status] = "newer_exist"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - } - - // ----- Check the directory availability and create it if necessary - else - { - if ($v_header[typeflag]=="5") - $v_dir_to_check = $v_header[filename]; - else if (!strstr($v_header[filename], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($v_header[filename]); - - if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) - { - TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); - - // ----- Change the file status - $v_header[status] = "path_creation_fail"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - } - - // ----- Do the extraction - if (($v_extract_file) && ($v_header[typeflag]!="5")) - { - // ----- Open the destination file in write mode - if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) - { - TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); - - // ----- Change the file status - $v_header[status] = "write_error"; - - // ----- Jump to next file - TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - } - else - { - TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); - - // ----- Read data - $n = floor($v_header[size]/512); - for ($i=0; $i<$n; $i++) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($i+1)); - if ($p_tar_mode == "tar") - $v_content = fread($v_tar, 512); - else - $v_content = gzread($v_tar, 512); - fwrite($v_dest_file, $v_content, 512); - } - if (($v_header[size] % 512) != 0) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read last ".($v_header[size] % 512)." bytes in a 512 block"); - if ($p_tar_mode == "tar") - $v_content = fread($v_tar, 512); - else - $v_content = gzread($v_tar, 512); - fwrite($v_dest_file, $v_content, ($v_header[size] % 512)); - } - - // ----- Close the destination file - fclose($v_dest_file); - - // ----- Change the file mode, mtime - touch($v_header[filename], $v_header[mtime]); - //chmod($v_header[filename], DecOct($v_header[mode])); - } - - // ----- Check the file size - clearstatcache(); - if (filesize($v_header[filename]) != $v_header[size]) - { - // ----- Close the archive file - if ($p_tar_mode == "tar") - fclose($v_tar); - else - gzclose($v_tar); - - // ----- Error log - PclErrorLog(-7, "Extracted file '$v_header[filename]' does not have the correct file size '".filesize($v_filename)."' ('$v_header[size]' expected). Archive may be corrupted."); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); - } - - else - { - TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); - - // ----- Jump to next file - TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - } - } - - // ----- Look for file that is not to be unzipped - else - { - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); - TrFctMessage(__FILE__, __LINE__, 4, "Position avant jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - - // ----- Jump to next file - if ($p_tar_mode == "tar") - fseek($v_tar, ($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - - TrFctMessage(__FILE__, __LINE__, 4, "Position apr�s jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - } - - if ($p_tar_mode == "tar") - $v_end_of_file = feof($v_tar); - else - $v_end_of_file = gzeof($v_tar); - - // ----- File name and properties are logged if listing mode or file is extracted - if ($v_listing || $v_extract_file || $v_extraction_stopped) - { - TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); - - // ----- Log extracted files - if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) - $v_file_dir = ""; - if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) - $v_file_dir = "/"; - - // ----- Add the array describing the file into the list - $p_list_detail[$v_nb] = $v_header; - - // ----- Increment - $v_nb++; - } - } - - // ----- Close the tarfile - if ($p_tar_mode == "tar") - fclose($v_tar); - else - gzclose($v_tar); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleExtractByIndexList() - // Description : - // Extract the files which are at the indexes specified. If the 'file' at the - // index is a directory, the directory only is created, not all the files stored - // for that directory. - // Parameters : - // $p_index_string : String of indexes of files to extract. The form of the - // string is "0,4-6,8-12" with only numbers and '-' for - // for range, and ',' to separate ranges. No spaces or ';' - // are allowed. - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleExtractByIndexList($p_tarname, $p_index_string, &$p_list_detail, $p_path, $p_remove_path, $p_tar_mode) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractByIndexList", "archive='$p_tarname', index_string='$p_index_string', list, path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); - $v_result=1; - $v_nb = 0; - - // ----- TBC : I should check the string by a regexp - - // ----- Check the path - if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path, 0, 2) != "./"))) - $p_path = "./".$p_path; - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the tar file - if ($p_tar_mode == "tar") - { - TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - $v_tar = @fopen($p_tarname, "rb"); - } - else - { - TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); - $v_tar = @gzopen($p_tarname, "rb"); - } - - // ----- Check that the archive is open - if ($v_tar == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Manipulate the index list - $v_list = explode(",", $p_index_string); - sort($v_list); - - // ----- Loop on the index list - $v_index=0; - for ($i=0; ($i $p_index_stop) - { - TrFctMessage(__FILE__, __LINE__, 2, "Stop extraction, past stop index"); - break; - } - - // ----- Clear cache of file infos - clearstatcache(); - - // ----- Reset extract tag - $v_extract_file = FALSE; - $v_extraction_stopped = 0; - - // ----- Read the 512 bytes header - if ($p_tar_mode == "tar") - $v_binary_data = fread($v_tar, 512); - else - $v_binary_data = gzread($v_tar, 512); - - // ----- Read the header properties - if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for empty blocks to skip - if ($v_header[filename] == "") - { - TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); - continue; - } - - TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); - - // ----- Look if file is in the range to be extracted - if (($p_index_current >= $p_index_start) && ($p_index_current <= $p_index_stop)) - { - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is in the range to be extracted"); - $v_extract_file = TRUE; - } - else - { - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is out of the range"); - $v_extract_file = FALSE; - } - - // ----- Look if this file need to be extracted - if ($v_extract_file) - { - if (($v_result = PclTarHandleExtractFile($v_tar, $v_header, $p_path, $p_remove_path, $p_tar_mode)) != 1) - { - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - } - - // ----- Look for file that is not to be extracted - else - { - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); - TrFctMessage(__FILE__, __LINE__, 4, "Position avant jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - - // ----- Jump to next file - if ($p_tar_mode == "tar") - fseek($v_tar, ($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - - TrFctMessage(__FILE__, __LINE__, 4, "Position apr�s jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - } - - if ($p_tar_mode == "tar") - $v_end_of_file = feof($v_tar); - else - $v_end_of_file = gzeof($v_tar); - - // ----- File name and properties are logged if listing mode or file is extracted - if ($v_extract_file) - { - TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); - - // ----- Log extracted files - if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) - $v_file_dir = ""; - if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) - $v_file_dir = "/"; - - // ----- Add the array describing the file into the list - $p_list_detail[$v_nb] = $v_header; - - // ----- Increment - $v_nb++; - } - - // ----- Increment the current file index - $p_index_current++; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleExtractFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleExtractFile($p_tar, &$v_header, $p_path, $p_remove_path, $p_tar_mode) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractFile", "archive_descr='$p_tar', path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); - $v_result=1; - - // TBC : I should replace all $v_tar by $p_tar in this function .... - $v_tar = $p_tar; - $v_extract_file = 1; - - $p_remove_path_size = strlen($p_remove_path); - - // ----- Look for path to remove - if (($p_remove_path != "") - && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path)) - { - TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); - // ----- Remove the path - $v_header[filename] = substr($v_header[filename], $p_remove_path_size); - TrFctMessage(__FILE__, __LINE__, 3, "Resulting file is '$v_header[filename]'"); - } - - // ----- Add the path to the file - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); - $p_path = substr($p_path, 0, strlen($p_path)-1); - TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); - } - - // ----- Add the path - if (substr($v_header[filename], 0, 1) == "/") - $v_header[filename] = $p_path.$v_header[filename]; - else - $v_header[filename] = $p_path."/".$v_header[filename]; - } - - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); - - // ----- Check that the file does not exists - if (file_exists($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); - - // ----- Look if file is a directory - if (is_dir($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); - - // ----- Change the file status - $v_header[status] = "already_a_directory"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - // ----- Look if file is write protected - else if (!is_writeable($v_header[filename])) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); - - // ----- Change the file status - $v_header[status] = "write_protected"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - // ----- Look if the extracted file is older - else if (filemtime($v_header[filename]) > $v_header[mtime]) - { - TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is newer (".date("l dS of F Y h:i:s A", filemtime($v_header[filename])).") than the extracted file (".date("l dS of F Y h:i:s A", $v_header[mtime]).")"); - - // ----- Change the file status - $v_header[status] = "newer_exist"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - } - - // ----- Check the directory availability and create it if necessary - else - { - if ($v_header[typeflag]=="5") - $v_dir_to_check = $v_header[filename]; - else if (!strstr($v_header[filename], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($v_header[filename]); - - if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) - { - TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); - - // ----- Change the file status - $v_header[status] = "path_creation_fail"; - - // ----- Skip the extract - $v_extraction_stopped = 1; - $v_extract_file = 0; - } - } - - // ----- Do the real bytes extraction (if not a directory) - if (($v_extract_file) && ($v_header[typeflag]!="5")) - { - // ----- Open the destination file in write mode - if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) - { - TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); - - // ----- Change the file status - $v_header[status] = "write_error"; - - // ----- Jump to next file - TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - } - else - { - TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); - - // ----- Read data - $n = floor($v_header[size]/512); - for ($i=0; $i<$n; $i++) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($i+1)); - if ($p_tar_mode == "tar") - $v_content = fread($v_tar, 512); - else - $v_content = gzread($v_tar, 512); - fwrite($v_dest_file, $v_content, 512); - } - if (($v_header[size] % 512) != 0) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read last ".($v_header[size] % 512)." bytes in a 512 block"); - if ($p_tar_mode == "tar") - $v_content = fread($v_tar, 512); - else - $v_content = gzread($v_tar, 512); - fwrite($v_dest_file, $v_content, ($v_header[size] % 512)); - } - - // ----- Close the destination file - fclose($v_dest_file); - - // ----- Change the file mode, mtime - touch($v_header[filename], $v_header[mtime]); - //chmod($v_header[filename], DecOct($v_header[mode])); - } - - // ----- Check the file size - clearstatcache(); - if (filesize($v_header[filename]) != $v_header[size]) - { - // ----- Error log - PclErrorLog(-7, "Extracted file '$v_header[filename]' does not have the correct file size '".filesize($v_filename)."' ('$v_header[size]' expected). Archive may be corrupted."); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); - } - else - { - TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); - - // ----- Jump to next file - TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleDelete() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleDelete($p_tarname, $p_file_list, &$p_list_detail, $p_tar_mode) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleDelete", "archive='$p_tarname', list, tar_mode=$p_tar_mode"); - $v_result=1; - $v_nb=0; - - // ----- Look for regular tar file - if ($p_tar_mode == "tar") - { - // ----- Open file - TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_tar = @fopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @fopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - fclose($v_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - } - - // ----- Look for compressed tar file - else - { - // ----- Open the file in read mode - TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); - if (($v_tar = @gzopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - gzclose($v_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - } - - // ----- Read the blocks - While (!($v_end_of_file = ($p_tar_mode == "tar"?feof($v_tar):gzeof($v_tar)))) - { - TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); - - // ----- Clear cache of file infos - clearstatcache(); - - // ----- Reset delete tag - $v_delete_file = FALSE; - - // ----- Read the first 512 block header - if ($p_tar_mode == "tar") - $v_binary_data = fread($v_tar, 512); - else - $v_binary_data = gzread($v_tar, 512); - - // ----- Read the header properties - if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) - { - // ----- Close the archive file - if ($p_tar_mode == "tar") - { - fclose($v_tar); - fclose($v_temp_tar); - } - else - { - gzclose($v_tar); - gzclose($v_temp_tar); - } - @unlink($v_temp_tarname); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for empty blocks to skip - if ($v_header[filename] == "") - { - TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); - continue; - } - - TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); - - // ----- Look for filenames to delete - for ($i=0, $v_delete_file=FALSE; ($i 99) { + // ----- Error log + PclErrorLog(-5, "File name is too long (max. 99) : '$p_filename'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + TrFctMessage(__FILE__, __LINE__, 4, + "File position before header =" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($p_tar, $p_filename, $p_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Store the file infos + $p_list_detail[$v_nb++] = $v_header; + + // ----- Look for directory + if (is_dir($p_filename)) { + TrFctMessage(__FILE__, __LINE__, 2, "$p_filename is a directory"); + + // ----- Look for path + if ($p_filename != ".") { + $v_path = $p_filename . "/"; + } else { + $v_path = ""; + } + + // ----- Read the directory for files and sub-directories + $p_hdir = opendir($p_filename); + $p_hitem = readdir($p_hdir); // '.' directory + $p_hitem = readdir($p_hdir); // '..' directory + while ($p_hitem = readdir($p_hdir)) { + // ----- Look for a file + if (is_file($v_path . $p_hitem)) { + TrFctMessage(__FILE__, __LINE__, 4, "Add the file '" . $v_path . $p_hitem . "'"); + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($p_tar, $v_path . $p_hitem, $p_mode, $v_header, $p_add_dir, + $p_remove_dir)) != 1 + ) { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Store the file infos + $p_list_detail[$v_nb++] = $v_header; + } // ----- Recursive call to PclTarHandleAddFile() + else { + TrFctMessage(__FILE__, __LINE__, 4, "'" . $v_path . $p_hitem . "' is a directory"); + + // ----- Need an array as parameter + $p_temp_list[0] = $v_path . $p_hitem; + $v_result = PclTarHandleAddList($p_tar, $p_temp_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir); + } + } + + // ----- Free memory for the recursive loop + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } else { + TrFctMessage(__FILE__, __LINE__, 4, + "File position after blocks =" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleAddFile($p_tar, $p_filename, $p_mode, &$p_header, $p_add_dir, $p_remove_dir) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleAddFile", + "tar='$p_tar', filename='$p_filename', p_mode='$p_mode', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result = 1; + + // ----- Check the parameters + if ($p_tar == 0) { + // ----- Error log + PclErrorLog(-3, "Invalid file descriptor in file " . __FILE__ . ", line " . __LINE__); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Skip empty file names + if ($p_filename == "") { + // ----- Error log + PclErrorLog(-3, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') { + $p_remove_dir .= "/"; + } + + if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { + if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./" . $p_remove_dir; + } + if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) { + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + TrFctMessage(__FILE__, __LINE__, 3, "Remove path '$p_remove_dir' in file '$p_filename' = '$v_stored_filename'"); + } + } + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") { + $v_stored_filename = $p_add_dir . $v_stored_filename; + } else { + $v_stored_filename = $p_add_dir . "/" . $v_stored_filename; + } + TrFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'"); + } + + // ----- Check the path length + if (strlen($v_stored_filename) > 99) { + // ----- Error log + PclErrorLog(-5, "Stored file name is too long (max. 99) : '$v_stored_filename'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Look for a file + if (is_file($p_filename)) { + // ----- Open the source file + if (($v_file = fopen($p_filename, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_filename' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Call the header generation + if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + TrFctMessage(__FILE__, __LINE__, 4, + "File position after header =" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + + // ----- Read the file by 512 octets blocks + $i = 0; + while (($v_buffer = fread($v_file, 512)) != "") { + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data); + } else { + gzputs($p_tar, $v_binary_data); + } + $i++; + } + TrFctMessage(__FILE__, __LINE__, 2, "$i 512 bytes blocks"); + + // ----- Close the file + fclose($v_file); + + TrFctMessage(__FILE__, __LINE__, 4, + "File position after blocks =" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + } // ----- Look for a directory + else { + // ----- Call the header generation + if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + TrFctMessage(__FILE__, __LINE__, 4, + "File position after header =" . ($p_mode == "tar" ? ftell($p_tar) : gztell($p_tar))); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleHeader() + // Description : + // This function creates in the TAR $p_tar, the TAR header for the file + // $p_filename. + // + // 1. The informations needed to compose the header are recuperated and formatted + // 2. Two binary strings are composed for the first part of the header, before + // and after checksum field. + // 3. The checksum is calculated from the two binary strings + // 4. The header is write in the tar file (first binary string, binary string + // for checksum and last binary string). + // Parameters : + // $p_tar : a valid file descriptor, opened in write mode, + // $p_filename : The name of the file the header is for, + // $p_mode : The mode of the archive ("tar" or "tgz"). + // $p_header : A pointer to a array where will be set the file properties + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleHeader($p_tar, $p_filename, $p_mode, &$p_header, $p_stored_filename) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleHeader", + "tar=$p_tar, file='$p_filename', mode='$p_mode', stored_filename='$p_stored_filename'"); + $v_result = 1; + + // ----- Check the parameters + if (($p_tar == 0) || ($p_filename == "")) { + // ----- Error log + PclErrorLog(-3, "Invalid file descriptor in file " . __FILE__ . ", line " . __LINE__); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Filename (reduce the path of stored name) + if ($p_stored_filename == "") { + $p_stored_filename = $p_filename; + } + $v_reduce_filename = PclTarHandlePathReduction($p_stored_filename); + TrFctMessage(__FILE__, __LINE__, 2, + "Filename (reduced) '$v_reduce_filename', strlen " . strlen($v_reduce_filename)); + + // ----- Get file info + $v_info = stat($p_filename); + $v_uid = sprintf("%6s ", DecOct($v_info[4])); + $v_gid = sprintf("%6s ", DecOct($v_info[5])); + TrFctMessage(__FILE__, __LINE__, 3, "uid=$v_uid, gid=$v_gid"); + $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename))); + TrFctMessage(__FILE__, __LINE__, 3, "file permissions $v_perms"); + + // ----- File mtime + $v_mtime_data = filemtime($p_filename); + TrFctMessage(__FILE__, __LINE__, 2, "File mtime : $v_mtime_data"); + $v_mtime = sprintf("%11s", DecOct($v_mtime_data)); + + // ----- File typeflag + // '0' or '\0' is the code for regular file + // '5' is directory + if (is_dir($p_filename)) { + $v_typeflag = "5"; + $v_size = 0; + } else { + $v_typeflag = ""; + + // ----- Get the file size + clearstatcache(); + $v_size = filesize($p_filename); + } + + TrFctMessage(__FILE__, __LINE__, 2, "File size : $v_size"); + $v_size = sprintf("%11s ", DecOct($v_size)); + + TrFctMessage(__FILE__, __LINE__, 2, "File typeflag : $v_typeflag"); + + // ----- Linkname + $v_linkname = ""; + + // ----- Magic + $v_magic = ""; + + // ----- Version + $v_version = ""; + + // ----- uname + $v_uname = ""; + + // ----- gname + $v_gname = ""; + + // ----- devmajor + $v_devmajor = ""; + + // ----- devminor + $v_devminor = ""; + + // ----- prefix + $v_prefix = ""; + + // ----- Compose the binary string of the header in two parts arround the checksum position + $v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime); + $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, + $v_gname, $v_devmajor, $v_devminor, $v_prefix, ""); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i = 0; $i < 148; $i++) { + $v_checksum += ord(substr($v_binary_data_first, $i, 1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i = 148; $i < 156; $i++) { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i = 156, $j = 0; $i < 512; $i++, $j++) { + $v_checksum += ord(substr($v_binary_data_last, $j, 1)); + } + TrFctMessage(__FILE__, __LINE__, 3, "Calculated checksum : $v_checksum"); + + // ----- Write the first 148 bytes of the header in the archive + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data_first, 148); + } else { + gzputs($p_tar, $v_binary_data_first, 148); + } + + // ----- Write the calculated checksum + $v_checksum = sprintf("%6s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data, 8); + } else { + gzputs($p_tar, $v_binary_data, 8); + } + + // ----- Write the last 356 bytes of the header in the archive + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data_last, 356); + } else { + gzputs($p_tar, $v_binary_data_last, 356); + } + + // ----- Set the properties in the header "structure" + $p_header[filename] = $v_reduce_filename; + $p_header[mode] = $v_perms; + $p_header[uid] = $v_uid; + $p_header[gid] = $v_gid; + $p_header[size] = $v_size; + $p_header[mtime] = $v_mtime; + $p_header[typeflag] = $v_typeflag; + $p_header[status] = "added"; + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleFooter() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleFooter($p_tar, $p_mode) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleFooter", "tar='$p_tar', p_mode=$p_mode"); + $v_result = 1; + + // ----- Write the last 0 filled block for end of archive + $v_binary_data = pack("a512", ""); + if ($p_mode == "tar") { + fputs($p_tar, $v_binary_data); + } else { + gzputs($p_tar, $v_binary_data); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtract() + // Description : + // Parameters : + // $p_tarname : Filename of the tar (or tgz) archive + // $p_file_list : An array which contains the list of files to extract, this + // array may be empty when $p_mode is 'complete' + // $p_list_detail : An array where will be placed the properties of each extracted/listed file + // $p_mode : 'complete' will extract all files from the archive, + // 'partial' will look for files in $p_file_list + // 'list' will only list the files from the archive without any extract + // $p_path : Path to add while writing the extracted files + // $p_tar_mode : 'tar' for GNU TAR archive, 'tgz' for compressed archive + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtract( + $p_tarname, + $p_file_list, + &$p_list_detail, + $p_mode, + $p_path, + $p_tar_mode, + $p_remove_path + ) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtract", + "archive='$p_tarname', list, mode=$p_mode, path=$p_path, tar_mode=$p_tar_mode, remove_path='$p_remove_path'"); + $v_result = 1; + $v_nb = 0; + $v_extract_all = true; + $v_listing = false; + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../"))) { + $p_path = "./" . $p_path; + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Study the mode + switch ($p_mode) { + case "complete" : + // ----- Flag extract of all files + $v_extract_all = true; + $v_listing = false; + break; + case "partial" : + // ----- Flag extract of specific files + $v_extract_all = false; + $v_listing = false; + break; + case "list" : + // ----- Flag list of all files + $v_extract_all = false; + $v_listing = true; + break; + default : + // ----- Error log + PclErrorLog(-3, "Invalid extract mode ($p_mode)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Open the tar file + if ($p_tar_mode == "tar") { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + $v_tar = fopen($p_tarname, "rb"); + } else { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + $v_tar = @gzopen($p_tarname, "rb"); + } + + // ----- Check that the archive is open + if ($v_tar == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Read the blocks + While (!($v_end_of_file = ($p_tar_mode == "tar" ? feof($v_tar) : gzeof($v_tar)))) { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset extract tag + $v_extract_file = false; + $v_extraction_stopped = 0; + + // ----- Read the 512 bytes header + if ($p_tar_mode == "tar") { + $v_binary_data = fread($v_tar, 512); + } else { + $v_binary_data = gzread($v_tar, 512); + } + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) { + // ----- Close the archive file + if ($p_tar_mode == "tar") { + fclose($v_tar); + } else { + gzclose($v_tar); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look for partial extract + if ((!$v_extract_all) && (is_array($p_file_list))) { + TrFctMessage(__FILE__, __LINE__, 2, "Look if the file '$v_header[filename]' need to be extracted"); + + // ----- By default no unzip if the file is not found + $v_extract_file = false; + + // ----- Look into the file list + for ($i = 0; $i < sizeof($p_file_list); $i++) { + TrFctMessage(__FILE__, __LINE__, 2, + "Compare archived file '$v_header[filename]' from asked list file '" . $p_file_list[$i] . "'"); + + // ----- Look if it is a directory + if (substr($p_file_list[$i], -1) == "/") { + TrFctMessage(__FILE__, __LINE__, 3, "Compare file '$v_header[filename]' with directory '$p_file_list[$i]'"); + + // ----- Look if the directory is in the filename path + if ((strlen($v_header[filename]) > strlen($p_file_list[$i])) && (substr($v_header[filename], 0, + strlen($p_file_list[$i])) == $p_file_list[$i]) + ) { + // ----- The file is in the directory, so extract it + TrFctMessage(__FILE__, __LINE__, 2, + "File '$v_header[filename]' is in directory '$p_file_list[$i]' : extract it"); + $v_extract_file = true; + + // ----- End of loop + break; + } + } // ----- It is a file, so compare the file names + else { + if ($p_file_list[$i] == $v_header[filename]) { + // ----- File found + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should be extracted"); + $v_extract_file = true; + + // ----- End of loop + break; + } + } + } + + // ----- Trace + if (!$v_extract_file) { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should not be extracted"); + } + } else { + // ----- All files need to be extracted + $v_extract_file = true; + } + + // ----- Look if this file need to be extracted + if (($v_extract_file) && (!$v_listing)) { + // ----- Look for path to remove + if (($p_remove_path != "") + && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path) + ) { + TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); + // ----- Remove the path + $v_header[filename] = substr($v_header[filename], $p_remove_path_size); + TrFctMessage(__FILE__, __LINE__, 3, "Reslting file is '$v_header[filename]'"); + } + + // ----- Add the path to the file + if (($p_path != "./") && ($p_path != "/")) { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") { + TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); + $p_path = substr($p_path, 0, strlen($p_path)-1); + TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); + } + + // ----- Add the path + if (substr($v_header[filename], 0, 1) == "/") { + $v_header[filename] = $p_path . $v_header[filename]; + } else { + $v_header[filename] = $p_path . "/" . $v_header[filename]; + } + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, + "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); + + // ----- Check that the file does not exists + if (file_exists($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); + + // ----- Look if file is a directory + if (is_dir($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); + + // ----- Change the file status + $v_header[status] = "already_a_directory"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } // ----- Look if file is write protected + else { + if (!is_writeable($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); + + // ----- Change the file status + $v_header[status] = "write_protected"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } // ----- Look if the extracted file is older + else { + if (filemtime($v_header[filename]) > $v_header[mtime]) { + TrFctMessage(__FILE__, __LINE__, 2, + "Existing file '$v_header[filename]' is newer (" . date("l dS of F Y h:i:s A", + filemtime($v_header[filename])) . ") than the extracted file (" . date("l dS of F Y h:i:s A", + $v_header[mtime]) . ")"); + + // ----- Change the file status + $v_header[status] = "newer_exist"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + } + } // ----- Check the directory availability and create it if necessary + else { + if ($v_header[typeflag] == "5") { + $v_dir_to_check = $v_header[filename]; + } else { + if (!strstr($v_header[filename], "/")) { + $v_dir_to_check = ""; + } else { + $v_dir_to_check = dirname($v_header[filename]); + } + } + + if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) { + TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); + + // ----- Change the file status + $v_header[status] = "path_creation_fail"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Do the extraction + if (($v_extract_file) && ($v_header[typeflag] != "5")) { + // ----- Open the destination file in write mode + if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) { + TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); + + // ----- Change the file status + $v_header[status] = "write_error"; + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") { + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + } else { + TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); + + // ----- Read data + $n = floor($v_header[size]/512); + for ($i = 0; $i < $n; $i++) { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number " . ($i+1)); + if ($p_tar_mode == "tar") { + $v_content = fread($v_tar, 512); + } else { + $v_content = gzread($v_tar, 512); + } + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header[size]%512) != 0) { + TrFctMessage(__FILE__, __LINE__, 3, "Read last " . ($v_header[size]%512) . " bytes in a 512 block"); + if ($p_tar_mode == "tar") { + $v_content = fread($v_tar, 512); + } else { + $v_content = gzread($v_tar, 512); + } + fwrite($v_dest_file, $v_content, ($v_header[size]%512)); + } + + // ----- Close the destination file + fclose($v_dest_file); + + // ----- Change the file mode, mtime + touch($v_header[filename], $v_header[mtime]); + //chmod($v_header[filename], DecOct($v_header[mode])); + } + + // ----- Check the file size + clearstatcache(); + if (filesize($v_header[filename]) != $v_header[size]) { + // ----- Close the archive file + if ($p_tar_mode == "tar") { + fclose($v_tar); + } else { + gzclose($v_tar); + } + + // ----- Error log + PclErrorLog(-7, + "Extracted file '$v_header[filename]' does not have the correct file size '" . filesize($v_filename) . "' ('$v_header[size]' expected). Archive may be corrupted."); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } else { + TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") { + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + } + } // ----- Look for file that is not to be unzipped + else { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); + TrFctMessage(__FILE__, __LINE__, 4, + "Position avant jump [" . ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar)) . "]"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") { + fseek($v_tar, ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar))+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + + TrFctMessage(__FILE__, __LINE__, 4, + "Position apr�s jump [" . ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar)) . "]"); + } + + if ($p_tar_mode == "tar") { + $v_end_of_file = feof($v_tar); + } else { + $v_end_of_file = gzeof($v_tar); + } + + // ----- File name and properties are logged if listing mode or file is extracted + if ($v_listing || $v_extract_file || $v_extraction_stopped) { + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Log extracted files + if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) { + $v_file_dir = ""; + } + if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) { + $v_file_dir = "/"; + } + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + + // ----- Increment + $v_nb++; + } + } + + // ----- Close the tarfile + if ($p_tar_mode == "tar") { + fclose($v_tar); + } else { + gzclose($v_tar); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtractByIndexList() + // Description : + // Extract the files which are at the indexes specified. If the 'file' at the + // index is a directory, the directory only is created, not all the files stored + // for that directory. + // Parameters : + // $p_index_string : String of indexes of files to extract. The form of the + // string is "0,4-6,8-12" with only numbers and '-' for + // for range, and ',' to separate ranges. No spaces or ';' + // are allowed. + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtractByIndexList( + $p_tarname, + $p_index_string, + &$p_list_detail, + $p_path, + $p_remove_path, + $p_tar_mode + ) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractByIndexList", + "archive='$p_tarname', index_string='$p_index_string', list, path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); + $v_result = 1; + $v_nb = 0; + + // ----- TBC : I should check the string by a regexp + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path, 0, + 2) != "./")) + ) { + $p_path = "./" . $p_path; + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the tar file + if ($p_tar_mode == "tar") { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + $v_tar = @fopen($p_tarname, "rb"); + } else { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + $v_tar = @gzopen($p_tarname, "rb"); + } + + // ----- Check that the archive is open + if ($v_tar == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Manipulate the index list + $v_list = explode(",", $p_index_string); + sort($v_list); + + // ----- Loop on the index list + $v_index = 0; + for ($i = 0; ($i < sizeof($v_list)) && ($v_result); $i++) { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for index part '$v_list[$i]'"); + + // ----- Extract range + $v_index_list = explode("-", $v_list[$i]); + $v_size_index_list = sizeof($v_index_list); + if ($v_size_index_list == 1) { + TrFctMessage(__FILE__, __LINE__, 3, "Only one index '$v_index_list[0]'"); + + // ----- Do the extraction + $v_result = PclTarHandleExtractByIndex($v_tar, $v_index, $v_index_list[0], $v_index_list[0], $p_list_detail, + $p_path, $p_remove_path, $p_tar_mode); + } else { + if ($v_size_index_list == 2) { + TrFctMessage(__FILE__, __LINE__, 3, "Two indexes '$v_index_list[0]' and '$v_index_list[1]'"); + + // ----- Do the extraction + $v_result = PclTarHandleExtractByIndex($v_tar, $v_index, $v_index_list[0], $v_index_list[1], $p_list_detail, + $p_path, $p_remove_path, $p_tar_mode); + } + } + } + + // ----- Close the tarfile + if ($p_tar_mode == "tar") { + fclose($v_tar); + } else { + gzclose($v_tar); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtractByIndex() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtractByIndex( + $p_tar, + &$p_index_current, + $p_index_start, + $p_index_stop, + &$p_list_detail, + $p_path, + $p_remove_path, + $p_tar_mode + ) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractByIndex", + "archive_descr='$p_tar', index_current=$p_index_current, index_start='$p_index_start', index_stop='$p_index_stop', list, path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); + $v_result = 1; + $v_nb = 0; + + // TBC : I should replace all $v_tar by $p_tar in this function .... + $v_tar = $p_tar; + + // ----- Look the number of elements already in $p_list_detail + $v_nb = sizeof($p_list_detail); + + // ----- Read the blocks + While (!($v_end_of_file = ($p_tar_mode == "tar" ? feof($v_tar) : gzeof($v_tar)))) { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for next file ..."); + TrFctMessage(__FILE__, __LINE__, 3, "Index current=$p_index_current, range=[$p_index_start, $p_index_stop])"); + + if ($p_index_current > $p_index_stop) { + TrFctMessage(__FILE__, __LINE__, 2, "Stop extraction, past stop index"); + break; + } + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset extract tag + $v_extract_file = false; + $v_extraction_stopped = 0; + + // ----- Read the 512 bytes header + if ($p_tar_mode == "tar") { + $v_binary_data = fread($v_tar, 512); + } else { + $v_binary_data = gzread($v_tar, 512); + } + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) { + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look if file is in the range to be extracted + if (($p_index_current >= $p_index_start) && ($p_index_current <= $p_index_stop)) { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is in the range to be extracted"); + $v_extract_file = true; + } else { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is out of the range"); + $v_extract_file = false; + } + + // ----- Look if this file need to be extracted + if ($v_extract_file) { + if (($v_result = PclTarHandleExtractFile($v_tar, $v_header, $p_path, $p_remove_path, $p_tar_mode)) != 1) { + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + } // ----- Look for file that is not to be extracted + else { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); + TrFctMessage(__FILE__, __LINE__, 4, + "Position avant jump [" . ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar)) . "]"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") { + fseek($v_tar, ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar))+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + + TrFctMessage(__FILE__, __LINE__, 4, + "Position apr�s jump [" . ($p_tar_mode == "tar" ? ftell($v_tar) : gztell($v_tar)) . "]"); + } + + if ($p_tar_mode == "tar") { + $v_end_of_file = feof($v_tar); + } else { + $v_end_of_file = gzeof($v_tar); + } + + // ----- File name and properties are logged if listing mode or file is extracted + if ($v_extract_file) { + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Log extracted files + if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) { + $v_file_dir = ""; + } + if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) { + $v_file_dir = "/"; + } + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + + // ----- Increment + $v_nb++; + } + + // ----- Increment the current file index + $p_index_current++; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtractFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtractFile($p_tar, &$v_header, $p_path, $p_remove_path, $p_tar_mode) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractFile", + "archive_descr='$p_tar', path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); + $v_result = 1; + + // TBC : I should replace all $v_tar by $p_tar in this function .... + $v_tar = $p_tar; + $v_extract_file = 1; + + $p_remove_path_size = strlen($p_remove_path); + + // ----- Look for path to remove + if (($p_remove_path != "") + && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path) + ) { + TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); + // ----- Remove the path + $v_header[filename] = substr($v_header[filename], $p_remove_path_size); + TrFctMessage(__FILE__, __LINE__, 3, "Resulting file is '$v_header[filename]'"); + } + + // ----- Add the path to the file + if (($p_path != "./") && ($p_path != "/")) { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") { + TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); + $p_path = substr($p_path, 0, strlen($p_path)-1); + TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); + } + + // ----- Add the path + if (substr($v_header[filename], 0, 1) == "/") { + $v_header[filename] = $p_path . $v_header[filename]; + } else { + $v_header[filename] = $p_path . "/" . $v_header[filename]; + } + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); + + // ----- Check that the file does not exists + if (file_exists($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); + + // ----- Look if file is a directory + if (is_dir($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); + + // ----- Change the file status + $v_header[status] = "already_a_directory"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } // ----- Look if file is write protected + else { + if (!is_writeable($v_header[filename])) { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); + + // ----- Change the file status + $v_header[status] = "write_protected"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } // ----- Look if the extracted file is older + else { + if (filemtime($v_header[filename]) > $v_header[mtime]) { + TrFctMessage(__FILE__, __LINE__, 2, + "Existing file '$v_header[filename]' is newer (" . date("l dS of F Y h:i:s A", + filemtime($v_header[filename])) . ") than the extracted file (" . date("l dS of F Y h:i:s A", + $v_header[mtime]) . ")"); + + // ----- Change the file status + $v_header[status] = "newer_exist"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + } + } // ----- Check the directory availability and create it if necessary + else { + if ($v_header[typeflag] == "5") { + $v_dir_to_check = $v_header[filename]; + } else { + if (!strstr($v_header[filename], "/")) { + $v_dir_to_check = ""; + } else { + $v_dir_to_check = dirname($v_header[filename]); + } + } + + if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) { + TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); + + // ----- Change the file status + $v_header[status] = "path_creation_fail"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Do the real bytes extraction (if not a directory) + if (($v_extract_file) && ($v_header[typeflag] != "5")) { + // ----- Open the destination file in write mode + if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) { + TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); + + // ----- Change the file status + $v_header[status] = "write_error"; + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") { + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + } else { + TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); + + // ----- Read data + $n = floor($v_header[size]/512); + for ($i = 0; $i < $n; $i++) { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number " . ($i+1)); + if ($p_tar_mode == "tar") { + $v_content = fread($v_tar, 512); + } else { + $v_content = gzread($v_tar, 512); + } + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header[size]%512) != 0) { + TrFctMessage(__FILE__, __LINE__, 3, "Read last " . ($v_header[size]%512) . " bytes in a 512 block"); + if ($p_tar_mode == "tar") { + $v_content = fread($v_tar, 512); + } else { + $v_content = gzread($v_tar, 512); + } + fwrite($v_dest_file, $v_content, ($v_header[size]%512)); + } + + // ----- Close the destination file + fclose($v_dest_file); + + // ----- Change the file mode, mtime + touch($v_header[filename], $v_header[mtime]); + //chmod($v_header[filename], DecOct($v_header[mode])); + } + + // ----- Check the file size + clearstatcache(); + if (filesize($v_header[filename]) != $v_header[size]) { + // ----- Error log + PclErrorLog(-7, + "Extracted file '$v_header[filename]' does not have the correct file size '" . filesize($v_filename) . "' ('$v_header[size]' expected). Archive may be corrupted."); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } else { + TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") { + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleDelete() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleDelete($p_tarname, $p_file_list, &$p_list_detail, $p_tar_mode) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleDelete", "archive='$p_tarname', list, tar_mode=$p_tar_mode"); + $v_result = 1; + $v_nb = 0; + + // ----- Look for regular tar file + if ($p_tar_mode == "tar") { + // ----- Open file + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_tar = @fopen($p_tarname, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-") . ".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @fopen($v_temp_tarname, "wb")) == 0) { + // ----- Close tar file + fclose($v_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + } // ----- Look for compressed tar file + else { + // ----- Open the file in read mode + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + if (($v_tar = @gzopen($p_tarname, "rb")) == 0) { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-") . ".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) { + // ----- Close tar file + gzclose($v_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + } + + // ----- Read the blocks + While (!($v_end_of_file = ($p_tar_mode == "tar" ? feof($v_tar) : gzeof($v_tar)))) { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset delete tag + $v_delete_file = false; + + // ----- Read the first 512 block header + if ($p_tar_mode == "tar") { + $v_binary_data = fread($v_tar, 512); + } else { + $v_binary_data = gzread($v_tar, 512); + } + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) { + // ----- Close the archive file + if ($p_tar_mode == "tar") { + fclose($v_tar); + fclose($v_temp_tar); + } else { + gzclose($v_tar); + gzclose($v_temp_tar); + } + @unlink($v_temp_tarname); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look for filenames to delete + for ($i = 0, $v_delete_file = false; ($i < sizeof($p_file_list)) && (!$v_delete_file); $i++) { + // ----- Compare the file names // if ($p_file_list[$i] == $v_header[filename]) - if (($v_len = strcmp($p_file_list[$i], $v_header[filename])) <= 0) - { - if ($v_len==0) - { - TrFctMessage(__FILE__, __LINE__, 3, "Found that '$v_header[filename]' need to be deleted"); - $v_delete_file = TRUE; - } - else - { - TrFctMessage(__FILE__, __LINE__, 3, "Look if '$v_header[filename]' is a file in $p_file_list[$i]"); - if (substr($v_header[filename], strlen($p_file_list[$i]), 1) == "/") - { - TrFctMessage(__FILE__, __LINE__, 3, "'$v_header[filename]' is a file in $p_file_list[$i]"); - $v_delete_file = TRUE; - } - } - } - } - - // ----- Copy files that do not need to be deleted - if (!$v_delete_file) - { - TrFctMessage(__FILE__, __LINE__, 2, "Keep file '$v_header[filename]'"); - - // ----- Write the file header - if ($p_tar_mode == "tar") - { - fputs($v_temp_tar, $v_binary_data, 512); - } - else - { - gzputs($v_temp_tar, $v_binary_data, 512); - } - - // ----- Write the file data - $n = ceil($v_header[size]/512); - for ($i=0; $i<$n; $i++) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($i+1)); - if ($p_tar_mode == "tar") - { - $v_content = fread($v_tar, 512); - fwrite($v_temp_tar, $v_content, 512); - } - else - { - $v_content = gzread($v_tar, 512); - gzwrite($v_temp_tar, $v_content, 512); - } - } - - // ----- File name and properties are logged if listing mode or file is extracted - TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); - - // ----- Add the array describing the file into the list - $p_list_detail[$v_nb] = $v_header; - $p_list_detail[$v_nb][status] = "ok"; - - // ----- Increment - $v_nb++; - } - - // ----- Look for file that is to be deleted - else - { - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Start deletion of '$v_header[filename]'"); - TrFctMessage(__FILE__, __LINE__, 4, "Position avant jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - - // ----- Jump to next file - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); - - TrFctMessage(__FILE__, __LINE__, 4, "Position apr�s jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); - } - - // ----- Look for end of file - if ($p_tar_mode == "tar") - $v_end_of_file = feof($v_tar); - else - $v_end_of_file = gzeof($v_tar); - } - - // ----- Write the last empty buffer - PclTarHandleFooter($v_temp_tar, $p_tar_mode); - - // ----- Close the tarfile - if ($p_tar_mode == "tar") - { - fclose($v_tar); - fclose($v_temp_tar); - } - else - { - gzclose($v_tar); - gzclose($v_temp_tar); - } - - // ----- Unlink tar file - if (!@unlink($p_tarname)) - { - // ----- Error log - PclErrorLog(-11, "Error while deleting archive name $p_tarname"); - } - - - // ----- Rename tar file - if (!@rename($v_temp_tarname, $p_tarname)) - { - // ----- Error log - PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleUpdate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleUpdate($p_tarname, $p_file_list, &$p_list_detail, $p_tar_mode, $p_add_dir, $p_remove_dir) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleUpdate", "archive='$p_tarname', list, tar_mode=$p_tar_mode"); - $v_result=1; - $v_nb=0; - $v_found_list = array(); - - // ----- Look for regular tar file - if ($p_tar_mode == "tar") - { - // ----- Open file - TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_tar = @fopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @fopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - fclose($v_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - } - - // ----- Look for compressed tar file - else - { - // ----- Open the file in read mode - TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); - if (($v_tar = @gzopen($p_tarname, "rb")) == 0) - { - // ----- Error log - PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Open a temporary file in write mode - $v_temp_tarname = uniqid("pcltar-").".tmp"; - TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); - if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) - { - // ----- Close tar file - gzclose($v_tar); - - // ----- Error log - PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - } - - // ----- Prepare the list of files - for ($i=0; $i $v_header[mtime]) - { - TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' need to be updated"); - $v_update_file = TRUE; - } - else - { - TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' does not need to be updated"); - $v_update_file = FALSE; - } - - // ----- Flag the name in order not to add the file at the end - $v_found_list[$i] = 1; - } - else - { - TrFctMessage(__FILE__, __LINE__, 4, "File '$p_file_list[$i]' is not '$v_header[filename]'"); - } - } - - // ----- Copy files that do not need to be updated - if (!$v_update_file) - { - TrFctMessage(__FILE__, __LINE__, 2, "Keep file '$v_header[filename]'"); - - // ----- Write the file header - if ($p_tar_mode == "tar") - { - fputs($v_temp_tar, $v_binary_data, 512); - } - else - { - gzputs($v_temp_tar, $v_binary_data, 512); - } - - // ----- Write the file data - $n = ceil($v_header[size]/512); - for ($j=0; $j<$n; $j++) - { - TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($j+1)); - if ($p_tar_mode == "tar") - { - $v_content = fread($v_tar, 512); - fwrite($v_temp_tar, $v_content, 512); - } - else - { - $v_content = gzread($v_tar, 512); - gzwrite($v_temp_tar, $v_content, 512); - } - } - - // ----- File name and properties are logged if listing mode or file is extracted - TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); - - // ----- Add the array describing the file into the list - $p_list_detail[$v_nb] = $v_header; - $p_list_detail[$v_nb][status] = ($v_found_file?"not_updated":"ok"); - - // ----- Increment - $v_nb++; - } - - // ----- Look for file that need to be updated - else - { - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Start update of file '$v_current_filename'"); - - // ----- Store the old file size - $v_old_size = $v_header[size]; - - // ----- Add the file - if (($v_result = PclTarHandleAddFile($v_temp_tar, $v_current_filename, $p_tar_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) - { - // ----- Close the tarfile - if ($p_tar_mode == "tar") - { - fclose($v_tar); - fclose($v_temp_tar); - } - else - { - gzclose($v_tar); - gzclose($v_temp_tar); - } - @unlink($p_temp_tarname); - - // ----- Return status - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Trace - TrFctMessage(__FILE__, __LINE__, 2, "Skip old file '$v_header[filename]'"); - - // ----- Jump to next file - if ($p_tar_mode == "tar") - fseek($v_tar, ftell($v_tar)+(ceil(($v_old_size/512))*512)); - else - gzseek($v_tar, gztell($v_tar)+(ceil(($v_old_size/512))*512)); - - // ----- Add the array describing the file into the list - $p_list_detail[$v_nb] = $v_header; - $p_list_detail[$v_nb][status] = "updated"; - - // ----- Increment - $v_nb++; - } - - // ----- Look for end of file - if ($p_tar_mode == "tar") - $v_end_of_file = feof($v_tar); - else - $v_end_of_file = gzeof($v_tar); - } - - // ----- Look for files that does not exists in the archive and need to be added - for ($i=0; $i $v_header[mtime]) { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' need to be updated"); + $v_update_file = true; + } else { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' does not need to be updated"); + $v_update_file = false; + } + + // ----- Flag the name in order not to add the file at the end + $v_found_list[$i] = 1; + } else { + TrFctMessage(__FILE__, __LINE__, 4, "File '$p_file_list[$i]' is not '$v_header[filename]'"); + } + } + + // ----- Copy files that do not need to be updated + if (!$v_update_file) { + TrFctMessage(__FILE__, __LINE__, 2, "Keep file '$v_header[filename]'"); + + // ----- Write the file header + if ($p_tar_mode == "tar") { + fputs($v_temp_tar, $v_binary_data, 512); + } else { + gzputs($v_temp_tar, $v_binary_data, 512); + } + + // ----- Write the file data + $n = ceil($v_header[size]/512); + for ($j = 0; $j < $n; $j++) { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number " . ($j+1)); + if ($p_tar_mode == "tar") { + $v_content = fread($v_tar, 512); + fwrite($v_temp_tar, $v_content, 512); + } else { + $v_content = gzread($v_tar, 512); + gzwrite($v_temp_tar, $v_content, 512); + } + } + + // ----- File name and properties are logged if listing mode or file is extracted + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + $p_list_detail[$v_nb][status] = ($v_found_file ? "not_updated" : "ok"); + + // ----- Increment + $v_nb++; + } // ----- Look for file that need to be updated + else { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Start update of file '$v_current_filename'"); + + // ----- Store the old file size + $v_old_size = $v_header[size]; + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($v_temp_tar, $v_current_filename, $p_tar_mode, $v_header, $p_add_dir, + $p_remove_dir)) != 1 + ) { + // ----- Close the tarfile + if ($p_tar_mode == "tar") { + fclose($v_tar); + fclose($v_temp_tar); + } else { + gzclose($v_tar); + gzclose($v_temp_tar); + } + @unlink($p_temp_tarname); + + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Skip old file '$v_header[filename]'"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") { + fseek($v_tar, ftell($v_tar)+(ceil(($v_old_size/512))*512)); + } else { + gzseek($v_tar, gztell($v_tar)+(ceil(($v_old_size/512))*512)); + } + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + $p_list_detail[$v_nb][status] = "updated"; + + // ----- Increment + $v_nb++; + } + + // ----- Look for end of file + if ($p_tar_mode == "tar") { + $v_end_of_file = feof($v_tar); + } else { + $v_end_of_file = gzeof($v_tar); + } + } + + // ----- Look for files that does not exists in the archive and need to be added + for ($i = 0; $i < sizeof($p_file_list); $i++) { + // ----- Look if file not found in the archive + if (!$v_found_list[$i]) { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' need to be added"); + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($v_temp_tar, $p_file_list[$i], $p_tar_mode, $v_header, $p_add_dir, + $p_remove_dir)) != 1 + ) { + // ----- Close the tarfile + if ($p_tar_mode == "tar") { + fclose($v_tar); + fclose($v_temp_tar); + } else { + gzclose($v_tar); + gzclose($v_temp_tar); + } + @unlink($p_temp_tarname); + + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + $p_list_detail[$v_nb][status] = "added"; + + // ----- Increment + $v_nb++; + } else { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' was already updated if needed"); + } + } + + // ----- Write the last empty buffer + PclTarHandleFooter($v_temp_tar, $p_tar_mode); + + // ----- Close the tarfile + if ($p_tar_mode == "tar") { + fclose($v_tar); + fclose($v_temp_tar); + } else { + gzclose($v_tar); + gzclose($v_temp_tar); + } + + // ----- Unlink tar file + if (!@unlink($p_tarname)) { + // ----- Error log + PclErrorLog(-11, "Error while deleting archive name $p_tarname"); + } + + + // ----- Rename tar file + if (!@rename($v_temp_tarname, $p_tarname)) { + // ----- Error log + PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleReadHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleReadHeader($v_binary_data, &$v_header) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleReadHeader", ""); + $v_result = 1; + + // ----- Read the 512 bytes header + /* if ($p_tar_mode == "tar") $v_binary_data = fread($p_tar, 512); else $v_binary_data = gzread($p_tar, 512); */ - // ----- Look for no more block - if (strlen($v_binary_data)==0) - { - $v_header[filename] = ""; - $v_header[status] = "empty"; - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result, "End of archive found"); - return $v_result; - } - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 512) - { - $v_header[filename] = ""; - $v_header[status] = "invalid_header"; - TrFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Error log - PclErrorLog(-10, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - - // ----- Calculate the checksum - $v_checksum = 0; - // ..... First part of the header - for ($i=0; $i<148; $i++) - { - $v_checksum+=ord(substr($v_binary_data,$i,1)); - } - // ..... Ignore the checksum value and replace it by ' ' (space) - for ($i=148; $i<156; $i++) - { - $v_checksum += ord(' '); - } - // ..... Last part of the header - for ($i=156; $i<512; $i++) - { - $v_checksum+=ord(substr($v_binary_data,$i,1)); - } - TrFctMessage(__FILE__, __LINE__, 3, "Calculated checksum : $v_checksum"); - - // ----- Extract the values - TrFctMessage(__FILE__, __LINE__, 2, "Header : '$v_binary_data'"); - $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $v_binary_data); - - // ----- Extract the checksum for check - $v_header[checksum] = OctDec(trim($v_data[checksum])); - TrFctMessage(__FILE__, __LINE__, 3, "File checksum : $v_header[checksum]"); - if ($v_header[checksum] != $v_checksum) - { - TrFctMessage(__FILE__, __LINE__, 2, "File checksum is invalid : $v_checksum calculated, $v_header[checksum] expected"); - - $v_header[filename] = ""; - $v_header[status] = "invalid_header"; - - // ----- Look for last block (empty block) - if (($v_checksum == 256) && ($v_header[checksum] == 0)) - { - $v_header[status] = "empty"; - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result, "End of archive found"); - return $v_result; - } - - // ----- Error log - PclErrorLog(-13, "Invalid checksum : $v_checksum calculated, $v_header[checksum] expected"); - - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } - TrFctMessage(__FILE__, __LINE__, 2, "File checksum is valid ($v_checksum)"); - - // ----- Extract the properties - $v_header[filename] = trim($v_data[filename]); - TrFctMessage(__FILE__, __LINE__, 2, "Name : '$v_header[filename]'"); - $v_header[mode] = OctDec(trim($v_data[mode])); - TrFctMessage(__FILE__, __LINE__, 2, "Mode : '".DecOct($v_header[mode])."'"); - $v_header[uid] = OctDec(trim($v_data[uid])); - TrFctMessage(__FILE__, __LINE__, 2, "Uid : '$v_header[uid]'"); - $v_header[gid] = OctDec(trim($v_data[gid])); - TrFctMessage(__FILE__, __LINE__, 2, "Gid : '$v_header[gid]'"); - $v_header[size] = OctDec(trim($v_data[size])); - TrFctMessage(__FILE__, __LINE__, 2, "Size : '$v_header[size]'"); - $v_header[mtime] = OctDec(trim($v_data[mtime])); - TrFctMessage(__FILE__, __LINE__, 2, "Date : ".date("l dS of F Y h:i:s A", $v_header[mtime])); - if (($v_header[typeflag] = $v_data[typeflag]) == "5") - { - $v_header[size] = 0; - TrFctMessage(__FILE__, __LINE__, 2, "Size (folder) : '$v_header[size]'"); - } - TrFctMessage(__FILE__, __LINE__, 2, "File typeflag : $v_header[typeflag]"); - /* ----- All these fields are removed form the header because they do not carry interesting info + // ----- Look for no more block + if (strlen($v_binary_data) == 0) { + $v_header[filename] = ""; + $v_header[status] = "empty"; + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result, "End of archive found"); + + return $v_result; + } + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 512) { + $v_header[filename] = ""; + $v_header[status] = "invalid_header"; + TrFctMessage(__FILE__, __LINE__, 2, "Invalid block size : " . strlen($v_binary_data)); + + // ----- Error log + PclErrorLog(-10, "Invalid block size : " . strlen($v_binary_data)); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i = 0; $i < 148; $i++) { + $v_checksum += ord(substr($v_binary_data, $i, 1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i = 148; $i < 156; $i++) { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i = 156; $i < 512; $i++) { + $v_checksum += ord(substr($v_binary_data, $i, 1)); + } + TrFctMessage(__FILE__, __LINE__, 3, "Calculated checksum : $v_checksum"); + + // ----- Extract the values + TrFctMessage(__FILE__, __LINE__, 2, "Header : '$v_binary_data'"); + $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", + $v_binary_data); + + // ----- Extract the checksum for check + $v_header[checksum] = OctDec(trim($v_data[checksum])); + TrFctMessage(__FILE__, __LINE__, 3, "File checksum : $v_header[checksum]"); + if ($v_header[checksum] != $v_checksum) { + TrFctMessage(__FILE__, __LINE__, 2, + "File checksum is invalid : $v_checksum calculated, $v_header[checksum] expected"); + + $v_header[filename] = ""; + $v_header[status] = "invalid_header"; + + // ----- Look for last block (empty block) + if (($v_checksum == 256) && ($v_header[checksum] == 0)) { + $v_header[status] = "empty"; + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result, "End of archive found"); + + return $v_result; + } + + // ----- Error log + PclErrorLog(-13, "Invalid checksum : $v_checksum calculated, $v_header[checksum] expected"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + TrFctMessage(__FILE__, __LINE__, 2, "File checksum is valid ($v_checksum)"); + + // ----- Extract the properties + $v_header[filename] = trim($v_data[filename]); + TrFctMessage(__FILE__, __LINE__, 2, "Name : '$v_header[filename]'"); + $v_header[mode] = OctDec(trim($v_data[mode])); + TrFctMessage(__FILE__, __LINE__, 2, "Mode : '" . DecOct($v_header[mode]) . "'"); + $v_header[uid] = OctDec(trim($v_data[uid])); + TrFctMessage(__FILE__, __LINE__, 2, "Uid : '$v_header[uid]'"); + $v_header[gid] = OctDec(trim($v_data[gid])); + TrFctMessage(__FILE__, __LINE__, 2, "Gid : '$v_header[gid]'"); + $v_header[size] = OctDec(trim($v_data[size])); + TrFctMessage(__FILE__, __LINE__, 2, "Size : '$v_header[size]'"); + $v_header[mtime] = OctDec(trim($v_data[mtime])); + TrFctMessage(__FILE__, __LINE__, 2, "Date : " . date("l dS of F Y h:i:s A", $v_header[mtime])); + if (($v_header[typeflag] = $v_data[typeflag]) == "5") { + $v_header[size] = 0; + TrFctMessage(__FILE__, __LINE__, 2, "Size (folder) : '$v_header[size]'"); + } + TrFctMessage(__FILE__, __LINE__, 2, "File typeflag : $v_header[typeflag]"); + /* ----- All these fields are removed form the header because they do not carry interesting info $v_header[link] = trim($v_data[link]); TrFctMessage(__FILE__, __LINE__, 2, "Linkname : $v_header[linkname]"); $v_header[magic] = trim($v_data[magic]); @@ -3386,170 +3323,165 @@ if (!defined("PCL_TAR")) TrFctMessage(__FILE__, __LINE__, 2, "Devminor : $v_header[devminor]"); */ - // ----- Set the status field - $v_header[status] = "ok"; - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandlerDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check (without / at the end). - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function PclTarHandlerDirCheck($p_dir) - { - $v_result = 1; - - TrFctStart(__FILE__, __LINE__, "PclTarHandlerDirCheck", "$p_dir"); - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - TrFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory"); - return 1; - } + // ----- Set the status field + $v_header[status] = "ok"; - // ----- Look for file alone - /* - if (!strstr("$p_dir", "/")) - { - TrFctEnd(__FILE__, __LINE__, "'$p_dir' is a file with no directory"); - return 1; - } - */ + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - TrFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'"); + return $v_result; + } - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = PclTarHandlerDirCheck($p_parent_dir)) != 1) - { - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - } - } + // -------------------------------------------------------------------------------- - // ----- Create the directory - TrFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'"); - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclErrorLog(-8, "Unable to create directory '$p_dir'"); + // -------------------------------------------------------------------------------- + // Function : PclTarHandlerDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check (without / at the end). + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function PclTarHandlerDirCheck($p_dir) { + $v_result = 1; - // ----- Return - TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); - return PclErrorCode(); - } + TrFctStart(__FILE__, __LINE__, "PclTarHandlerDirCheck", "$p_dir"); - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created"); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclTarHandleExtension() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandleExtension($p_tarname) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandleExtension", "tar=$p_tarname"); - - // ----- Look for file extension - if ((substr($p_tarname, -7) == ".tar.gz") || (substr($p_tarname, -4) == ".tgz")) - { - TrFctMessage(__FILE__, __LINE__, 2, "Archive is a gzip tar"); - $v_tar_mode = "tgz"; - } - else if (substr($p_tarname, -4) == ".tar") - { - TrFctMessage(__FILE__, __LINE__, 2, "Archive is a tar"); - $v_tar_mode = "tar"; - } - else - { - // ----- Error log - PclErrorLog(-9, "Invalid archive extension"); + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) { + TrFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory"); - TrFctMessage(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 1; + } - $v_tar_mode = ""; - } - - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_tar_mode); - return $v_tar_mode; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : PclTarHandlePathReduction() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclTarHandlePathReduction($p_dir) - { - TrFctStart(__FILE__, __LINE__, "PclTarHandlePathReduction", "dir='$p_dir'"); - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") + // ----- Look for file alone + /* + if (!strstr("$p_dir", "/")) { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - for ($i=sizeof($v_list)-1; $i>=0; $i--) - { - // ----- Look for current path - if ($v_list[$i] == ".") - { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") - { - // ----- Ignore it and ignore the $i-1 - $i--; - } - else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0)) - { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - else - { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } + TrFctEnd(__FILE__, __LINE__, "'$p_dir' is a file with no directory"); + return 1; } + */ - // ----- Return - TrFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + TrFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'"); + + // ----- Just a check + if ($p_parent_dir != $p_dir) { + // ----- Look for parent directory + if ($p_parent_dir != "") { + if (($v_result = PclTarHandlerDirCheck($p_parent_dir)) != 1) { + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + } + } + + // ----- Create the directory + TrFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'"); + if (!@mkdir($p_dir, 0777)) { + // ----- Error log + PclErrorLog(-8, "Unable to create directory '$p_dir'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created"); + + return $v_result; + } + + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtension() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtension($p_tarname) { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtension", "tar=$p_tarname"); + + // ----- Look for file extension + if ((substr($p_tarname, -7) == ".tar.gz") || (substr($p_tarname, -4) == ".tgz")) { + TrFctMessage(__FILE__, __LINE__, 2, "Archive is a gzip tar"); + $v_tar_mode = "tgz"; + } else { + if (substr($p_tarname, -4) == ".tar") { + TrFctMessage(__FILE__, __LINE__, 2, "Archive is a tar"); + $v_tar_mode = "tar"; + } else { + // ----- Error log + PclErrorLog(-9, "Invalid archive extension"); + + TrFctMessage(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + + $v_tar_mode = ""; + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_tar_mode); + + return $v_tar_mode; + } + + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : PclTarHandlePathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandlePathReduction($p_dir) { + TrFctStart(__FILE__, __LINE__, "PclTarHandlePathReduction", "dir='$p_dir'"); + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + for ($i = sizeof($v_list)-1; $i >= 0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } else { + if ($v_list[$i] == "..") { + // ----- Ignore it and ignore the $i-1 + $i--; + } else { + if (($v_list[$i] == "") && ($i != (sizeof($v_list)-1)) && ($i != 0)) { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } else { + $v_result = $v_list[$i] . ($i != (sizeof($v_list)-1) ? "/" . $v_result : ""); + } + } + } + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + + return $v_result; + } + + // -------------------------------------------------------------------------------- // ----- End of double include look diff --git a/inc/svp_actionner.php b/inc/svp_actionner.php index 3604c1f..5979bbd 100644 --- a/inc/svp_actionner.php +++ b/inc/svp_actionner.php @@ -1,14 +1,16 @@ type d'action */ @@ -47,7 +53,7 @@ class Actionneur { * * Chaque sous-tableau est composé d'une description courte du paquet * auquel est ajouté dans l'index 'todo' le type d'action à faire. - * + * * @var array * Index 'off' : les paquets à désactiver (ordre inverse des dépendances) * Index 'lib' : les librairies à installer @@ -65,43 +71,51 @@ class Actionneur { /** * Liste des actions à faire - * + * * Liste de description courtes des paquets + index 'todo' indiquant l'action - * @var array */ + * + * @var array + */ var $end = array(); /** * Liste des actions faites * Liste de description courtes des paquets + index 'todo' indiquant l'action - * @var array */ + * + * @var array + */ var $done = array(); // faites /** * Actions en cours * Description courte du paquet + index 'todo' indiquant l'action - * @var array */ + * + * @var array + */ var $work = array(); /** * Liste des erreurs - * - * @var array Liste des erreurs */ + * + * @var array Liste des erreurs + */ var $err = array(); /** * Verrou. * Le verrou est posé au moment de passer à l'action. + * * @var array * Index 'id_auteur' : Identifiant de l'auteur ayant déclenché des actions * Indix 'time' : timestamp de l'heure de déclenchement de l'action */ - var $lock = array('id_auteur'=>0, 'time'=>''); + var $lock = array('id_auteur' => 0, 'time' => ''); /** * SVP (ce plugin) est-il à désactiver dans une des actions ? * * Dans ce cas, on tente de le désactiver après d'autres plugins à désactiver * sinon l'ensemble des actions suivantes échoueraient. - * + * * @var bool * false si SVP n'est pas à désactiver, true sinon */ var $svp_off = false; @@ -111,7 +125,7 @@ class Actionneur { * * Détermine si les logs sont activés et instancie un décideur. */ - function __construct(){ + function __construct() { include_spip('inc/config'); $this->log = (lire_config('svp/mode_log_verbeux') == 'oui'); @@ -131,22 +145,22 @@ class Actionneur { * * @param mixed $quoi * La chose à logguer (souvent un texte) - **/ + **/ function log($quoi) { if ($this->log) { - spip_log($quoi,'actionneur'); + spip_log($quoi, 'actionneur'); } } /** * Ajoute une erreur - * + * * Ajoute une erreur à la liste des erreurs présentées au moment * de traiter les actions. * * @param string $erreur * Le texte de l'erreur - **/ + **/ function err($erreur) { if ($erreur) { $this->err[] = $erreur; @@ -169,13 +183,13 @@ class Actionneur { } /** - * Ajoute les actions à faire dans l'actionneur + * Ajoute les actions à faire dans l'actionneur * * @param array $todo * Tableau des actions à faire (identifiant de paquet => type d'action) - **/ + **/ function ajouter_actions($todo) { - if ($todo){ + if ($todo) { foreach ($todo as $id => $action) { $this->start[$id] = $action; } @@ -198,11 +212,11 @@ class Actionneur { if (!$this->decideur->est_presente_lib($nom)) { if (is_writable(_DIR_LIB)) { $this->middle['lib'][$nom] = array( - 'todo'=>'getlib', - 'n'=>$nom, - 'p'=>$nom, - 'v'=>$source, - 's'=>$source, + 'todo' => 'getlib', + 'n' => $nom, + 'p' => $nom, + 'v' => $source, + 's' => $source, ); } else { // erreur : impossible d'ecrire dans _DIR_LIB ! @@ -210,6 +224,7 @@ class Actionneur { return false; } } + return true; } @@ -237,7 +252,7 @@ class Actionneur { // nettoyer le terrain $this->clear(); - foreach ($this->start as $id=>$action) { + foreach ($this->start as $id => $action) { $i = array(); // description du paquet. Ne s'applique pas si librairie ($id = md5) if (is_int($id)) { $i = $this->decideur->infos_courtes_id($id); @@ -254,7 +269,7 @@ class Actionneur { break; case 'up': // si le plugin est actif - if ($i['a'] == 'oui') { + if ($i['a'] == 'oui') { $this->on($i, $action); } else { $this->neutre($i, $action); @@ -292,7 +307,7 @@ class Actionneur { } } } - + $this->log("------------"); #$this->log("Fin du tri :"); #$this->log($this->end); @@ -300,7 +315,7 @@ class Actionneur { /** - * Ajoute un paquet à activer + * Ajoute un paquet à activer * * À chaque fois qu'un nouveau paquet arrive ici, on le compare * avec ceux déjà présents pour savoir si on doit le traiter avant @@ -313,13 +328,13 @@ class Actionneur { * librairies seront téléchargées avant l'activation des plugins, * le plugin aura donc sa librairie lorsqu'il sera activé) * - * + * * @param array $info * Description du paquet * @param string $action * Action à réaliser (on, upon) * @return void - **/ + **/ function on($info, $action) { $info['todo'] = $action; $p = $info['p']; @@ -331,14 +346,14 @@ class Actionneur { $this->middle['on'] = array_values($this->middle['on']); // ajout des dependance foreach ($info['dn'] as $dep) { - $in[] = $dep['nom']; + $in[] = $dep['nom']; } // $info fourni ses procure - if (isset($info['procure']) AND $info['procure']){ + if (isset($info['procure']) AND $info['procure']) { $prov = array_keys($info['procure']); } // et se fournit lui meme evidemment - array_unshift($prov,$p); + array_unshift($prov, $p); // ajout des librairies foreach ($info['dl'] as $lib) { @@ -351,11 +366,11 @@ class Actionneur { // // ainsi que les dependences de ces plugins (deps) // ie. ces plugins peuvent dependre de ce nouveau a activer. - foreach ($this->middle['on'] as $k=>$inf) { + foreach ($this->middle['on'] as $k => $inf) { $out["$k:0"] = $inf['p']; - if (isset($inf['procure']) AND $inf['procure']){ + if (isset($inf['procure']) AND $inf['procure']) { $i = 1; - foreach($inf['procure'] as $procure=>$v){ + foreach ($inf['procure'] as $procure => $v) { $out["$k:$i"] = $inf['p']; $i++; } @@ -379,7 +394,11 @@ class Actionneur { // on place notre action juste apres la derniere dependance if ($diff = array_intersect($in, $out)) { $key = array(); - foreach($diff as $d) {$k = array_search($d, $out); $k = explode(":",$k); $key[] = reset($k);} + foreach ($diff as $d) { + $k = array_search($d, $out); + $k = explode(":", $k); + $key[] = reset($k); + } $key = max($key); $this->log("- placer $p apres " . $this->middle['on'][$key]['p']); if ($key == count($this->middle['on'])) { @@ -388,12 +407,16 @@ class Actionneur { array_splice($this->middle['on'], $key+1, 0, array($info)); } - // intersection = plugin dependant de celui-ci - // on place notre plugin juste avant la premiere dependance a lui trouvee + // intersection = plugin dependant de celui-ci + // on place notre plugin juste avant la premiere dependance a lui trouvee } elseif (array_intersect($prov, $deps_all)) { - foreach ($deps as $prefix=>$dep) { + foreach ($deps as $prefix => $dep) { if ($diff = array_intersect($prov, $deps_all)) { - foreach($diff as $d) {$k = array_search($d, $out); $k = explode(":",$k); $key[] = reset($k);} + foreach ($diff as $d) { + $k = array_search($d, $out); + $k = explode(":", $k); + $key[] = reset($k); + } $key = min($key); $this->log("- placer $p avant $prefix qui en depend ($key)"); if ($key == 0) { @@ -405,9 +428,9 @@ class Actionneur { } } - // rien de particulier, il a des dependances mais les plugins - // ne sont pas encore la ou les dependances sont deja actives - // donc on le place tout en bas + // rien de particulier, il a des dependances mais les plugins + // ne sont pas encore la ou les dependances sont deja actives + // donc on le place tout en bas } else { $this->log("- placer $p tout en bas"); $this->middle['on'][] = $info; @@ -418,17 +441,17 @@ class Actionneur { /** - * Ajoute un paquet avec une action neutre + * Ajoute un paquet avec une action neutre * * Ces actions seront traitées en dernier, et peu importe leur * ordre car elles n'entrent pas en conflit avec des dépendances. - * + * * @param array $info * Description du paquet * @param string $action * Action à réaliser (kill, get, up (sur plugin inactif)) * @return void - **/ + **/ function neutre($info, $action) { $info['todo'] = $action; $this->log("NEUTRE: $info[p] $action"); @@ -446,13 +469,13 @@ class Actionneur { * * Si le paquet est une dépendance d'un autre plugin, il faut le mettre * après (pour désactiver avant celui qui en dépend). - * + * * @param array $info * Description du paquet * @param string $action * Action à réaliser (kill, get, up (sur plugin inactif)) * @return void - **/ + **/ function off($info, $action) { $info['todo'] = $action; $p = $info['p']; @@ -462,15 +485,15 @@ class Actionneur { if ($p == 'SVP') { $this->svp_off = true; } - + // si dependance, il faut le mettre avant ! $in = $out = array(); // raz des cles pour avoir les memes que $out (utile reellement ?) $this->middle['off'] = array_values($this->middle['off']); foreach ($info['dn'] as $dep) { - $in[] = $dep['nom']; + $in[] = $dep['nom']; } - foreach ($this->middle['off'] as $inf) { + foreach ($this->middle['off'] as $inf) { $out[] = $inf['p']; } @@ -481,12 +504,14 @@ class Actionneur { } else { // ce plugin a des dependances, // on le desactive juste avant elles. - + // intersection = dependance presente aussi // on place notre action juste avant la premiere dependance if ($diff = array_intersect($in, $out)) { $key = array(); - foreach($diff as $d) {$key[] = array_search($d, $out);} + foreach ($diff as $d) { + $key[] = array_search($d, $out); + } $key = min($key); $this->log("- placer $p avant " . $this->middle['off'][$key]['p']); array_splice($this->middle['off'], $key, 0, array($info)); @@ -508,23 +533,23 @@ class Actionneur { * Si c'est un affichage du bilan de fin, et qu'il reste des actions * à faire, un lien est proposé pour faire supprimer ces actions restantes * et le verrou qui va avec. - * + * * @param bool $fin * Est-ce un affichage intermédiaire (false) ou le tout dernier (true). * @return string * Bilan des actions au format HTML - **/ + **/ function presenter_actions($fin = false) { $affiche = ""; include_spip('inc/filtres_boites'); - + if (count($this->err)) { $erreurs = "
    "; foreach ($this->err as $i) { $erreurs .= "\t
  • " . $i . "
  • \n"; } - $erreurs .= "
"; + $erreurs .= ""; $affiche .= boite_ouvrir(_T('svp:actions_en_erreur'), 'error') . $erreurs . boite_fermer(); } @@ -537,7 +562,7 @@ class Actionneur { $ok_texte = $ok ? 'ok' : 'fail'; $cle_t = 'svp:message_action_finale_' . $i['todo'] . '_' . $ok_texte; $trads = array( - 'plugin' => $i['n'], + 'plugin' => $i['n'], 'version' => denormaliser_version($i['v']), ); if (isset($i['maj'])) { @@ -548,19 +573,21 @@ class Actionneur { $texte .= " $i[done]"; } // si le plugin a ete active dans le meme lot, on remplace le message 'active' par le message 'installe' - if ($i['todo']=='install' AND $ok_texte=='ok'){ + if ($i['todo'] == 'install' AND $ok_texte == 'ok') { $cle_t = 'svp:message_action_finale_' . 'on' . '_' . $ok_texte; $texte_on = _T($cle_t, array( 'plugin' => $i['n'], 'version' => denormaliser_version($i['v']), - 'version_maj' => denormaliser_version($i['maj']))); - if (strpos($done,$texte_on)!==false){ - $done = str_replace($texte_on,$texte, $done); + 'version_maj' => denormaliser_version($i['maj']) + )); + if (strpos($done, $texte_on) !== false) { + $done = str_replace($texte_on, $texte, $done); $texte = ""; } } - if ($texte) + if ($texte) { $done .= "\t
  • $texte
  • \n"; + } } $done .= ""; $affiche .= boite_ouvrir(_T('svp:actions_realises'), ($oks ? 'success' : 'notice')) . $done . boite_fermer(); @@ -569,10 +596,11 @@ class Actionneur { if (count($this->end)) { $todo = "
      "; foreach ($this->end as $i) { - $todo .= "\t
    • "._T('svp:message_action_'.$i['todo'],array( - 'plugin'=>$i['n'], - 'version'=>denormaliser_version($i['v']), - 'version_maj'=>denormaliser_version($i['maj'])))."
    • \n"; + $todo .= "\t
    • " . _T('svp:message_action_' . $i['todo'], array( + 'plugin' => $i['n'], + 'version' => denormaliser_version($i['v']), + 'version_maj' => denormaliser_version($i['maj']) + )) . "
    • \n"; } $todo .= "
    \n"; $titre = ($fin ? _T('svp:actions_non_traitees') : _T('svp:actions_a_faire')); @@ -591,10 +619,11 @@ class Actionneur { $date = date('Y-m-d H:i:s', $time); $todo .= "
    \n"; $todo .= "

    " . _T('svp:erreur_actions_non_traitees', array( - 'auteur' => sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . sql_quote($this->lock['id_auteur'])), - 'date' => affdate_heure($date) - )) . "

    \n"; - $todo .= "" . _T('svp:nettoyer_actions') . "\n"; + 'auteur' => sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . sql_quote($this->lock['id_auteur'])), + 'date' => affdate_heure($date) + )) . "

    \n"; + $todo .= "" . _T('svp:nettoyer_actions') . "\n"; } $affiche .= boite_ouvrir($titre, 'notice') . $todo . boite_fermer(); } @@ -603,7 +632,7 @@ class Actionneur { include_spip('inc/filtres'); $affiche = wrap($affiche, "
    "); } - + return $affiche; } @@ -614,16 +643,17 @@ class Actionneur { * précis qui a posé le verrou. * * @see Actionneur::verrouiller() - * + * * @param int|string $id_auteur * Identifiant de l'auteur, ou vide * @return bool * true si un verrou est là, false sinon - **/ + **/ function est_verrouille($id_auteur = '') { if ($id_auteur == '') { return ($this->lock['id_auteur'] ? true : false); } + return ($this->lock['id_auteur'] == $id_auteur); } @@ -638,9 +668,9 @@ class Actionneur { * Le verrou est signé par l'id_auteur de l'auteur actuellement identifié. * * Le verrou sera sauvegardé en fichier avec la liste des actions - * + * * @see Actionneur::sauver_actions() - **/ + **/ function verrouiller() { $this->lock = array( 'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'], @@ -650,7 +680,7 @@ class Actionneur { /** * Enlève le verrou - **/ + **/ function deverrouiller() { $this->lock = array( 'id_auteur' => 0, @@ -666,15 +696,15 @@ class Actionneur { * les erreurs générées, et le verrouillage. * * Le cache peut être lu avec la méthode get_actions() - * + * * @see Actionneur::get_actions() - **/ + **/ function sauver_actions() { $contenu = serialize(array( 'todo' => $this->end, 'done' => $this->done, 'work' => $this->work, - 'err' => $this->err, + 'err' => $this->err, 'lock' => $this->lock, )); ecrire_fichier(_DIR_TMP . 'stp_actions.txt', $contenu); @@ -685,16 +715,16 @@ class Actionneur { * * Restaure les informations contenues dans le fichier de cache * et écrites avec la méthode sauver_actions(). - * + * * @see Actionneur::sauver_actions() - **/ + **/ function get_actions() { lire_fichier(_DIR_TMP . 'stp_actions.txt', $contenu); $infos = unserialize($contenu); - $this->end = $infos['todo']; + $this->end = $infos['todo']; $this->work = $infos['work']; $this->done = $infos['done']; - $this->err = $infos['err']; + $this->err = $infos['err']; $this->lock = $infos['lock']; } @@ -702,12 +732,12 @@ class Actionneur { * Nettoyage des actions et verrou * * Remet tout à zéro pour pouvoir repartir d'un bon pied. - **/ + **/ function nettoyer_actions() { $this->todo = array(); $this->done = array(); $this->work = array(); - $this->err = array(); + $this->err = array(); $this->deverrouiller(); $this->sauver_actions(); } @@ -722,7 +752,7 @@ class Actionneur { * @return bool|array * False si aucune action à faire, * sinon tableau de description courte du paquet + index 'todo' indiquant l'action - **/ + **/ function one_action() { // s'il reste des actions, on en prend une, et on la fait // de meme si une action est en cours mais pas terminee (timeout) @@ -755,6 +785,7 @@ class Actionneur { $this->deverrouiller(); $this->sauver_actions(); } + return $action; } else { // on ne devrait normalement plus tomber sur un cas de verrouillage ici @@ -764,6 +795,7 @@ class Actionneur { $this->sauver_actions(); } } + return false; } @@ -776,7 +808,7 @@ class Actionneur { * Place dans la clé 'done' de description courte du paquet * le résultat de l'action (un booléen indiquant si elle s'est bien * déroulée). - **/ + **/ function do_action() { if ($do = $this->work) { $todo = 'do_' . $do['todo']; @@ -802,13 +834,15 @@ class Actionneur { if (!$this->tester_repertoire_plugins_auto()) { return false; } - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); if ($dirs = $this->get_paquet_id($i)) { $this->activer_plugin_dossier($dirs['dossier'], $i); + return true; } - - $this->log("GetOn : Erreur de chargement du paquet " .$info['n']); + + $this->log("GetOn : Erreur de chargement du paquet " . $info['n']); + return false; } @@ -823,20 +857,21 @@ class Actionneur { * false si erreur, true sinon. */ function do_on($info) { - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); // à télécharger ? if (isset($i['id_zone']) and $i['id_zone'] > 0) { return $this->do_geton($info); } - + // a activer uniquement // il faudra prendre en compte les autres _DIR_xx - if (in_array($i['constante'], array('_DIR_PLUGINS','_DIR_PLUGINS_SUPPL'))) { + if (in_array($i['constante'], array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL'))) { $dossier = rtrim($i['src_archive'], '/'); $this->activer_plugin_dossier($dossier, $i, $i['constante']); + return true; } - + return false; } @@ -860,19 +895,21 @@ class Actionneur { // $i est le paquet a mettre à jour (donc present) // $maj est le paquet a telecharger qui est a jour (donc distant) - - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($info['i'])); + + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); // on cherche la mise a jour... // c'est a dire le paquet source que l'on met a jour. if ($maj = sql_fetsel('pa.*', array('spip_paquets AS pa', 'spip_plugins AS pl'), array( - 'pl.prefixe='.sql_quote($info['p']), - 'pa.version='.sql_quote($info['maj']), - 'pa.id_plugin = pl.id_plugin', - 'pa.id_depot>'.sql_quote(0)), - '', 'pa.etatnum DESC', '0,1')) { + 'pl.prefixe=' . sql_quote($info['p']), + 'pa.version=' . sql_quote($info['maj']), + 'pa.id_plugin = pl.id_plugin', + 'pa.id_depot>' . sql_quote(0) + ), + '', 'pa.etatnum DESC', '0,1') + ) { // si dans auto, on autorise à mettre à jour depuis auto pour les VCS $dir_actuel_dans_auto = ''; @@ -894,16 +931,18 @@ class Actionneur { // alors que le nouveau est auto/X/Y ... // il faut prendre en compte ce cas particulier et ne pas ecraser auto/X ! if (substr($i['src_archive'], 0, 5) == 'auto/' and (false === strpos($dirs['dossier'], $i['src_archive']))) { - if (supprimer_repertoire( constant($i['constante']) . $i['src_archive']) ) { + if (supprimer_repertoire(constant($i['constante']) . $i['src_archive'])) { sql_delete('spip_paquets', 'id_paquet=' . sql_quote($info['i'])); } } } $this->ajouter_plugin_interessants_meta($dirs['dossier']); + return $dirs; } } + return false; } @@ -917,11 +956,13 @@ class Actionneur { * false si erreur, true sinon */ function do_upon($info) { - $i = sql_fetsel('*', 'spip_paquets', 'id_paquet='.sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); if ($dirs = $this->do_up($info)) { $this->activer_plugin_dossier($dirs['dossier'], $i, $i['constante']); + return true; } + return false; } @@ -935,19 +976,20 @@ class Actionneur { * false si erreur, true sinon */ function do_off($info) { - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); // il faudra prendre en compte les autres _DIR_xx - if (in_array($i['constante'], array('_DIR_PLUGINS','_DIR_PLUGINS_SUPPL'))) { + if (in_array($i['constante'], array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL'))) { include_spip('inc/plugin'); $dossier = rtrim($i['src_archive'], '/'); - ecrire_plugin_actifs(array(rtrim($dossier,'/')), false, 'enleve'); - sql_updateq('spip_paquets', array('actif'=>'non', 'installe'=>'non'), 'id_paquet='.sql_quote($info['i'])); + ecrire_plugin_actifs(array(rtrim($dossier, '/')), false, 'enleve'); + sql_updateq('spip_paquets', array('actif' => 'non', 'installe' => 'non'), 'id_paquet=' . sql_quote($info['i'])); $this->actualiser_plugin_interessants(); // ce retour est un rien faux... // il faudrait que la fonction ecrire_plugin_actifs() // retourne au moins d'eventuels message d'erreur ! return true; } + return false; } @@ -961,22 +1003,23 @@ class Actionneur { * false si erreur, true sinon */ function do_stop($info) { - $i = sql_fetsel('*','spip_paquets','id_paquet=' . sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); // il faudra prendre en compte les autres _DIR_xx - if (in_array($i['constante'], array('_DIR_PLUGINS','_DIR_PLUGINS_SUPPL'))) { + if (in_array($i['constante'], array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL'))) { include_spip('inc/plugin'); - $dossier = rtrim($i['src_archive'],'/'); + $dossier = rtrim($i['src_archive'], '/'); $installer_plugins = charger_fonction('installer', 'plugins'); // retourne : // - false : pas de procedure d'install/desinstalle // - true : operation deja faite // - tableau : operation faite ce tour ci. - $infos = $installer_plugins($dossier, 'uninstall',$i['constante']); + $infos = $installer_plugins($dossier, 'uninstall', $i['constante']); if (is_bool($infos) OR !$infos['install_test'][0]) { include_spip('inc/plugin'); ecrire_plugin_actifs(array($dossier), false, 'enleve'); - sql_updateq('spip_paquets', array('actif'=>'non', 'installe'=>'non'), 'id_paquet='.sql_quote($info['i'])); + sql_updateq('spip_paquets', array('actif' => 'non', 'installe' => 'non'), 'id_paquet=' . sql_quote($info['i'])); + return true; } else { // echec @@ -984,6 +1027,7 @@ class Actionneur { } } $this->actualiser_plugin_interessants(); + return false; } @@ -1000,11 +1044,12 @@ class Actionneur { // on reverifie que c'est bien un plugin auto ! // il faudrait aussi faire tres attention sur un site mutualise // cette option est encore plus delicate que les autres... - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($info['i'])); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); + + if (in_array($i['constante'], array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL')) + and substr($i['src_archive'], 0, 5) == 'auto/' + ) { - if (in_array($i['constante'], array('_DIR_PLUGINS','_DIR_PLUGINS_SUPPL')) - and substr($i['src_archive'], 0, 5) == 'auto/') { - $dir = constant($i['constante']) . $i['src_archive']; if (supprimer_repertoire($dir)) { $id_plugin = sql_getfetsel('id_plugin', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); @@ -1053,6 +1098,7 @@ class Actionneur { } array_pop($chemins); } + return true; } } @@ -1073,20 +1119,23 @@ class Actionneur { if (!defined('_DIR_LIB') or !_DIR_LIB) { $this->err(_T('svp:erreur_dir_dib_indefini')); $this->log("/!\ Pas de _DIR_LIB defini !"); + return false; } if (!is_writable(_DIR_LIB)) { - $this->err(_T('svp:erreur_dir_dib_ecriture', array('dir' => _DIR_LIB ))); + $this->err(_T('svp:erreur_dir_dib_ecriture', array('dir' => _DIR_LIB))); $this->log("/!\ Ne peut pas écrire dans _DIR_LIB !"); + return false; } - if(!autoriser('plugins_ajouter')){ + if (!autoriser('plugins_ajouter')) { $this->err(_T('svp:erreur_auth_plugins_ajouter_lib')); $this->log("/!\ Pas autorisé à ajouter des libs !"); + return false; } - - $this->log("Recuperer la librairie : " . $info['n'] ); + + $this->log("Recuperer la librairie : " . $info['n']); // on recupere la mise a jour... include_spip('action/teleporter'); @@ -1095,9 +1144,10 @@ class Actionneur { if ($ok === true) { return true; } - + $this->err($ok); $this->log("Téléporteur en erreur : " . $ok); + return false; } @@ -1116,9 +1166,10 @@ class Actionneur { } $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i'])); - + if ($dirs = $this->get_paquet_id($info['i'])) { $this->ajouter_plugin_interessants_meta($dirs['dossier']); + return true; } @@ -1140,7 +1191,7 @@ class Actionneur { /** - * Activer un plugin + * Activer un plugin * * @param string $dossier * Chemin du répertoire du plugin @@ -1149,32 +1200,39 @@ class Actionneur { * @param string $constante * Constante indiquant le chemin de base du plugin (_DIR_PLUGINS, _DIR_PLUGINS_SUPPL, _DIR_PLUGINS_DIST) * @return void - **/ + **/ function activer_plugin_dossier($dossier, $i, $constante = '_DIR_PLUGINS') { include_spip('inc/plugin'); $this->log("Demande d'activation de : " . $dossier); - + //il faut absolument que tous les fichiers de cache // soient inclus avant modification, sinon un appel ulterieur risquerait // de charger des fichiers deja charges par un autre ! // C'est surtout le ficher de fonction le probleme (options et pipelines // sont normalement deja charges). - if (@is_readable(_CACHE_PLUGINS_OPT)) {include_once(_CACHE_PLUGINS_OPT);} - if (@is_readable(_CACHE_PLUGINS_FCT)) {include_once(_CACHE_PLUGINS_FCT);} - if (@is_readable(_CACHE_PIPELINES)) {include_once(_CACHE_PIPELINES);} + if (@is_readable(_CACHE_PLUGINS_OPT)) { + include_once(_CACHE_PLUGINS_OPT); + } + if (@is_readable(_CACHE_PLUGINS_FCT)) { + include_once(_CACHE_PLUGINS_FCT); + } + if (@is_readable(_CACHE_PIPELINES)) { + include_once(_CACHE_PIPELINES); + } include_spip('inc/plugin'); ecrire_plugin_actifs(array($dossier), false, 'ajoute'); $installe = $i['version_base'] ? 'oui' : 'non'; if ($installe == 'oui') { - if(!$i['constante']) + if (!$i['constante']) { $i['constante'] = '_DIR_PLUGINS'; + } // installer le plugin au prochain tour $new_action = array_merge($this->work, array( - 'todo'=>'install', - 'dossier'=>rtrim($dossier,'/'), - 'constante'=>$i['constante'], - 'v'=>$i['version'], // pas forcement la meme version qu'avant lors d'une mise a jour. + 'todo' => 'install', + 'dossier' => rtrim($dossier, '/'), + 'constante' => $i['constante'], + 'v' => $i['version'], // pas forcement la meme version qu'avant lors d'une mise a jour. )); array_unshift($this->end, $new_action); $this->log("Demande d'installation de $dossier"); @@ -1192,7 +1250,7 @@ class Actionneur { * Décrémente chaque score de plugin présent dans la méta * 'plugins_interessants' et signifiant que ces plugins * ont été utilisés récemment. - * + * * Les plugins atteignant un score de zéro sont évacués ce la liste. */ function actualiser_plugin_interessants() { @@ -1205,33 +1263,33 @@ class Actionneur { if (!is_array($plugins_interessants)) { $plugins_interessants = array(); } - + $dossiers = array(); $dossiers_old = array(); - foreach($plugins_interessants as $p => $score) { + foreach ($plugins_interessants as $p => $score) { if (--$score > 0) { $plugins_interessants[$p] = $score; - $dossiers[$p.'/'] = true; + $dossiers[$p . '/'] = true; } else { unset($plugins_interessants[$p]); - $dossiers_old[$p.'/'] = true; + $dossiers_old[$p . '/'] = true; } } // enlever les anciens if ($dossiers_old) { // ATTENTION, il faudra prendre en compte les _DIR_xx - sql_updateq('spip_paquets', array('recent'=>0), sql_in('src_archive', array_keys($dossiers_old))); + sql_updateq('spip_paquets', array('recent' => 0), sql_in('src_archive', array_keys($dossiers_old))); } - $plugs = sql_allfetsel('src_archive','spip_paquets', 'actif='.sql_quote('oui')); + $plugs = sql_allfetsel('src_archive', 'spip_paquets', 'actif=' . sql_quote('oui')); $plugs = array_map('array_shift', $plugs); foreach ($plugs as $dossier) { $dossiers[$dossier] = true; - $plugins_interessants[ rtrim($dossier, '/') ] = 30; // score initial + $plugins_interessants[rtrim($dossier, '/')] = 30; // score initial } - $plugs = sql_updateq('spip_paquets', array('recent'=>1), sql_in('src_archive', array_keys($dossiers))); + $plugs = sql_updateq('spip_paquets', array('recent' => 1), sql_in('src_archive', array_keys($dossiers))); ecrire_meta('plugins_interessants', serialize($plugins_interessants)); } @@ -1262,7 +1320,7 @@ class Actionneur { * @return bool * false si erreur, true sinon */ - function installer_plugin($info){ + function installer_plugin($info) { // il faut info['dossier'] et info['constante'] pour installer if ($plug = $info['dossier']) { $installer_plugins = charger_fonction('installer', 'plugins'); @@ -1272,15 +1330,15 @@ class Actionneur { if (!is_array($infos) OR $infos['install_test'][0]) { $meta_plug_installes = @unserialize($GLOBALS['meta']['plugin_installes']); if (!$meta_plug_installes) { - $meta_plug_installes=array(); + $meta_plug_installes = array(); } $meta_plug_installes[] = $plug; - ecrire_meta('plugin_installes',serialize($meta_plug_installes),'non'); + ecrire_meta('plugin_installes', serialize($meta_plug_installes), 'non'); } if (!is_array($infos)) { // l'installation avait deja ete faite un autre jour - return true; + return true; } else { // l'installation est neuve list($ok, $trace) = $infos['install_test']; @@ -1289,17 +1347,18 @@ class Actionneur { } // l'installation est en erreur $this->err(_T('svp:message_action_finale_install_fail', - array('plugin' => $info['n'], 'version'=>denormaliser_version($info['v']))) . "
    " . $trace); + array('plugin' => $info['n'], 'version' => denormaliser_version($info['v']))) . "
    " . $trace); } } } + return false; } /** * Télécharge un paquet - * + * * Supprime les fichiers obsolètes (si présents) * * @param int|array $id_or_row @@ -1315,18 +1374,19 @@ class Actionneur { function get_paquet_id($id_or_row, $dest_ancien = "") { // on peut passer direct le row sql... if (!is_array($id_or_row)) { - $i = sql_fetsel('*','spip_paquets','id_paquet='.sql_quote($id_or_row)); + $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($id_or_row)); } else { $i = $id_or_row; } unset($id_or_row); if ($i['nom_archive'] and $i['id_depot']) { - $this->log("Recuperer l'archive : " . $i['nom_archive'] ); + $this->log("Recuperer l'archive : " . $i['nom_archive']); // on récupère les informations intéressantes du dépot : // - url des archives // - éventuellement : type de serveur (svn, git) et url de la racine serveur (svn://..../) - $adresses = sql_fetsel(array('url_archives', 'type', 'url_serveur'), 'spip_depots', 'id_depot='.sql_quote($i['id_depot'])); + $adresses = sql_fetsel(array('url_archives', 'type', 'url_serveur'), 'spip_depots', + 'id_depot=' . sql_quote($i['id_depot'])); if ($adresses and $adresse = $adresses['url_archives']) { // destination : auto/prefixe/version (sinon auto/nom_archive/version) @@ -1335,7 +1395,7 @@ class Actionneur { array('pa.id_plugin = pl.id_plugin', 'pa.id_paquet=' . sql_quote($i['id_paquet']))); // prefixe - $base = ($prefixe ? strtolower($prefixe) : substr($i['nom_archive'], 0, -4) ); // enlever .zip ... + $base = ($prefixe ? strtolower($prefixe) : substr($i['nom_archive'], 0, -4)); // enlever .zip ... // prefixe/version $dest_future = $base . '/v' . denormaliser_version($i['version']); @@ -1348,10 +1408,10 @@ class Actionneur { // l'url est différente en fonction du téléporteur $teleporteur = $this->choisir_teleporteur($adresses['type']); if ($teleporteur == 'http') { - $url = $adresse . '/' . $i['nom_archive']; + $url = $adresse . '/' . $i['nom_archive']; $dest = $dest_future; } else { - $url = $adresses['url_serveur'] . '/' . $i['src_archive']; + $url = $adresses['url_serveur'] . '/' . $i['src_archive']; $dest = $dest_ancien ? $dest_ancien : $dest_future; } @@ -1364,17 +1424,19 @@ class Actionneur { if ($dest != $dest_future) { rename(_DIR_PLUGINS_AUTO . $dest, _DIR_PLUGINS_AUTO . $dest_future); } + return array( - 'dir'=> _DIR_PLUGINS_AUTO . $dest, + 'dir' => _DIR_PLUGINS_AUTO . $dest, 'dossier' => 'auto/' . $dest, // c'est depuis _DIR_PLUGINS ... pas bien en dur... ); } $this->err($ok); $this->log("Téléporteur en erreur : " . $ok); } else { - $this->log("Aucune adresse pour le dépot " . $i['id_depot'] ); + $this->log("Aucune adresse pour le dépot " . $i['id_depot']); } } + return false; } @@ -1385,19 +1447,22 @@ class Actionneur { * * @return bool * True si on peut écrire dedans, false sinon - **/ + **/ function tester_repertoire_plugins_auto() { include_spip('inc/plugin'); // pour _DIR_PLUGINS_AUTO if (!defined('_DIR_PLUGINS_AUTO') or !_DIR_PLUGINS_AUTO) { $this->err(_T('svp:erreur_dir_plugins_auto_indefini')); $this->log("/!\ Pas de _DIR_PLUGINS_AUTO defini !"); + return false; } if (!is_writable(_DIR_PLUGINS_AUTO)) { - $this->err(_T('svp:erreur_dir_plugins_auto_ecriture', array('dir'=>_DIR_PLUGINS_AUTO))); + $this->err(_T('svp:erreur_dir_plugins_auto_ecriture', array('dir' => _DIR_PLUGINS_AUTO))); $this->log("/!\ Ne peut pas écrire dans _DIR_PLUGINS_AUTO !"); + return false; } + return true; } @@ -1427,7 +1492,8 @@ class Actionneur { $base_files = array_diff($base_files, array('.', '..')); foreach ($base_files as $f) { if (($f[0] != '.' and $f[0] != 'v') // commence pas par v - OR ($f[0] != '.' and !is_dir($dir_dans_auto . '/' . $f))) { // commence par v mais pas repertoire + OR ($f[0] != '.' and !is_dir($dir_dans_auto . '/' . $f)) + ) { // commence par v mais pas repertoire return true; } } @@ -1444,9 +1510,9 @@ class Actionneur { * * @param string $teleporteur Téléporteur VCS à tester * @param string $defaut Téléporteur par défaut - * + * * @return string Nom du téléporteur à utiliser - **/ + **/ function choisir_teleporteur($teleporteur, $defaut = 'http') { // Utiliser un teleporteur vcs si possible si demandé if (defined('SVP_PREFERER_TELECHARGEMENT_PAR_VCS') and SVP_PREFERER_TELECHARGEMENT_PAR_VCS) { @@ -1460,33 +1526,36 @@ class Actionneur { } } } + return $defaut; } /** * Teste si le plugin SVP (celui-ci donc) a - * été désinstallé / désactivé dans les actions réalisées + * été désinstallé / désactivé dans les actions réalisées * * @note * On ne peut tester sa désactivation que dans le hit où la désinstallation * est réalisée, puisque après, s'il a été désactivé, au prochain hit * on ne connaîtra plus ce fichier ! - * + * * @return bool * true si SVP a été désactivé, false sinon - **/ + **/ function tester_si_svp_desactive() { foreach ($this->done as $d) { if ($d['p'] == 'SVP' - AND $d['done'] == true - AND in_array($d['todo'], array('off', 'stop'))) { + AND $d['done'] == true + AND in_array($d['todo'], array('off', 'stop')) + ) { return true; } } + return false; } - + } @@ -1500,16 +1569,17 @@ class Actionneur { * @param string $redirect * URL de retour * @return void -**/ + **/ function svp_actionner_traiter_actions_demandees($actions, &$retour, $redirect = null) { - $actionneur = new Actionneur(); - $actionneur->ajouter_actions($actions); - $actionneur->verrouiller(); - $actionneur->sauver_actions(); - - $redirect = $redirect ? $redirect : generer_url_ecrire('admin_plugin'); - $retour['redirect'] = generer_url_action('actionner', 'redirect='.urlencode($redirect)); - set_request('_todo', ''); - $retour['message_ok'] = _T("svp:action_patienter"); + $actionneur = new Actionneur(); + $actionneur->ajouter_actions($actions); + $actionneur->verrouiller(); + $actionneur->sauver_actions(); + + $redirect = $redirect ? $redirect : generer_url_ecrire('admin_plugin'); + $retour['redirect'] = generer_url_action('actionner', 'redirect=' . urlencode($redirect)); + set_request('_todo', ''); + $retour['message_ok'] = _T("svp:action_patienter"); } + ?> diff --git a/inc/svp_decider.php b/inc/svp_decider.php index 703106e..c54b58a 100644 --- a/inc/svp_decider.php +++ b/inc/svp_decider.php @@ -9,8 +9,10 @@ * @license GPL * @package SPIP\SVP\Decideur */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} include_spip('plugins/installer'); // pour spip_version_compare() include_spip('inc/svp_rechercher'); // svp_verifier_compatibilite_spip() @@ -21,11 +23,12 @@ include_spip('inc/svp_rechercher'); // svp_verifier_compatibilite_spip() * de ce qui est demandé et des différentes dépendances des plugins. * * @package SPIP\SVP\Actionner -**/ + **/ class Decideur { /** * Plugins actifs en cours avant toute modification + * * @var array * Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description * Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description @@ -37,6 +40,7 @@ class Decideur { /** * Plugins actifs à la fin des modifications effectuées + * * @var array * Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description * Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description @@ -48,6 +52,7 @@ class Decideur { /** * Plugins procure par SPIP + * * @var array * Tableau ('PREFIXE' => numéro de version) */ @@ -56,6 +61,7 @@ class Decideur { /** * Toutes les actions à faire demandées * (ce que l'on demande à l'origine) + * * @var array * Tableau ('identifiant' => tableau de description) */ @@ -63,7 +69,7 @@ class Decideur { /** * Toutes les actions à faire demandées et consécutives aux dépendances - * + * * @var array * Tableau ('identifiant' => tableau de description) */ @@ -73,7 +79,7 @@ class Decideur { * Toutes les actions à faire consécutives aux dépendances * * C'est à dire les actions à faire en plus de celles demandées. - * + * * @var array * Tableau ('identifiant' => tableau de description) */ @@ -81,7 +87,7 @@ class Decideur { /** * Tous les plugins à arrêter (désactiver ou désinstaller) - * + * * @var array * Tableau ('PREFIXE' => tableau de description) */ @@ -89,7 +95,7 @@ class Decideur { /** * Tous les plugins invalidés (suite a des dependances introuvables, mauvaise version de SPIP...) - * + * * @var array * Tableau ('PREFIXE' => tableau de description) */ @@ -97,7 +103,7 @@ class Decideur { /** * Liste des erreurs - * + * * @var array * Tableau ('identifiant' => liste des erreurs) */ @@ -105,30 +111,34 @@ class Decideur { /** * État de santé (absence d'erreur) - * + * * Le résultat true permettra d'effectuer toutes les actions. * Passe à false dès qu'une erreur est présente ! - * - * @var bool */ + * + * @var bool + */ var $ok = true; /** * Loguer les différents éléments - * + * * Sa valeur sera initialisée par la configuration 'mode_log_verbeux' de SVP - * - * @var bool */ + * + * @var bool + */ var $log = false; /** * Générer une erreur si on demande une mise à jour d'un plugin * alors qu'on ne la connait pas. - * @var bool */ + * + * @var bool + */ var $erreur_sur_maj_introuvable = true; /** * Constructeur - * + * * Initialise la propriété $log en fonction de la configuration */ function __construct() { @@ -145,7 +155,7 @@ class Decideur { * Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description */ function liste_plugins_actifs() { - return $this->infos_courtes(array('pa.actif='.sql_quote('oui'), 'pa.attente=' . sql_quote('non'))); + return $this->infos_courtes(array('pa.actif=' . sql_quote('oui'), 'pa.attente=' . sql_quote('non'))); } /** @@ -170,6 +180,7 @@ class Decideur { if (is_null($attente)) { $attente = $this->infos_courtes('pa.attente=' . sql_quote('oui')); } + return isset($attente['i'][$id]) ? $attente['i'][$id] : false; } @@ -183,10 +194,10 @@ class Decideur { */ function liste_plugins_procure() { $procure = array(); - $get_infos = charger_fonction('get_infos','plugins'); - $infos['_DIR_RESTREINT'][''] = $get_infos('./',false,_DIR_RESTREINT); + $get_infos = charger_fonction('get_infos', 'plugins'); + $infos['_DIR_RESTREINT'][''] = $get_infos('./', false, _DIR_RESTREINT); - foreach($infos['_DIR_RESTREINT']['']['procure'] as $_procure) { + foreach ($infos['_DIR_RESTREINT']['']['procure'] as $_procure) { $prefixe = strtoupper($_procure['nom']); $procure[$prefixe] = $_procure['version']; } @@ -198,18 +209,18 @@ class Decideur { * Écrit un log * * Écrit un log si la propriété $log l'autorise. - * + * * @param mixed $quoi * La chose à logguer (souvent un texte) - **/ + **/ function log($quoi) { if ($this->log) { - spip_log($quoi,'decideur'); + spip_log($quoi, 'decideur'); } } /** - * Retourne le tableau de description d'un paquet (via son identifiant) + * Retourne le tableau de description d'un paquet (via son identifiant) * * @note * Attention, retourne un tableau complexe. @@ -219,13 +230,14 @@ class Decideur { * @return array * Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description * Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description - **/ + **/ function infos_courtes_id($id) { // on cache ceux la static $plug = array(); if (!isset($plug[$id])) { $plug[$id] = $this->infos_courtes('pa.id_paquet=' . sql_quote($id)); } + return $plug[$id]; } @@ -245,8 +257,8 @@ class Decideur { * - dl = dépendances librairie * - procure = prefixes procurés * - maj = mise à jour - * - * + * + * * On passe un where ($condition) et on crée deux tableaux, l'un des paquets * triés par identifiant, l'autre par prefixe. * @@ -262,17 +274,18 @@ class Decideur { */ function infos_courtes($condition, $multiple = false) { $plugs = array( - 'i'=>array(), - 'p'=>array() + 'i' => array(), + 'p' => array() ); $from = array('spip_paquets AS pa', 'spip_plugins AS pl'); $orderby = $multiple ? 'pa.etatnum DESC' : ''; $where = array('pa.id_plugin = pl.id_plugin'); - if (is_array($condition)) + if (is_array($condition)) { $where = array_merge($where, $condition); - else + } else { $where[] = $condition; + } include_spip('inc/filtres'); // extraire_multi() $res = sql_allfetsel(array( @@ -286,21 +299,24 @@ class Decideur { 'pa.procure', 'pa.id_depot', 'pa.maj_version AS maj', - 'pa.actif AS a'), $from, $where, '', $orderby); + 'pa.actif AS a' + ), $from, $where, '', $orderby); foreach ($res as $r) { - $r['p'] = strtoupper( $r['p'] ); // on s'assure du prefixe en majuscule. - + $r['p'] = strtoupper($r['p']); // on s'assure du prefixe en majuscule. + // savoir si un paquet est en local ou non... $r['local'] = ($r['id_depot']) == 0 ? true : false; unset($r['id_depot']); - + $d = unserialize($r['dependances']); // voir pour enregistrer en bdd simplement 'n' et 'u' (pas la peine d'encombrer)... - $deps = array('necessite'=>array(array()), 'utilise'=>array(array()), 'librairie'=>array(array())); - if (!$d) $d = $deps; - + $deps = array('necessite' => array(array()), 'utilise' => array(array()), 'librairie' => array(array())); + if (!$d) { + $d = $deps; + } + unset($r['dependances']); - if (!$r['procure'] OR !$proc = unserialize($r['procure'])){ + if (!$r['procure'] OR !$proc = unserialize($r['procure'])) { $proc = array(); } $r['procure'] = $proc; @@ -312,16 +328,16 @@ class Decideur { $plugs['i'][$r['i']] = $r; - + // pour chaque type de dependences... (necessite, utilise, librairie) // on cree un tableau unique [$dependence] = array() // au lieu de plusieurs tableaux par version de spip // en ne mettant dans 0 que ce qui concerne notre spip local - foreach($deps as $cle => $defaut) { + foreach ($deps as $cle => $defaut) { if (!isset($d[$cle])) { $d[$cle] = $defaut; } - + // gerer les dependences autres que dans 0 (communs ou local) !!!! // il peut exister des cles info[dn]["[version_spip_min;version_spip_max]"] de dependences if (!isset($d[$cle][0]) OR count($d[$cle]) > 1) { @@ -337,7 +353,7 @@ class Decideur { } } // passer les prefixes en majuscule - foreach($d['necessite'][0] as $i=>$n) { + foreach ($d['necessite'][0] as $i => $n) { $d['necessite'][0][$i]['nom'] = strtoupper($n['nom']); } $plugs['i'][$r['i']]['dn'] = $d['necessite'][0]; @@ -352,6 +368,7 @@ class Decideur { } } + return $plugs; } @@ -360,7 +377,7 @@ class Decideur { * Ajoute une erreur sur un paquet * * Passe le flag OK à false : on ne pourra pas faire les actions demandées. - * + * * @param int $id * Identifiant de paquet * @param string $texte @@ -400,23 +417,28 @@ class Decideur { * tableau de description du paquet le plus récent sinon */ function chercher_plugin_recent($prefixe, $version) { - $news = $this->infos_courtes(array('pl.prefixe=' . sql_quote($prefixe), 'pa.obsolete=' . sql_quote('non'), 'pa.id_depot > '.sql_quote(0)), true); + $news = $this->infos_courtes(array( + 'pl.prefixe=' . sql_quote($prefixe), + 'pa.obsolete=' . sql_quote('non'), + 'pa.id_depot > ' . sql_quote(0) + ), true); $res = false; if ($news and count($news['p'][$prefixe]) > 0) { foreach ($news['p'][$prefixe] as $new) { - if (spip_version_compare($new['v'],$version,'>')) { - if (!$res or version_compare($new['v'],$res['v'],'>')) { + if (spip_version_compare($new['v'], $version, '>')) { + if (!$res or version_compare($new['v'], $res['v'], '>')) { $res = $new; } } } } + return $res; } /** * Vérifie qu'un plugin existe pour un préfixe et une version donnée - * + * * @param string $prefixe * Préfixe du plugin * @param string $version @@ -433,12 +455,14 @@ class Decideur { $locaux = $this->infos_courtes(array( 'pl.prefixe=' . sql_quote($prefixe), 'pa.obsolete=' . sql_quote('non'), - 'pa.id_depot='.sql_quote(0)), true); + 'pa.id_depot=' . sql_quote(0) + ), true); if ($locaux and isset($locaux['p'][$prefixe]) and count($locaux['p'][$prefixe]) > 0) { foreach ($locaux['p'][$prefixe] as $new) { if (plugin_version_compatible($version, $new['v']) - and svp_verifier_compatibilite_spip($new['compatibilite_spip']) - and ($new['v'] > $v)){ + and svp_verifier_compatibilite_spip($new['compatibilite_spip']) + and ($new['v'] > $v) + ) { $plugin = $new; $v = $new['v']; } @@ -448,15 +472,16 @@ class Decideur { // qu'on ait trouve ou non, on verifie si un plugin local ne procure pas le prefixe // dans une version plus recente $locaux_procure = $this->infos_courtes(array( - 'pa.procure LIKE ' . sql_quote('%'.$prefixe.'%'), + 'pa.procure LIKE ' . sql_quote('%' . $prefixe . '%'), 'pa.obsolete=' . sql_quote('non'), - 'pa.id_depot='.sql_quote(0)), true); + 'pa.id_depot=' . sql_quote(0) + ), true); foreach ($locaux_procure['i'] as $new) { if (isset($new['procure'][$prefixe]) AND plugin_version_compatible($version, $new['procure'][$prefixe]) AND svp_verifier_compatibilite_spip($new['compatibilite_spip']) - AND spip_version_compare($new['procure'][$prefixe], $v, ">")) - { + AND spip_version_compare($new['procure'][$prefixe], $v, ">") + ) { $plugin = $new; $v = $new['v']; } @@ -467,12 +492,14 @@ class Decideur { $distants = $this->infos_courtes(array( 'pl.prefixe=' . sql_quote($prefixe), 'pa.obsolete=' . sql_quote('non'), - 'pa.id_depot>'.sql_quote(0)), true); + 'pa.id_depot>' . sql_quote(0) + ), true); if ($distants and isset($distants['p'][$prefixe]) and count($distants['p'][$prefixe]) > 0) { foreach ($distants['p'][$prefixe] as $new) { if (plugin_version_compatible($version, $new['v']) - and svp_verifier_compatibilite_spip($new['compatibilite_spip']) - and ($new['v'] > $v)){ + and svp_verifier_compatibilite_spip($new['compatibilite_spip']) + and ($new['v'] > $v) + ) { $plugin = $new; $v = $new['v']; } @@ -489,7 +516,7 @@ class Decideur { * * @param array $info * Description du paquet - **/ + **/ function add($info) { $this->end['i'][$info['i']] = $info; $this->end['p'][$info['p']] = &$this->end['i'][$info['i']]; @@ -502,7 +529,7 @@ class Decideur { * Description du paquet * @param bool $recur * Passer à off les plugins qui en dépendent, de façon récursive ? - **/ + **/ function off($info, $recur = false) { $this->log('- stopper ' . $info['p']); $this->remove($info); @@ -531,7 +558,7 @@ class Decideur { * Prefixe du paquet * @return bool * Le paquet sera t'il off ? - **/ + **/ function sera_off($prefixe) { return isset($this->off[$prefixe]) ? $this->off[$prefixe] : false; } @@ -543,13 +570,14 @@ class Decideur { * Identifiant du paquet * @return bool * Le paquet sera t'il off ? - **/ + **/ function sera_off_id($id) { foreach ($this->off as $info) { if ($info['i'] == $id) { return $info; } } + return false; } @@ -561,7 +589,7 @@ class Decideur { * Préfixe du paquet * @return bool * Le paquet sera t'il actif ? - **/ + **/ function sera_actif($prefixe) { if (isset($this->end['p'][$prefixe])) { return $this->end['p'][$prefixe]; @@ -569,14 +597,15 @@ class Decideur { // sinon regarder les procure $v = "0.0.0"; $plugin = false; - foreach($this->end['p'] as $prefixe => $end){ + foreach ($this->end['p'] as $prefixe => $end) { if (isset($end['procure'][$prefixe]) - AND spip_version_compare($end['procure'][$prefixe], $v, ">")) - { + AND spip_version_compare($end['procure'][$prefixe], $v, ">") + ) { $v = $end['procure'][$prefixe]; $plugin = $this->end['p'][$prefixe]; } } + return $plugin; } @@ -587,7 +616,7 @@ class Decideur { * Identifiant du paquet * @return bool * Le paquet sera t'il actif ? - **/ + **/ function sera_actif_id($id) { return isset($this->end['i'][$id]) ? $this->end['i'][$id] : false; } @@ -596,7 +625,7 @@ class Decideur { * Ajouter une action/paquet à la liste des demandées * * L'ajoute aussi à la liste de toutes les actions ! - * + * * @param array $info * Description du paquet concerné * @param string $quoi @@ -613,7 +642,7 @@ class Decideur { * par rapport à la demande initiale * * L'ajoute aussi à la liste de toutes les actions ! - * + * * @param array $info * Description du paquet concerné * @param string $quoi @@ -628,7 +657,7 @@ class Decideur { /** * Annule une action (automatique) qui finalement était réellement demandée. - * + * * Par exemple, une mise à 'off' de paquet entraîne d'autres mises à * 'off' des paquets qui en dépendent. Si une action sur un des paquets * dépendants était aussi demandée, il faut annuler l'action automatique. @@ -699,7 +728,7 @@ class Decideur { * Prefixe du paquet * @return bool * Le paquet est t'il invalide ? - **/ + **/ function sera_invalide($p) { return isset($this->invalides[$p]) ? $this->invalides[$p] : false; } @@ -711,13 +740,14 @@ class Decideur { * Nom de la librairie * @return bool * La librairie est-elle présente ? - **/ + **/ function est_presente_lib($lib) { static $libs = false; if ($libs === false) { include_spip('inc/svp_outiller'); $libs = svp_lister_librairies(); } + return isset($libs[$lib]) ? $libs[$lib] : false; } @@ -760,7 +790,7 @@ class Decideur { if (!$this->sera_actif_id($id)) { $i = $this->infos_courtes_id($id); if ($i = $i['i'][$id]) { - $this->log("--> $t : " . $i['p'] . ' en version : ' . $i['v'] ); + $this->log("--> $t : " . $i['p'] . ' en version : ' . $i['v']); // se mefier : on peut tenter d'activer // un plugin de meme prefixe qu'un autre deja actif @@ -769,25 +799,25 @@ class Decideur { // dans ce cas, on desactive l'ancien (sans desactiver les dependences) // et on active le nouveau. // Si une dependance ne suit pas, une erreur se produira du coup. - if (isset($this->end['p'][ $i['p'] ])) { - $old = $this->end['p'][ $i['p'] ]; - $this->log("-->> off : " . $old['p'] . ' en version : ' . $old['v'] ); + if (isset($this->end['p'][$i['p']])) { + $old = $this->end['p'][$i['p']]; + $this->log("-->> off : " . $old['p'] . ' en version : ' . $old['v']); $this->ask($old, 'off'); $this->todo($old, 'off'); // désactive l'ancien plugin, mais pas les dépendances qui en dépendent // car normalement, ça devrait suivre... - $this->off($old, false); + $this->off($old, false); } - + // pas de prefixe equivalent actif... $this->add($i); - $this->ask($i, $i['local'] ? 'on' : 'geton' ); - + $this->ask($i, $i['local'] ? 'on' : 'geton'); + } else { // la c'est vraiment pas normal... Erreur plugin inexistant... // concurrence entre administrateurs ? - $this->erreur($id, _T('svp:message_nok_plugin_inexistant',array('plugin' => $id))); + $this->erreur($id, _T('svp:message_nok_plugin_inexistant', array('plugin' => $id))); } } break; @@ -797,11 +827,11 @@ class Decideur { // ajouter ce plugin dans la liste et retirer l'ancien $i = $this->infos_courtes_id($id); if ($i = $i['i'][$id]) { - $this->log("--> $t : " . $i['p'] . ' en version : ' . $i['v'] ); + $this->log("--> $t : " . $i['p'] . ' en version : ' . $i['v']); // new : plugin a installer if ($new = $this->chercher_plugin_recent($i['p'], $i['v'])) { - $this->log("--> maj : " . $new['p'] . ' en version : ' . $new['v'] ); + $this->log("--> maj : " . $new['p'] . ' en version : ' . $new['v']); // ajouter seulement si on l'active ! // ou si le plugin est actuellement actif if ($t == 'upon' or $this->sera_actif_id($id)) { @@ -812,13 +842,13 @@ class Decideur { } else { if ($this->erreur_sur_maj_introuvable) { // on n'a pas trouve la nouveaute !!! - $this->erreur($id, _T('svp:message_nok_maj_introuvable',array('plugin' => $i['n'],'id'=>$id))); + $this->erreur($id, _T('svp:message_nok_maj_introuvable', array('plugin' => $i['n'], 'id' => $id))); } } } else { // mauvais identifiant ? // on n'a pas trouve le plugin !!! - $this->erreur($id, _T('svp:message_erreur_maj_inconnu',array('id'=>$id))); + $this->erreur($id, _T('svp:message_erreur_maj_inconnu', array('id' => $id))); } break; case 'off': @@ -826,17 +856,18 @@ class Decideur { // retirer ce plugin // (il l'est peut etre deja) if ($info = $this->sera_actif_id($id) - or $info_off = $this->sera_off_id($id) - // un plugin en attente (desactive parce que sa dependance a disparu certainement par ftp) - // peut etre desactive - or $info = $this->est_attente_id($id)) { + or $info_off = $this->sera_off_id($id) + // un plugin en attente (desactive parce que sa dependance a disparu certainement par ftp) + // peut etre desactive + or $info = $this->est_attente_id($id) + ) { // annuler le signalement en "proposition" (due a une mise a 'off' recursive) // de cet arret de plugin, vu qu'on le demande reellement if (!$info) { $info = $info_off; $this->annule_change($info); } - $this->log("--> $t : " . $info['p'] . ' en version : ' . denormaliser_version($info['v']) ); + $this->log("--> $t : " . $info['p'] . ' en version : ' . denormaliser_version($info['v'])); $this->ask($info, $t); $this->todo($info, $t); // désactive tous les plugins qui en dépendent aussi. @@ -852,16 +883,17 @@ class Decideur { case 'get': case 'kill': if ($info = $this->infos_courtes_id($id)) { - $this->log("--> $t : " . $info['i'][$id]['p'] . ' en version : ' . $info['i'][$id]['v'] ); + $this->log("--> $t : " . $info['i'][$id]['p'] . ' en version : ' . $info['i'][$id]['v']); $this->ask($info['i'][$id], $t); } else { // pas normal... plugin inconnu... concurrence entre administrateurs ? - $this->erreur($id, _T('svp:message_erreur_plugin_introuvable',array('plugin'=>$id,'action'=>$t))); + $this->erreur($id, _T('svp:message_erreur_plugin_introuvable', array('plugin' => $id, 'action' => $t))); } break; } } } + return $this->ok; } @@ -907,6 +939,7 @@ class Decideur { if (!$this->actionner($todo)) { $this->log("! Todo en echec !"); $this->log($this->err); + return false; } @@ -931,6 +964,7 @@ class Decideur { $this->log("Fin !"); $this->log("Ok: " . $this->ok); + # $this->log($this->todo); return $this->ok; @@ -945,14 +979,14 @@ class Decideur { * * Lorsqu'une dépendance est activée, on entre en récursion * dans cette fonction avec la description de la dépendance - * + * * @param array $info * Description du paquet * @param int $prof * Profondeur de récursion * @return bool * false si erreur (dépendance non résolue, incompatibilité...), true sinon - **/ + **/ function verifier_dependances_plugin($info, $prof = 0) { $this->log("- [$prof] verifier dependances " . $info['p']); $id = $info['i']; @@ -965,7 +999,8 @@ class Decideur { // mais normalement, on ne devrait vraiment pas pouvoir tomber sur ce cas if (!svp_verifier_compatibilite_spip($info['compatibilite_spip'])) { $this->invalider($info); - $this->erreur($id, _T('svp:message_incompatibilite_spip',array('plugin'=>$info['n']))); + $this->erreur($id, _T('svp:message_incompatibilite_spip', array('plugin' => $info['n']))); + return false; } @@ -976,14 +1011,15 @@ class Decideur { foreach ($info['dl'] as $l) { // $l = array('nom' => 'x', 'lien' => 'url') $lib = $l['nom']; - $this->log("## Necessite la librairie : " . $lib ); + $this->log("## Necessite la librairie : " . $lib); // on verifie sa presence OU le fait qu'on pourra la telecharger if ($lib and !$this->est_presente_lib($lib)) { // peut on ecrire ? if (!is_writable(_DIR_LIB)) { $this->invalider($info); - $this->erreur($id, _T('svp:message_erreur_ecriture_lib', array('plugin'=>$info['n'], 'lib_url'=>$l['lien'], 'lib'=>$lib))); + $this->erreur($id, _T('svp:message_erreur_ecriture_lib', + array('plugin' => $info['n'], 'lib_url' => $l['lien'], 'lib' => $lib))); $err = true; } // ajout, pour info @@ -1016,31 +1052,28 @@ class Decideur { if ($p == 'SPIP') { // c'est pas la que ça se fait ! // ca ne devrait plus apparaitre comme dependence a un plugin. - } - - // le core procure le paquet que l'on demande ! + } // le core procure le paquet que l'on demande ! elseif ((array_key_exists($p, $this->procure)) - and (plugin_version_compatible($v, $this->procure[$p], 'spip'))) { + and (plugin_version_compatible($v, $this->procure[$p], 'spip')) + ) { // rien a faire... $this->log("-- est procure par le core ($p)"); - } - - // pas d'autre alternative qu'un vrai paquet a activer + } // pas d'autre alternative qu'un vrai paquet a activer else { $this->log("-- verifier : $p"); // nous sommes face a une dependance de plugin // on regarde s'il est present et a la bonne version // sinon on le cherche et on l'ajoute if ($ninfo = $this->sera_actif($p) - and !$err = $this->en_erreur($ninfo['i']) - and plugin_version_compatible($v, $ninfo['v'])) { + and !$err = $this->en_erreur($ninfo['i']) + and plugin_version_compatible($v, $ninfo['v']) + ) { // il est deja actif ou a activer, et tout est ok - $this->log('-- dep OK pour '.$info['p'].' : '.$p); - } - // il faut le trouver et demander a l'activer + $this->log('-- dep OK pour ' . $info['p'] . ' : ' . $p); + } // il faut le trouver et demander a l'activer else { - + // absent ou erreur ou pas compatible $etat = $err ? 'erreur' : ($ninfo ? 'conflit' : 'absent'); // conflit signifie qu'il existe le prefixe actif, mais pas a la version demandee @@ -1053,8 +1086,9 @@ class Decideur { // on choisit par defaut le meilleur etat de plugin. // de preference dans les plugins locaux, sinon en distant. if (!$this->sera_off($p) - and $new = $this->chercher_plugin_compatible($p, $v) - and $this->verifier_dependances_plugin($new, ++$prof)) { + and $new = $this->chercher_plugin_compatible($p, $v) + and $this->verifier_dependances_plugin($new, ++$prof) + ) { // si le plugin existe localement et possede maj_version, // c'est que c'est peut etre une mise a jour + activation a faire // si le plugin @@ -1064,9 +1098,9 @@ class Decideur { $i = array(); if (!$new['local']) { $i = $this->infos_courtes(array( - 'pl.prefixe=' . sql_quote($new['p']), - 'pa.maj_version=' . sql_quote($new['v']) - ), true); + 'pl.prefixe=' . sql_quote($new['p']), + 'pa.maj_version=' . sql_quote($new['v']) + ), true); } if ($i and isset($i['p'][$new['p']]) and count($i['p'][$new['p']])) { // c'est une mise a jour @@ -1087,7 +1121,11 @@ class Decideur { $this->log("-- !erreur : $p"); // on ne trouve pas la dependance ! $this->invalider($info); - $this->erreur($id, $v ? _T('svp:message_dependance_plugin_version', array('plugin'=>$info['n'], 'dependance'=>$p, 'version'=>$v)) : _T('svp:message_dependance_plugin',array('plugin'=>$info['n'],'dependance'=>$p))); + $this->erreur($id, $v ? _T('svp:message_dependance_plugin_version', array( + 'plugin' => $info['n'], + 'dependance' => $p, + 'version' => $v + )) : _T('svp:message_dependance_plugin', array('plugin' => $info['n'], 'dependance' => $p))); } unset($new, $vieux); break; @@ -1102,24 +1140,29 @@ class Decideur { case 'conflit': $this->log(" conflit -> demande $v, present : " . $ninfo['v']); if (!$this->sera_off($p) - and $new = $this->chercher_plugin_compatible($p, $v) - and $this->verifier_dependances_plugin($new, ++$prof)) { + and $new = $this->chercher_plugin_compatible($p, $v) + and $this->verifier_dependances_plugin($new, ++$prof) + ) { // on connait le nouveau... $cache[] = $new; $this->remove($ninfo); $this->add($new); - $this->change($ninfo,'up'); + $this->change($ninfo, 'up'); $this->log("-- update : $p"); } else { $this->log("-- !erreur : $p"); // on ne trouve pas la dependance ! $this->invalider($info); - $this->erreur($id, $v ? _T('svp:message_dependance_plugin_version', array('plugin'=>$info['n'], 'dependance'=>$p, 'version'=>$v)) : _T('svp:message_dependance_plugin',array('plugin'=>$info['n'],'dependance'=>$p))); + $this->erreur($id, $v ? _T('svp:message_dependance_plugin_version', array( + 'plugin' => $info['n'], + 'dependance' => $p, + 'version' => $v + )) : _T('svp:message_dependance_plugin', array('plugin' => $info['n'], 'dependance' => $p))); } break; } - } + } } if ($this->sera_invalide($info['p'])) { @@ -1135,42 +1178,45 @@ class Decideur { foreach ($cache as $i) { $this->invalider($i); } + return false; } } + return true; } /** - * Retourne un tableau des différentes actions qui seront faites + * Retourne un tableau des différentes actions qui seront faites * * @param string $quoi * Type de demande * - ask : les actions demandées * - changes : les actions en plus par rapport à ce qui était demandé - * - todo : toutes les actions + * - todo : toutes les actions * @return array * Liste des actions (joliement traduites et expliquées) - **/ + **/ function presenter_actions($quoi) { $res = array(); - foreach ($this->$quoi as $id=>$info) { + foreach ($this->$quoi as $id => $info) { $trads = array( - 'plugin' => $info['n'], + 'plugin' => $info['n'], 'version' => denormaliser_version($info['v']), ); if (isset($info['maj'])) { $trads['version_maj'] = denormaliser_version($info['maj']); } - $res[] = _T('svp:message_action_'.$info['todo'], $trads); + $res[] = _T('svp:message_action_' . $info['todo'], $trads); } + return $res; } } /** - * Gère la partie vérifier des formulaires utilisant le Décideur + * Gère la partie vérifier des formulaires utilisant le Décideur * * @param array $a_actionner * Tableau des actions par paquet (id_paquet => action) @@ -1178,7 +1224,7 @@ class Decideur { * Tableau d'erreurs de verifier (CVT) * @return bool * true si tout va bien, false sinon (erreur pour trouver les dépendances, ...) -**/ + **/ function svp_decider_verifier_actions_demandees($a_actionner, &$erreurs) { $decideur = new Decideur; $decideur->erreur_sur_maj_introuvable = false; @@ -1186,19 +1232,20 @@ function svp_decider_verifier_actions_demandees($a_actionner, &$erreurs) { if (!$decideur->ok) { $erreurs['decideur_erreurs'] = array(); - foreach ($decideur->err as $id=>$errs) { - foreach($errs as $err) { + foreach ($decideur->err as $id => $errs) { + foreach ($errs as $err) { $erreurs['decideur_erreurs'][] = $err; } } + return false; } // On construit la liste des libellés d'actions $actions = array(); $actions['decideur_propositions'] = $decideur->presenter_actions('changes'); - $actions['decideur_demandes'] = $decideur->presenter_actions('ask'); - $actions['decideur_actions'] = $decideur->presenter_actions('todo'); + $actions['decideur_demandes'] = $decideur->presenter_actions('ask'); + $actions['decideur_actions'] = $decideur->presenter_actions('todo'); set_request('_libelles_actions', $actions); // On construit la liste des actions pour la passer au formulaire en hidden @@ -1207,6 +1254,8 @@ function svp_decider_verifier_actions_demandees($a_actionner, &$erreurs) { $todo[$_todo['i']] = $_todo['todo']; } set_request('_todo', serialize($todo)); + return true; } + ?> diff --git a/inc/svp_depoter_distant.php b/inc/svp_depoter_distant.php index 88b285e..bf6d409 100644 --- a/inc/svp_depoter_distant.php +++ b/inc/svp_depoter_distant.php @@ -8,13 +8,15 @@ * régulièrement pour actualiser nos informations. Effectivement, chaque * paquet (et plugin) décrit est inséré en base de données pour nous * faciliter les recherches. - * + * * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Depots */ - -if (!defined("_ECRIRE_INC_VERSION")) return; + +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} include_spip('inc/plugin'); include_spip('inc/svp_phraser'); @@ -24,7 +26,7 @@ include_spip('inc/svp_phraser'); * * Si une erreur survient (syntaxe XML incorrecte, pas de plugin dans le dépot), * son texte est placé dans le paramètre $erreur - * + * * @uses svp_phraser_depot() * @uses svp_actualiser_paquets() * @uses svp_base_supprimer_paquets_locaux() @@ -47,6 +49,7 @@ function svp_ajouter_depot($url, &$erreur = '') { $fichier_xml = copie_locale($url, 'modif'); if (!$fichier_xml) { $erreur = _T('svp:message_nok_xml_non_recupere', array('fichier' => $url)); + return false; } @@ -56,31 +59,35 @@ function svp_ajouter_depot($url, &$erreur = '') { $infos = svp_phraser_depot($fichier_xml); if (!$infos) { $erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url)); + return false; } $titre = filtrer_entites($infos['depot']['titre']); - $champs = array('titre' => $titre, - 'descriptif' => filtrer_entites($infos['depot']['descriptif']), - 'type' => $infos['depot']['type'], - 'url_serveur' => $infos['depot']['url_serveur'], - 'url_brouteur' => $infos['depot']['url_brouteur'], - 'url_archives' => $infos['depot']['url_archives'], - 'url_commits' => $infos['depot']['url_commits'], - 'xml_paquets'=> $url, - 'sha_paquets'=> sha1_file($fichier_xml), - 'nbr_paquets' => 0, - 'nbr_plugins' => 0, - 'nbr_autres' => 0); + $champs = array( + 'titre' => $titre, + 'descriptif' => filtrer_entites($infos['depot']['descriptif']), + 'type' => $infos['depot']['type'], + 'url_serveur' => $infos['depot']['url_serveur'], + 'url_brouteur' => $infos['depot']['url_brouteur'], + 'url_archives' => $infos['depot']['url_archives'], + 'url_commits' => $infos['depot']['url_commits'], + 'xml_paquets' => $url, + 'sha_paquets' => sha1_file($fichier_xml), + 'nbr_paquets' => 0, + 'nbr_plugins' => 0, + 'nbr_autres' => 0 + ); // verifier avant l'insertion que le depot n'existe pas deja // car la recuperation pouvant etre longue on risque le probleme en cas de concurrence - if (sql_countsel('spip_depots','xml_paquets='.sql_quote($url))){ + if (sql_countsel('spip_depots', 'xml_paquets=' . sql_quote($url))) { $erreur = _T('svp:message_nok_depot_deja_ajoute', array('url' => $url)); + return false; - } - elseif (!$id_depot = sql_insertq('spip_depots', $champs)) { + } elseif (!$id_depot = sql_insertq('spip_depots', $champs)) { $erreur = _T('svp:message_nok_sql_insert_depot', array('objet' => "$titre ($url)")); + return false; } @@ -88,24 +95,26 @@ function svp_ajouter_depot($url, &$erreur = '') { $ok = svp_actualiser_paquets($id_depot, $infos['paquets'], $nb_paquets, $nb_plugins, $nb_autres); if (!$ok OR ($nb_paquets == 0)) { // Si une erreur s'est produite, on supprime le depot deja insere - sql_delete('spip_depots','id_depot='.sql_quote($id_depot)); - if (!$ok) + sql_delete('spip_depots', 'id_depot=' . sql_quote($id_depot)); + if (!$ok) { $erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url)); - else + } else { $erreur = _T('svp:message_nok_aucun_paquet_ajoute', array('url' => $url)); + } + return false; } // On met à jour le nombre de paquets et de plugins du depot maintenant ! sql_updateq('spip_depots', - array('nbr_paquets'=> $nb_paquets, 'nbr_plugins'=> $nb_plugins, 'nbr_autres'=> $nb_autres), - 'id_depot=' . sql_quote($id_depot)); + array('nbr_paquets' => $nb_paquets, 'nbr_plugins' => $nb_plugins, 'nbr_autres' => $nb_autres), + 'id_depot=' . sql_quote($id_depot)); // On vide les paquets locaux pour mettre a jour leurs donnees relatives au depot // comme les mises a jour disponibles include_spip('inc/svp_depoter_local'); svp_actualiser_paquets_locaux(true); - + return true; } @@ -114,45 +123,48 @@ function svp_ajouter_depot($url, &$erreur = '') { * * Cette suppression entraîne des recalcul comme les versions maximales * des plugins téléchargeables qui peuvent changer. - * + * * @uses svp_actualiser_url_plugins() * @uses svp_nettoyer_apres_suppression() * @uses svp_base_supprimer_paquets_locaux() - * + * * @param int $id * Identifiant du dépot * @return bool * false si le dépot n'est pas trouvé, true sinon */ -function svp_supprimer_depot($id){ +function svp_supprimer_depot($id) { $id = intval($id); // Pas de depot a cet id ? - if (!$id_depot = sql_getfetsel('id_depot', 'spip_depots', 'id_depot='. sql_quote($id)) ){ + if (!$id_depot = sql_getfetsel('id_depot', 'spip_depots', 'id_depot=' . sql_quote($id))) { return false; } // on calcule les versions max des plugins heberges par le depot - $vmax =array(); + $vmax = array(); - if ($resultats = sql_allfetsel('id_plugin, version', 'spip_paquets', 'id_depot='. sql_quote($id))) { + if ($resultats = sql_allfetsel('id_plugin, version', 'spip_paquets', 'id_depot=' . sql_quote($id))) { foreach ($resultats as $paquet) { $id_plugin = $paquet['id_plugin']; if (!isset($vmax[$id_plugin]) - OR (spip_version_compare($vmax[$id_plugin], $paquet['version'], '<'))) + OR (spip_version_compare($vmax[$id_plugin], $paquet['version'], '<')) + ) { $vmax[$id_plugin] = $paquet['version']; + } } } // On supprime les paquets heberges par le depot - sql_delete('spip_paquets','id_depot='.sql_quote($id_depot)); + sql_delete('spip_paquets', 'id_depot=' . sql_quote($id_depot)); // Si on est pas en mode runtime, on utilise surement l'espace public pour afficher les plugins. // Il faut donc verifier que les urls suivent bien la mise à jour // Donc avant de nettoyer la base des plugins du depot ayant disparus on supprime toutes les urls // associees a ce depot : on les recreera apres le nettoyage - if (!_SVP_MODE_RUNTIME) + if (!_SVP_MODE_RUNTIME) { svp_actualiser_url_plugins($id_depot); + } // Nettoyer les autres relations à ce dépot svp_nettoyer_apres_suppression($id_depot, $vmax); @@ -161,11 +173,12 @@ function svp_supprimer_depot($id){ // Il faut donc s'assurer que les urls suivent bien la mise à jour // - on supprime toutes les urls plugin // - on les regenere pour la liste des plugins mise a jour - if (!_SVP_MODE_RUNTIME) + if (!_SVP_MODE_RUNTIME) { svp_actualiser_url_plugins($id_depot); + } // On supprime le depot lui-meme - sql_delete('spip_depots','id_depot='.sql_quote($id_depot)); + sql_delete('spip_depots', 'id_depot=' . sql_quote($id_depot)); // on supprime les paquets locaux pour reactualisation include_spip('inc/svp_depoter_local'); @@ -176,13 +189,13 @@ function svp_supprimer_depot($id){ /** - * Nettoyer la base de données après la suppression d'un dépot + * Nettoyer la base de données après la suppression d'un dépot * * Supprime * - les liens des plugins avec le dépot (table spip_depots_plugins) * - les plugins dont aucun paquet n'est encore hébergé par un dépot restant (table spip_plugins) * Remet à zéro la version maximale des plugins ayant vu leur paquet en version maximale supprimée - * + * * @param int $id_depot * Identifiant du dépot * @param array $vmax @@ -190,16 +203,16 @@ function svp_supprimer_depot($id){ * Tableau (id_plugin => version maximale) * @return bool * true toujours. -**/ + **/ function svp_nettoyer_apres_suppression($id_depot, $vmax) { // On rapatrie la liste des plugins du depot qui servira apres qu'on ait supprime les liens // de la table spip_depots_plugins - $liens = sql_allfetsel('id_plugin', 'spip_depots_plugins', 'id_depot='.sql_quote($id_depot)); + $liens = sql_allfetsel('id_plugin', 'spip_depots_plugins', 'id_depot=' . sql_quote($id_depot)); $plugins_depot = array_map('reset', $liens); // On peut donc supprimer tous ces liens *plugins-depots* du depot - sql_delete('spip_depots_plugins', 'id_depot='.sql_quote($id_depot)); + sql_delete('spip_depots_plugins', 'id_depot=' . sql_quote($id_depot)); // On verifie pour chaque plugin concerne par la disparition de paquets si c'est la version // la plus elevee qui a ete supprimee. @@ -207,23 +220,24 @@ function svp_nettoyer_apres_suppression($id_depot, $vmax) { // a la prochaine actualisation. // Cette operation est necessaire car on n'impose pas que les informations du plugin soient identiques // pour chaque paquet !!! - + // On insere, en encapsulant pour sqlite... if (sql_preferer_transaction()) { sql_demarrer_transaction(); } - + if ($resultats = sql_allfetsel('id_plugin, vmax', 'spip_plugins', sql_in('id_plugin', $plugins_depot))) { foreach ($resultats as $plugin) { - if (spip_version_compare($plugin['vmax'], $vmax[$plugin['id_plugin']], '=')) - sql_updateq('spip_plugins', array('vmax' => ''), 'id_plugin=' . sql_quote($plugin['id_plugin'])); + if (spip_version_compare($plugin['vmax'], $vmax[$plugin['id_plugin']], '=')) { + sql_updateq('spip_plugins', array('vmax' => ''), 'id_plugin=' . sql_quote($plugin['id_plugin'])); + } } } if (sql_preferer_transaction()) { sql_terminer_transaction(); } - + // Maintenant on calcule la liste des plugins du depot qui ne sont pas heberges // par un autre depot => donc a supprimer // - Liste de tous les plugins encore lies a un autre depot @@ -235,8 +249,8 @@ function svp_nettoyer_apres_suppression($id_depot, $vmax) { $plugins_a_supprimer = array_diff($plugins_depot, $plugins_restants); // On supprimer les plugins identifies - sql_delete('spip_plugins', sql_in('id_plugin', $plugins_a_supprimer)); - + sql_delete('spip_plugins', sql_in('id_plugin', $plugins_a_supprimer)); + return true; } @@ -246,7 +260,7 @@ function svp_nettoyer_apres_suppression($id_depot, $vmax) { * * Actualise les informations uniquement si la signature du fichier * XML de description du dépot a changé - * + * * @uses svp_actualiser_maj_version() * @uses svp_actualiser_paquets() * @uses svp_phraser_depot() @@ -255,16 +269,16 @@ function svp_nettoyer_apres_suppression($id_depot, $vmax) { * @return bool * false si erreur, true sinon */ -function svp_actualiser_depot($id){ +function svp_actualiser_depot($id) { include_spip('inc/distant'); $id = intval($id); - + // pas de depot a cet id ? - if (!$depot = sql_fetsel('*', 'spip_depots', 'id_depot='. sql_quote($id)) ){ + if (!$depot = sql_fetsel('*', 'spip_depots', 'id_depot=' . sql_quote($id))) { return false; } - + $fichier_xml = _DIR_RACINE . copie_locale($depot['xml_paquets'], 'modif'); $sha = sha1_file($fichier_xml); @@ -272,21 +286,22 @@ function svp_actualiser_depot($id){ if ($depot['sha_paquets'] == $sha) { // Le fichier n'a pas change (meme sha1) alors on ne fait qu'actualiser la date // de mise a jour du depot en mettant a jour *inutilement* le sha1 - spip_log('Aucune modification du fichier XML, actualisation non declenchee - id_depot = ' . $depot['id_depot'], 'svp_actions.' . _LOG_INFO); + spip_log('Aucune modification du fichier XML, actualisation non declenchee - id_depot = ' . $depot['id_depot'], + 'svp_actions.' . _LOG_INFO); sql_replace('spip_depots', array_diff_key($depot, array('maj' => ''))); - } - else { + } else { // Le fichier a bien change il faut actualiser tout le depot $infos = svp_phraser_depot($fichier_xml); - if (!$infos) + if (!$infos) { return false; + } // On actualise les paquets dans spip_paquets en premier lieu. // Lors de la mise a jour des paquets, les plugins aussi sont actualises $ok = svp_actualiser_paquets($depot['id_depot'], $infos['paquets'], - $nb_paquets, $nb_plugins, $nb_autres); + $nb_paquets, $nb_plugins, $nb_autres); // apres la mise a jour des paquets d'un depot, on actualise les informations des paquets locaux // principalement l'info "maj_version" indiquant s'il existe un paquet plus recent @@ -299,14 +314,16 @@ function svp_actualiser_depot($id){ // d'un depot et extraites du xml // -- le nombre de paquets et de plugins du depot ainsi que le nouveau sha1 // ce qui aura pour effet d'actualiser la date de mise a jour - $champs = array('url_serveur' => $infos['depot']['url_serveur'], - 'url_brouteur' => $infos['depot']['url_brouteur'], - 'url_archives' => $infos['depot']['url_archives'], - 'url_commits' => $infos['depot']['url_commits'], - 'nbr_paquets' => $nb_paquets, - 'nbr_plugins' => $nb_plugins, - 'nbr_autres' => $nb_autres, - 'sha_paquets' => $sha); + $champs = array( + 'url_serveur' => $infos['depot']['url_serveur'], + 'url_brouteur' => $infos['depot']['url_brouteur'], + 'url_archives' => $infos['depot']['url_archives'], + 'url_commits' => $infos['depot']['url_commits'], + 'nbr_paquets' => $nb_paquets, + 'nbr_plugins' => $nb_plugins, + 'nbr_autres' => $nb_autres, + 'sha_paquets' => $sha + ); sql_updateq('spip_depots', $champs, 'id_depot=' . sql_quote($depot['id_depot'])); } } @@ -320,7 +337,7 @@ function svp_actualiser_depot($id){ * * Enlève de la base les paquets du dépots qui ne sont plus présents * dans la description du XML. Ajoute ou met à jour les autres. - * + * * @uses svp_supprimer_plugins_orphelins() * @uses svp_corriger_vmax_plugins() * @uses svp_completer_plugins() @@ -328,7 +345,7 @@ function svp_actualiser_depot($id){ * @uses svp_inserer_multi() * @uses svp_completer_plugins_depot() * @uses svp_actualiser_url_plugins() - * + * * @param int $id_depot * Identifiant du dépot * @param array $paquets @@ -354,8 +371,9 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, $nb_autres = 0; // Si aucun depot ou aucun paquet on renvoie une erreur - if ((!$id_depot) OR (!is_array($paquets))) + if ((!$id_depot) OR (!is_array($paquets))) { return false; + } // On initialise l'url de base des logos du depot et son type afin de // calculer l'url complete de chaque logo @@ -373,13 +391,15 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, } // tous les paquets du depot qui ne font pas parti des signatures - $anciens_paquets = sql_allfetsel('id_paquet', 'spip_paquets', array('id_depot=' . sql_quote($id_depot), sql_in('signature', $signatures, 'NOT'))); + $anciens_paquets = sql_allfetsel('id_paquet', 'spip_paquets', + array('id_depot=' . sql_quote($id_depot), sql_in('signature', $signatures, 'NOT'))); $anciens_paquets = array_map('array_shift', $anciens_paquets); // pour ces vieux paquets, on les nettoie de la base if ($anciens_paquets) { // tous les plugins correspondants aux anciens paquets - $anciens_plugins = sql_allfetsel('pl.id_plugin', array('spip_plugins AS pl', 'spip_paquets AS pa'), array('pl.id_plugin=pa.id_plugin', sql_in('pa.id_paquet', $anciens_paquets))); + $anciens_plugins = sql_allfetsel('pl.id_plugin', array('spip_plugins AS pl', 'spip_paquets AS pa'), + array('pl.id_plugin=pa.id_plugin', sql_in('pa.id_paquet', $anciens_paquets))); $anciens_plugins = array_map('array_shift', $anciens_plugins); // suppression des anciens paquets @@ -390,17 +410,22 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, // liste des plugins qui ont encore des paquets dans ce depot $plugins_restants = sql_allfetsel('pl.id_plugin', array('spip_plugins AS pl', 'spip_paquets AS pa'), - array(sql_in('pl.id_plugin', $anciens_plugins), 'pl.id_plugin=pa.id_plugin', 'pa.id_depot=' . sql_quote($id_depot))); + array( + sql_in('pl.id_plugin', $anciens_plugins), + 'pl.id_plugin=pa.id_plugin', + 'pa.id_depot=' . sql_quote($id_depot) + )); $plugins_restants = array_map('array_shift', $plugins_restants); // par opposition, on retrouve ceux qui n'en ont plus... $plugins_supprimes = array_diff($anciens_plugins, $plugins_restants); - sql_delete('spip_depots_plugins', array('id_depot='. sql_quote($id_depot), sql_in('id_plugin', $plugins_supprimes))); + sql_delete('spip_depots_plugins', + array('id_depot=' . sql_quote($id_depot), sql_in('id_plugin', $plugins_supprimes))); unset($plugins_restants, $plugins_supprimes); // supprimer les plugins orphelins include_spip('inc/svp_depoter_local'); svp_supprimer_plugins_orphelins($anciens_plugins); - + // corriger les vmax des plugins svp_corriger_vmax_plugins($anciens_plugins); @@ -409,7 +434,7 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, } // on ne garde que les paquets qui ne sont pas presents dans la base - $signatures = sql_allfetsel('signature', 'spip_paquets', 'id_depot='.sql_quote($id_depot)); + $signatures = sql_allfetsel('signature', 'spip_paquets', 'id_depot=' . sql_quote($id_depot)); $signatures = array_map('array_shift', $signatures); foreach ($paquets as $cle => $_infos) { if (in_array($_infos['md5'], $signatures)) { @@ -422,7 +447,7 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, $insert_plugins = array(); $insert_contribs = array(); $prefixes = array(); // prefixe => id_plugin - + // On met a jour ou on cree chaque paquet a partir du contenu du fichier xml // On ne fait pas cas de la compatibilite avec la version de SPIP installee // car l'operation doit permettre de collecter tous les paquets @@ -457,41 +482,43 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, // On construit l'url complete du logo // Le logo est maintenant disponible a la meme adresse que le zip et porte le nom du zip. // Son extension originale est conservee - if ($insert_paquet['logo']) + if ($insert_paquet['logo']) { $insert_paquet['logo'] = $depot['url_archives'] . '/' - . basename($insert_paquet['nom_archive'], '.zip') . '.' - . pathinfo($insert_paquet['logo'], PATHINFO_EXTENSION); + . basename($insert_paquet['nom_archive'], '.zip') . '.' + . pathinfo($insert_paquet['logo'], PATHINFO_EXTENSION); + } // On loge l'absence de categorie ou une categorie erronee et on positionne la categorie // par defaut "aucune" // Provisoire tant que la DTD n'est pas en fonction if (!$insert_plugin['categorie']) { - spip_log("Categorie absente dans le paquet issu de <". $insert_paquet['src_archive'] . - "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); + spip_log("Categorie absente dans le paquet issu de <" . $insert_paquet['src_archive'] . + "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); $insert_plugin['categorie'] = 'aucune'; - } - else { + } else { $svp_categories = $GLOBALS['categories_plugin']; if (!in_array($insert_plugin['categorie'], $svp_categories)) { - spip_log("Categorie k" . $insert_plugin['categorie'] . "l incorrecte dans le paquet issu de <". $insert_paquet['src_archive'] . - "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); + spip_log("Categorie k" . $insert_plugin['categorie'] . "l incorrecte dans le paquet issu de <" . $insert_paquet['src_archive'] . + "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); $insert_plugin['categorie'] = 'aucune'; } } - } - else { + } else { $paquet_plugin = false; } // On teste l'existence du paquet dans la base avec les champs // id_depot, nom_archive et src_archive pour être sur de l'unicité. // - si le paquet n'existe pas, on le crée, // - sinon (et ça ne devrait pas arriver), on ne fait qu'un update - if (!$paquet = sql_fetsel('*', 'spip_paquets', array('id_depot='. sql_quote($insert_paquet['id_depot']), - 'nom_archive='. sql_quote($insert_paquet['nom_archive']), - 'src_archive='. sql_quote($insert_paquet['src_archive'])))) { + if (!$paquet = sql_fetsel('*', 'spip_paquets', array( + 'id_depot=' . sql_quote($insert_paquet['id_depot']), + 'nom_archive=' . sql_quote($insert_paquet['nom_archive']), + 'src_archive=' . sql_quote($insert_paquet['src_archive']) + )) + ) { // Le paquet n'existe pas encore en base de donnees // ------------------------------------------------ - + // On positionne la date de creation a celle du dernier commit ce qui est bien le cas $insert_paquet['date_crea'] = $insert_paquet['date_modif']; @@ -506,79 +533,85 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, // - le prefixe // - la version du paquet et de la base // - l'etat - $where = array('t1.id_plugin=t2.id_plugin', - 't1.version=' . sql_quote($insert_paquet['version']), - 't1.version_base=' . sql_quote($insert_paquet['version_base']), - 't1.etatnum=' . sql_quote($insert_paquet['etatnum']), - 't1.id_depot>' . intval(0), - 't2.prefixe=' . sql_quote($insert_plugin['prefixe'])); + $where = array( + 't1.id_plugin=t2.id_plugin', + 't1.version=' . sql_quote($insert_paquet['version']), + 't1.version_base=' . sql_quote($insert_paquet['version_base']), + 't1.etatnum=' . sql_quote($insert_paquet['etatnum']), + 't1.id_depot>' . intval(0), + 't2.prefixe=' . sql_quote($insert_plugin['prefixe']) + ); if (!$id_paquet = sql_getfetsel('t1.id_paquet', 'spip_paquets AS t1, spip_plugins AS t2', $where)) { // On traite d'abord le plugin du paquet pour recuperer l'id_plugin // On rajoute le plugin dans la table spip_plugins si celui-ci n'y est pas encore ou on recupere // l'id si il existe deja et on le met a jour si la version du paquet est plus elevee - $plugin = sql_fetsel('id_plugin, vmax', 'spip_plugins', array('prefixe=' . sql_quote($insert_plugin['prefixe']))); + $plugin = sql_fetsel('id_plugin, vmax', 'spip_plugins', + array('prefixe=' . sql_quote($insert_plugin['prefixe']))); if (!$plugin AND !array_key_exists($insert_plugin['prefixe'], $insert_plugins)) { - $insert_plugins[ $insert_plugin['prefixe'] ] = array_merge($insert_plugin, array('vmax' => $insert_paquet['version'])); - } - else { + $insert_plugins[$insert_plugin['prefixe']] = array_merge($insert_plugin, + array('vmax' => $insert_paquet['version'])); + } else { if ($plugin) { $id_plugin = $plugin['id_plugin']; $prefixes[$insert_plugin['prefixe']] = $id_plugin; } if (array_key_exists($insert_plugin['prefixe'], $insert_plugins) - AND (spip_version_compare($insert_plugins[ $insert_plugin['prefixe'] ]['vmax'], $insert_paquet['version'], '<='))) { + AND (spip_version_compare($insert_plugins[$insert_plugin['prefixe']]['vmax'], $insert_paquet['version'], + '<=')) + ) { // attribuer au plugin le nom et le slogan du paquet le plus à jour - $insert_plugins[ $insert_plugin['prefixe'] ]['nom'] = $insert_plugin['nom']; - $insert_plugins[ $insert_plugin['prefixe'] ]['slogan'] = $insert_plugin['slogan']; - $insert_plugins[ $insert_plugin['prefixe'] ]['vmax'] = $insert_paquet['version']; + $insert_plugins[$insert_plugin['prefixe']]['nom'] = $insert_plugin['nom']; + $insert_plugins[$insert_plugin['prefixe']]['slogan'] = $insert_plugin['slogan']; + $insert_plugins[$insert_plugin['prefixe']]['vmax'] = $insert_paquet['version']; } } // On traite maintenant le paquet connaissant l'id du plugin // temporaire qui sera supprime lors de la connaissance de l'id_paquet - $insert_paquet['prefixe'] = $insert_plugin['prefixe']; + $insert_paquet['prefixe'] = $insert_plugin['prefixe']; $insert_paquets[] = $insert_paquet; - } - else + } else { $collision = true; - } - else { + } + } else { // On est en presence d'une CONTRIBUTION NON PLUGIN // ------------------------------------------------ $where = array( - 'id_depot=' . sql_quote($insert_paquet['id_depot']), - 'nom_archive=' . sql_quote($insert_paquet['nom_archive'])); + 'id_depot=' . sql_quote($insert_paquet['id_depot']), + 'nom_archive=' . sql_quote($insert_paquet['nom_archive']) + ); if (!$id_paquet = sql_getfetsel('id_paquet', 'spip_paquets', $where)) { // Ce n'est pas un plugin, donc id_plugin=0 et toutes les infos plugin sont nulles $insert_paquet['id_plugin'] = 0; $insert_contribs[] = $insert_paquet; - } else + } else { $collision = true; + } } // On loge le paquet ayant ete refuse dans un fichier a part afin de les verifier // apres coup if ($collision) { - spip_log("Collision avec le paquet <". $insert_paquet['nom_archive'] . - " / " . $insert_paquet['src_archive'] . "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); + spip_log("Collision avec le paquet <" . $insert_paquet['nom_archive'] . + " / " . $insert_paquet['src_archive'] . "> du depot <" . $insert_paquet['id_depot'] . ">\n", + 'svp_paquets.' . _LOG_INFO_IMPORTANTE); } - } - else { + } else { // Le paquet existe deja en base de donnees // ---------------------------------------- // On ne devrait plus arriver ICI... // Code obsolete ? spip_log('!!!!!! Passage dans code obsolete (svp/svp_depoter_distant)', 'depoter'); - + // on effectue les traitements en attente // pour que les updates soient corrects svp_inserer_multi($insert_plugins, $insert_paquets, $insert_contribs, $prefixes); - - + + // On met a jour le paquet en premier lieu qu'il soit un plugin ou une contribution sql_updateq('spip_paquets', $insert_paquet, - 'id_paquet=' . sql_quote($paquet['id_paquet'])); + 'id_paquet=' . sql_quote($paquet['id_paquet'])); } } @@ -590,14 +623,14 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, // On rajoute le plugin comme heberge par le depot si celui-ci n'est pas encore enregistre comme tel $ids = sql_allfetsel('p.id_plugin', array('spip_plugins AS p', 'spip_depots_plugins AS dp'), - array('p.id_plugin=dp.id_plugin', 'dp.id_depot='.sql_quote($id_depot))); + array('p.id_plugin=dp.id_plugin', 'dp.id_depot=' . sql_quote($id_depot))); $ids = array_map('array_shift', $ids); // inserer les liens avec le depots $insert_dp = array(); $news_id = array_diff(array_values($prefixes), $ids); - foreach($news_id as $id) { - $insert_dp[] = array('id_depot'=>$id_depot, 'id_plugin'=>$id); + foreach ($news_id as $id) { + $insert_dp[] = array('id_depot' => $id_depot, 'id_plugin' => $id); } if ($insert_dp) { sql_insertq_multi('spip_depots_plugins', $insert_dp); @@ -614,14 +647,15 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, // Il faut donc s'assurer que les urls suivent bien la mise à jour // - on supprime toutes les urls plugin // - on les regenere pour la liste des plugins mise a jour - if (!_SVP_MODE_RUNTIME) + if (!_SVP_MODE_RUNTIME) { svp_actualiser_url_plugins($id_depot); - + } + // Calcul des compteurs de paquets, plugins et contributions $nb_paquets = sql_countsel('spip_paquets', 'id_depot=' . sql_quote($id_depot)); $nb_plugins = sql_countsel('spip_depots_plugins', 'id_depot=' . sql_quote($id_depot)); $nb_autres = sql_countsel('spip_paquets', array('id_depot=' . sql_quote($id_depot), 'id_plugin=0')); - + return true; } @@ -631,7 +665,7 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, * * Les paquets peuvent de pas avoir d'info "prefixe" (à transformer en id_plugin) * lorsqu'ils ne proviennent pas de plugin (squelettes...) - * + * * @param array $insert_plugins * Tableau de description de plugins. * Une description est un tableau de couples (colonne sql => valeur) @@ -648,14 +682,14 @@ function svp_actualiser_paquets($id_depot, $paquets, &$nb_paquets, &$nb_plugins, * Couples de relation (préfixe de plugin => identifiant de plugin) connues, * pour limiter les accès SQL. * @return void -**/ + **/ function svp_inserer_multi(&$insert_plugins, &$insert_paquets, &$insert_contribs, &$prefixes) { if (count($insert_plugins)) { sql_insertq_multi('spip_plugins', $insert_plugins); $insert_plugins = array(); } - + if (count($insert_paquets)) { // on cherche tous les id_plugin/prefixe que l'on a à récuperer @@ -663,22 +697,22 @@ function svp_inserer_multi(&$insert_plugins, &$insert_paquets, &$insert_contribs $prefixes_manquants = array(); foreach ($insert_paquets as $p) { // on ne connait que le prefixe - if (isset($p['prefixe']) and !isset($prefixes[ $p['prefixe'] ])) { - $prefixes_manquants[] = $p['prefixe']; - } + if (isset($p['prefixe']) and !isset($prefixes[$p['prefixe']])) { + $prefixes_manquants[] = $p['prefixe']; + } } // recuperer les nouveaux prefixes : $new = sql_allfetsel(array('prefixe', 'id_plugin'), 'spip_plugins', sql_in('prefixe', $prefixes_manquants)); foreach ($new as $p) { - $prefixes[ $p['prefixe'] ] = $p['id_plugin']; + $prefixes[$p['prefixe']] = $p['id_plugin']; } // inserer les id_plugin dans les paquets a inserer // inserer le prefixe dans le paquet (pour raccourcis de jointures) - foreach ($insert_paquets as $c=>$p) { + foreach ($insert_paquets as $c => $p) { if (isset($p['prefixe'])) { - $insert_paquets[$c]['id_plugin'] = $prefixes[ $insert_paquets[$c]['prefixe'] ]; + $insert_paquets[$c]['id_plugin'] = $prefixes[$insert_paquets[$c]['prefixe']]; } else { $insert_paquets[$c]['prefixe'] = array_search($p['id_plugin'], $prefixes); } @@ -704,7 +738,7 @@ function svp_inserer_multi(&$insert_plugins, &$insert_paquets, &$insert_contribs * @uses svp_completer_plugins() * @param int $id_depot * Identifiant du depot à actualiser -**/ + **/ function svp_completer_plugins_depot($id_depot) { // On limite la revue des paquets a ceux des plugins heberges par le depot en cours d'actualisation $ids_plugins = sql_allfetsel('id_plugin', 'spip_depots_plugins', array('id_depot=' . sql_quote($id_depot))); @@ -714,7 +748,7 @@ function svp_completer_plugins_depot($id_depot) { } } -/** +/** * Complète les informations des plugins, d'une liste de plugins donnés, * en compilant certaines informations (compatibilités, dates, branches) * @@ -723,7 +757,7 @@ function svp_completer_plugins_depot($id_depot) { * Liste d'identifiants de plugins * @return bool * false si rien à faire, true sinon -**/ + **/ function svp_completer_plugins($ids_plugin) { if (!$ids_plugin) { @@ -733,13 +767,14 @@ function svp_completer_plugins($ids_plugin) { include_spip('inc/svp_outiller'); // -- on recupere tous les paquets associes aux plugins indiques et on compile les infos - if ($resultats = sql_allfetsel('id_plugin, compatibilite_spip, date_crea, date_modif', 'spip_paquets', - array(sql_in('id_plugin', $ids_plugin), 'id_depot>'.intval(0)), '', 'id_plugin')) { + if ($resultats = sql_allfetsel('id_plugin, compatibilite_spip, date_crea, date_modif', 'spip_paquets', + array(sql_in('id_plugin', $ids_plugin), 'id_depot>' . intval(0)), '', 'id_plugin') + ) { $plugin_en_cours = 0; $inserts = array(); - - foreach($resultats as $paquet) { + + foreach ($resultats as $paquet) { // On finalise le plugin en cours et on passe au suivant if ($plugin_en_cours != $paquet['id_plugin']) { // On met a jour le plugin en cours @@ -752,19 +787,25 @@ function svp_completer_plugins($ids_plugin) { $plugin_en_cours = $paquet['id_plugin']; $complements = array('compatibilite_spip' => '', 'branches_spip' => '', 'date_crea' => 0, 'date_modif' => 0); } - + // On compile les compléments du plugin avec le paquet courant sauf les branches // qui sont deduites en fin de compilation de la compatibilite - if ($paquet['date_modif'] > $complements['date_modif']) + if ($paquet['date_modif'] > $complements['date_modif']) { $complements['date_modif'] = $paquet['date_modif']; + } if (($complements['date_crea'] === 0) - OR ($paquet['date_crea'] < $complements['date_crea'])) + OR ($paquet['date_crea'] < $complements['date_crea']) + ) { $complements['date_crea'] = $paquet['date_crea']; - if ($paquet['compatibilite_spip']) - if (!$complements['compatibilite_spip']) + } + if ($paquet['compatibilite_spip']) { + if (!$complements['compatibilite_spip']) { $complements['compatibilite_spip'] = $paquet['compatibilite_spip']; - else - $complements['compatibilite_spip'] = fusionner_intervalles($paquet['compatibilite_spip'], $complements['compatibilite_spip']); + } else { + $complements['compatibilite_spip'] = fusionner_intervalles($paquet['compatibilite_spip'], + $complements['compatibilite_spip']); + } + } } // On finalise le dernier plugin en cours $complements['branches_spip'] = compiler_branches_spip($complements['compatibilite_spip']); @@ -774,11 +815,11 @@ function svp_completer_plugins($ids_plugin) { if (sql_preferer_transaction()) { sql_demarrer_transaction(); } - + foreach ($inserts as $id_plugin => $complements) { sql_updateq('spip_plugins', $complements, 'id_plugin=' . intval($id_plugin)); } - + if (sql_preferer_transaction()) { sql_terminer_transaction(); } @@ -790,14 +831,14 @@ function svp_completer_plugins($ids_plugin) { /** - * Recrée toutes les URLs propres de plugin + * Recrée toutes les URLs propres de plugin * * Supprime toutes les urls de plugin de la table spip_urls puis les régénère. - * + * * @return int * Nombre d'URLs de plugin régénérées -**/ -function svp_actualiser_url_plugins () { + **/ +function svp_actualiser_url_plugins() { $nb_plugins = 0; // On supprime toutes les urls de plugin @@ -812,13 +853,13 @@ function svp_actualiser_url_plugins () { generer_url_entite($_id, 'plugin', '', '', true); } } - + return $nb_plugins; } /** * Éclate une description de paquet issu du XML du dépot en deux parties, - * une pour le plugin, l'autre pour le paquet + * une pour le plugin, l'autre pour le paquet * * Sépare en deux une description de champs désignant un paquet, en extrayant : * - la partie plugin, soit ce qui peut être propre à plusieurs paquets. @@ -826,14 +867,14 @@ function svp_actualiser_url_plugins () { * - la partie paquet, soit ce qui est propre à ce conteneur là. On trouve * dedans entre autres la description, la version, la compatibilité * à SPIP, les dépendances, etc... - * + * * @param array $champs_aplat * Couples (clé => valeur) d'un paquet issu de l'analyse XML du dépot * @return array * Tableau de 2 index : * - Index 'plugin' : couples (clé=>valeur) relatives au plugin * - Index 'paquet' : couples (clé=>valeur) spécifiques au paquet -**/ + **/ function eclater_plugin_paquet($champs_aplat) { return array( 'plugin' => array( @@ -866,41 +907,40 @@ function eclater_plugin_paquet($champs_aplat) { } - /** * Détermine la version max de chaque plugin, c'est à dire * la version maxi d'un des paquets qui lui est lié. - * + * * @param array $plugins Liste d'identifiant de plugins -**/ + **/ function svp_corriger_vmax_plugins($plugins) { // tous les plugins encore lies a des depots (hors local)... // la vmax est a retablir... if ($plugins) { $p = sql_allfetsel('DISTINCT(p.id_plugin)', array('spip_plugins AS p', 'spip_paquets AS pa'), - array(sql_in('p.id_plugin', $plugins), 'p.id_plugin=pa.id_plugin', 'pa.id_depot>'.intval(0))); + array(sql_in('p.id_plugin', $plugins), 'p.id_plugin=pa.id_plugin', 'pa.id_depot>' . intval(0))); $p = array_map('array_shift', $p); // pour les autres, on la fixe correctement - + // On insere, en encapsulant pour sqlite... if (sql_preferer_transaction()) { sql_demarrer_transaction(); } - + foreach ($p as $id_plugin) { $vmax = ''; - if ($pa = sql_allfetsel('version', 'spip_paquets', array('id_plugin='.$id_plugin, 'id_depot>'.intval(0)))) { + if ($pa = sql_allfetsel('version', 'spip_paquets', array('id_plugin=' . $id_plugin, 'id_depot>' . intval(0)))) { foreach ($pa as $v) { if (spip_version_compare($v['version'], $vmax, '>')) { $vmax = $v['version']; } } } - sql_updateq('spip_plugins', array('vmax'=>$vmax), 'id_plugin=' . intval($id_plugin)); + sql_updateq('spip_plugins', array('vmax' => $vmax), 'id_plugin=' . intval($id_plugin)); } - + if (sql_preferer_transaction()) { sql_terminer_transaction(); } @@ -908,5 +948,4 @@ function svp_corriger_vmax_plugins($plugins) { } - ?> diff --git a/inc/svp_depoter_local.php b/inc/svp_depoter_local.php index b742f24..28c5bb9 100644 --- a/inc/svp_depoter_local.php +++ b/inc/svp_depoter_local.php @@ -10,7 +10,7 @@ * Il n'y a cependant pas de ligne spécifique décrivant le dépot local * dans la table SQL spip_depots, mais juste des valeurs id_depot=0 dans * la table spip_paquets. - * + * * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Depots @@ -23,13 +23,13 @@ * On ne met à jour que ce qui a changé, sauf si on force le recalcule * de toutes les informations locales avec var_mode=vider_paquets_locaux * dans l'URL ou en mettant le paramètre $force à true. - * + * * @uses svp_descriptions_paquets_locaux() * @uses svp_base_supprimer_paquets_locaux() * @uses svp_base_inserer_paquets_locaux() * @uses svp_base_modifier_paquets_locaux() * @uses svp_base_actualiser_paquets_actifs() - * + * * @param bool $force * - false : n'actualise que les paquets modifiés * - true : efface et recrée la liste de tous les paquets locaux @@ -37,7 +37,7 @@ * Si des erreurs XML sont présentes, elles se retrouvent dans ce tableau * @return string * Temps d'exécution -**/ + **/ function svp_actualiser_paquets_locaux($force = false, &$erreurs_xml = array()) { spip_timer('paquets_locaux'); @@ -46,7 +46,8 @@ function svp_actualiser_paquets_locaux($force = false, &$erreurs_xml = array()) // un mode pour tout recalculer sans désinstaller le plugin... ! if ($force OR _request('var_mode') == 'vider_paquets_locaux' - OR _request('var_mode') == 'recalcul' ) { + OR _request('var_mode') == 'recalcul' + ) { svp_base_supprimer_paquets_locaux(); svp_base_inserer_paquets_locaux($paquets); } else { @@ -58,7 +59,7 @@ function svp_actualiser_paquets_locaux($force = false, &$erreurs_xml = array()) #spip_log('svp_actualiser_paquets_locaux', 'SVP'); #spip_log($temps, 'SVP'); return "Éxécuté en : " . $temps; - + } @@ -75,14 +76,14 @@ function svp_actualiser_paquets_locaux($force = false, &$erreurs_xml = array()) * Descriptions des paquets (intégrant un hash), stockés par * constante, puis par chemin. * array[_DIR_PLUGIN*][$chemin] = description -**/ + **/ function svp_descriptions_paquets_locaux(&$erreurs_xml = array()) { include_spip('inc/plugin'); liste_plugin_files(_DIR_PLUGINS); liste_plugin_files(_DIR_PLUGINS_DIST); $get_infos = charger_fonction('get_infos', 'plugins'); $paquets_locaux = array( - '_DIR_PLUGINS' => $get_infos(array(), false, _DIR_PLUGINS), + '_DIR_PLUGINS' => $get_infos(array(), false, _DIR_PLUGINS), '_DIR_PLUGINS_DIST' => $get_infos(array(), false, _DIR_PLUGINS_DIST), ); if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) { @@ -91,7 +92,7 @@ function svp_descriptions_paquets_locaux(&$erreurs_xml = array()) { } // creer la liste des signatures - foreach($paquets_locaux as $const_dir => $paquets) { + foreach ($paquets_locaux as $const_dir => $paquets) { foreach ($paquets as $chemin => $paquet) { // on propose le paquet uniquement s'il n'y a pas eu d'erreur de lecture XML bloquante if (!isset($paquet['erreur'])) { @@ -112,7 +113,7 @@ function svp_descriptions_paquets_locaux(&$erreurs_xml = array()) { /** * Supprime tous les paquets et plugins locaux. -**/ + **/ function svp_base_supprimer_paquets_locaux() { sql_delete('spip_paquets', 'id_depot = ' . 0); //_paquets locaux en 0 sql_delete('spip_plugins', sql_in('id_plugin', sql_get_select('DISTINCT(id_plugin)', 'spip_paquets'), 'NOT')); @@ -125,12 +126,12 @@ function svp_base_supprimer_paquets_locaux() { * * @uses svp_supprimer_plugins_orphelins() * @uses svp_base_inserer_paquets_locaux() - * + * * @param array $paquets_locaux * Descriptions des paquets (intégrant un hash), stockés par * constante, puis par chemin. * array[_DIR_PLUGIN*][$chemin] = description -**/ + **/ function svp_base_modifier_paquets_locaux($paquets_locaux) { include_spip('inc/svp_depoter_distant'); @@ -139,32 +140,34 @@ function svp_base_modifier_paquets_locaux($paquets_locaux) { $signatures = array(); // recuperer toutes les signatures - foreach($paquets_locaux as $const_dir => $paquets) { + foreach ($paquets_locaux as $const_dir => $paquets) { foreach ($paquets as $chemin => $paquet) { $signatures[$paquet['signature']] = array( 'constante' => $const_dir, - 'chemin' => $chemin, - 'paquet' => $paquet, + 'chemin' => $chemin, + 'paquet' => $paquet, ); } } // tous les paquets du depot qui ne font pas parti des signatures - $anciens_paquets = sql_allfetsel('id_paquet', 'spip_paquets', array('id_depot=' . sql_quote(0), sql_in('signature', array_keys($signatures), 'NOT'))); + $anciens_paquets = sql_allfetsel('id_paquet', 'spip_paquets', + array('id_depot=' . sql_quote(0), sql_in('signature', array_keys($signatures), 'NOT'))); $anciens_paquets = array_map('array_shift', $anciens_paquets); // tous les plugins correspondants aux anciens paquets - $anciens_plugins = sql_allfetsel('p.id_plugin', array('spip_plugins AS p', 'spip_paquets AS pa'), array('p.id_plugin=pa.id_plugin', sql_in('pa.id_paquet', $anciens_paquets))); + $anciens_plugins = sql_allfetsel('p.id_plugin', array('spip_plugins AS p', 'spip_paquets AS pa'), + array('p.id_plugin=pa.id_plugin', sql_in('pa.id_paquet', $anciens_paquets))); $anciens_plugins = array_map('array_shift', $anciens_plugins); // suppression des anciens paquets sql_delete('spip_paquets', sql_in('id_paquet', $anciens_paquets)); - + // supprimer les plugins orphelins svp_supprimer_plugins_orphelins($anciens_plugins); // on ne garde que les paquets qui ne sont pas presents dans la base - $signatures_base = sql_allfetsel('signature', 'spip_paquets', 'id_depot='.sql_quote(0)); + $signatures_base = sql_allfetsel('signature', 'spip_paquets', 'id_depot=' . sql_quote(0)); $signatures_base = array_map('array_shift', $signatures_base); $signatures = array_diff_key($signatures, array_flip($signatures_base)); @@ -187,25 +190,25 @@ function svp_base_modifier_paquets_locaux($paquets_locaux) { * De chaque description est extrait la partie plugin (1 seul plugin * par préfixe de plugin connu) et la partie paquet (il peut y avoir plusieurs * paquets pour un même préfixe de plugin). - * + * * @note * On essaie au mieux de faire des requêtes d'insertions multiples, * mieux gérées par les moteurs SQL (particulièrement pour SQLite) - * + * * @uses plugins_preparer_sql_paquet() * @uses svp_compiler_multis() * @uses eclater_plugin_paquet() * @uses svp_rechercher_maj_version() * @uses svp_corriger_obsolete_paquets() - * + * * @param array $paquets_locaux * Descriptions des paquets (intégrant un hash), stockés par * constante, puis par chemin. * array[_DIR_PLUGIN*][$chemin] = description -**/ + **/ function svp_base_inserer_paquets_locaux($paquets_locaux) { include_spip('inc/svp_depoter_distant'); - + // On initialise les informations specifiques au paquet : // l'id du depot et les infos de l'archive $paquet_base = array( @@ -223,18 +226,18 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { // pour chaque decouverte, on insere les paquets en base. // on evite des requetes individuelles, tres couteuses en sqlite... - $cle_plugins = array(); // prefixe => id + $cle_plugins = array(); // prefixe => id $insert_plugins = array(); // insertion prefixe... $insert_plugins_vmax = array(); // vmax des nouveaux plugins... $insert_paquets = array(); // insertion de paquet... include_spip('inc/config'); $recents = lire_config('plugins_interessants'); - $installes = lire_config('plugin_installes'); - $actifs = lire_config('plugin'); - $attentes = lire_config('plugin_attente'); + $installes = lire_config('plugin_installes'); + $actifs = lire_config('plugin'); + $attentes = lire_config('plugin_attente'); - foreach($paquets_locaux as $const_dir => $paquets) { + foreach ($paquets_locaux as $const_dir => $paquets) { foreach ($paquets as $chemin => $paquet) { // Si on est en presence d'un plugin dont la dtd est "paquet" on compile en multi // les nom, slogan et description a partir des fichiers de langue. @@ -242,8 +245,9 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { // => On evite l'utilisation de _T() dans les squelettes if ($paquet['dtd'] == 'paquet') { $multis = svp_compiler_multis($paquet['prefix'], constant($const_dir) . '/' . $chemin); - if (isset($multis['nom'])) + if (isset($multis['nom'])) { $paquet['nom'] = $multis['nom']; + } $paquet['slogan'] = (isset($multis['slogan'])) ? $multis['slogan'] : ''; $paquet['description'] = (isset($multis['description'])) ? $multis['description'] : ''; } @@ -271,7 +275,7 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { } // creation du plugin... - $prefixe = strtoupper( $le_plugin['prefixe'] ); + $prefixe = strtoupper($le_plugin['prefixe']); // on fait attention lorqu'on cherche ou ajoute un plugin // le nom et slogan est TOUJOURS celui de la plus haute version // et il faut donc possiblement mettre a jour la base... @@ -279,7 +283,7 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { // + on est tolerant avec les versions identiques de plugin deja presentes // on permet le recalculer le titre... if (!isset($cle_plugins[$prefixe])) { - if (!$res = sql_fetsel('id_plugin, vmax', 'spip_plugins', 'prefixe = '.sql_quote($prefixe))) { + if (!$res = sql_fetsel('id_plugin, vmax', 'spip_plugins', 'prefixe = ' . sql_quote($prefixe))) { // on ne stocke pas de vmax pour les plugins locaux dans la bdd... (parait il) if (!isset($insert_plugins[$prefixe])) { $insert_plugins[$prefixe] = $le_plugin; @@ -294,25 +298,27 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { // comme justement on ne stocke pas de vmax pour les plugins locaux... // il est possible que ce test soit faux. pff. if (spip_version_compare($le_paquet['version'], $res['vmax'], '>=')) { - sql_updateq('spip_plugins', $le_plugin, 'id_plugin='.sql_quote($id_plugin)); + sql_updateq('spip_plugins', $le_plugin, 'id_plugin=' . sql_quote($id_plugin)); } } } // ajout du prefixe dans le paquet - $le_paquet['prefixe'] = $prefixe; - $le_paquet['constante'] = $const_dir; + $le_paquet['prefixe'] = $prefixe; + $le_paquet['constante'] = $const_dir; $le_paquet['src_archive'] = $chemin; - $le_paquet['recent'] = isset($recents[$chemin]) ? $recents[$chemin] : 0; - $le_paquet['installe'] = is_array($chemin) && in_array($chemin, $installes) ? 'oui': 'non'; // est desinstallable ? - $le_paquet['obsolete'] = 'non'; - $le_paquet['signature'] = $paquet['signature']; + $le_paquet['recent'] = isset($recents[$chemin]) ? $recents[$chemin] : 0; + $le_paquet['installe'] = is_array($chemin) && in_array($chemin, + $installes) ? 'oui' : 'non'; // est desinstallable ? + $le_paquet['obsolete'] = 'non'; + $le_paquet['signature'] = $paquet['signature']; // le plugin est il actuellement actif ? $actif = "non"; if (isset($actifs[$prefixe]) and ($actifs[$prefixe]['dir_type'] == $const_dir) - and ($actifs[$prefixe]['dir'] == $chemin)) { + and ($actifs[$prefixe]['dir'] == $chemin) + ) { $actif = "oui"; } $le_paquet['actif'] = $actif; @@ -322,7 +328,8 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { $attente = "non"; if (isset($attentes[$prefixe]) and ($attentes[$prefixe]['dir_type'] == $const_dir) - and ($attentes[$prefixe]['dir'] == $chemin)) { + and ($attentes[$prefixe]['dir'] == $chemin) + ) { $attente = "oui"; $le_paquet['actif'] = "oui"; // il est presenté dans la liste des actifs (en erreur). } @@ -345,15 +352,15 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { $cle_plugins[$p['prefixe']] = $p['id_plugin']; } } - + if ($insert_paquets) { // sert pour le calcul d'obsolescence $id_plugin_concernes = array(); - + foreach ($insert_paquets as $c => $p) { $insert_paquets[$c]['id_plugin'] = $cle_plugins[$p['prefixe']]; - $id_plugin_concernes[ $insert_paquets[$c]['id_plugin'] ] = true; + $id_plugin_concernes[$insert_paquets[$c]['id_plugin']] = true; // remettre les necessite, utilise, librairie dans la cle 0 // comme SVP @@ -361,9 +368,9 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { foreach ($dep as $d => $contenu) { if ($contenu) { $new = array(); - foreach($contenu as $n) { + foreach ($contenu as $n) { unset($n['id']); - $new[ strtolower($n['nom']) ] = $n; + $new[strtolower($n['nom'])] = $n; } $dep[$d] = array($new); } @@ -375,24 +382,24 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) { sql_insertq_multi('spip_paquets', $insert_paquets); - svp_corriger_obsolete_paquets( array_keys($id_plugin_concernes) ); + svp_corriger_obsolete_paquets(array_keys($id_plugin_concernes)); } } /** * Fait correspondre l'état des métas des plugins actifs & installés - * avec ceux en base de données dans spip_paquets pour le dépot local -**/ + * avec ceux en base de données dans spip_paquets pour le dépot local + **/ function svp_base_actualiser_paquets_actifs() { - $installes = lire_config('plugin_installes'); - $actifs = lire_config('plugin'); - $attentes = lire_config('plugin_attente'); + $installes = lire_config('plugin_installes'); + $actifs = lire_config('plugin'); + $attentes = lire_config('plugin_attente'); $locaux = sql_allfetsel( array('id_paquet', 'prefixe', 'actif', 'installe', 'attente', 'constante', 'src_archive'), 'spip_paquets', - 'id_depot='.sql_quote(0)); + 'id_depot=' . sql_quote(0)); $changements = array(); foreach ($locaux as $l) { @@ -401,22 +408,24 @@ function svp_base_actualiser_paquets_actifs() { // actif ? if (isset($actifs[$prefixe]) and ($actifs[$prefixe]['dir_type'] == $l['constante']) - and ($actifs[$prefixe]['dir'] == $l['src_archive'])) { + and ($actifs[$prefixe]['dir'] == $l['src_archive']) + ) { $copie['actif'] = "oui"; } else { $copie['actif'] = "non"; } - + // attente ? if (isset($attentes[$prefixe]) and ($attentes[$prefixe]['dir_type'] == $l['constante']) - and ($attentes[$prefixe]['dir'] == $l['src_archive'])) { + and ($attentes[$prefixe]['dir'] == $l['src_archive']) + ) { $copie['attente'] = "oui"; $copie['actif'] = "oui"; // il est presente dans la liste des actifs (en erreur). } else { $copie['attente'] = "non"; } - + // installe ? if (in_array($l['src_archive'], $installes)) { $copie['installe'] = "oui"; @@ -425,10 +434,11 @@ function svp_base_actualiser_paquets_actifs() { } if ($copie != $l) { - $changements[ $l['id_paquet'] ] = array( - 'actif' => $copie['actif'], + $changements[$l['id_paquet']] = array( + 'actif' => $copie['actif'], 'installe' => $copie['installe'], - 'attente' => $copie['attente'] ); + 'attente' => $copie['attente'] + ); } } @@ -454,8 +464,8 @@ function svp_base_actualiser_paquets_actifs() { * et description à partir des items de langue contenus dans le fichier * paquet-prefixe_langue.php * - * @param string $prefixe Préfixe du plugin - * @param string $dir_source Chemin d'accès du plugin + * @param string $prefixe Préfixe du plugin + * @param string $dir_source Chemin d'accès du plugin * @return array * Tableau clé => texte multilangue entre et * Les clés peuvent être 'nom', 'slogan' et 'description', mais @@ -464,7 +474,7 @@ function svp_base_actualiser_paquets_actifs() { */ function svp_compiler_multis($prefixe, $dir_source) { - $multis =array(); + $multis = array(); // ici on cherche le fichier et les cles avec un prefixe en minuscule systematiquement... $prefixe = strtolower($prefixe); $module = "paquet-$prefixe"; @@ -478,28 +488,37 @@ function svp_compiler_multis($prefixe, $dir_source) { $nom = $slogan = $description = ''; foreach ($fichiers_langue as $_fichier_langue) { $nom_fichier = basename($_fichier_langue, '.php'); - $langue = substr($nom_fichier, strlen($module) + 1 - strlen($nom_fichier)); + $langue = substr($nom_fichier, strlen($module)+1-strlen($nom_fichier)); // Si la langue est reconnue, on traite la liste des items de langue if (isset($GLOBALS['codes_langues'][$langue])) { $GLOBALS['idx_lang'] = $langue; include($_fichier_langue); foreach ($GLOBALS[$langue] as $_item => $_traduction) { if ($_traduction = trim($_traduction)) { - if ($_item == $item_nom) + if ($_item == $item_nom) { $nom .= "[$langue]$_traduction"; - if ($_item == $item_slogan) + } + if ($_item == $item_slogan) { $slogan .= "[$langue]$_traduction"; - if ($_item == $item_description) + } + if ($_item == $item_description) { $description .= "[$langue]$_traduction"; + } } } } } // Finaliser la construction des balises multi - if ($nom) $multis['nom'] = "$nom"; - if ($slogan) $multis['slogan'] = "$slogan"; - if ($description) $multis['description'] = "$description"; + if ($nom) { + $multis['nom'] = "$nom"; + } + if ($slogan) { + $multis['slogan'] = "$slogan"; + } + if ($description) { + $multis['description'] = "$description"; + } } return $multis; @@ -511,18 +530,18 @@ function svp_compiler_multis($prefixe, $dir_source) { * * L'obsolescence indique qu'un paquet est plus ancien (de version ou état * moins avancé) qu'un autre également présent localement. - * + * * @param array $ids_plugin * Liste d'identifiants de plugins * En cas d'absence, passera sur tous les paquets locaux -**/ + **/ function svp_corriger_obsolete_paquets($ids_plugin = array()) { // on minimise au maximum le nombre de requetes. // 1 pour lister les paquets // 1 pour mettre à jour les obsoletes à oui // 1 pour mettre à jour les obsoletes à non - $where = array('pa.id_plugin = pl.id_plugin', 'id_depot='.sql_quote(0)); + $where = array('pa.id_plugin = pl.id_plugin', 'id_depot=' . sql_quote(0)); if ($ids_plugin) { $where[] = sql_in('pl.id_plugin', $ids_plugin); } @@ -541,7 +560,8 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) { // L'obsolescence doit tenir compte de la compatibilité avec notre version de SPIP en cours foreach ($paquets as $c => $p) { - $paquets[$c]['compatible'] = plugin_version_compatible($p['compatibilite_spip'], $GLOBALS['spip_version_branche'], 'spip'); + $paquets[$c]['compatible'] = plugin_version_compatible($p['compatibilite_spip'], $GLOBALS['spip_version_branche'], + 'spip'); } foreach ($paquets as $c => $p) { @@ -555,8 +575,12 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) { // Si version et etat sont egaux, on ne decide pas d'obsolescence. if (count($obsoletes[$p['prefixe']]) > 1) { foreach ($obsoletes[$p['prefixe']] as $cle) { - if ($cle == $c) continue; - if (!$paquets[$c]['compatible']) continue; + if ($cle == $c) { + continue; + } + if (!$paquets[$c]['compatible']) { + continue; + } // je suis plus petit qu'un autre if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '<')) { @@ -566,28 +590,26 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) { $changements[$c] = true; } } - } - - // je suis plus grand ou egal a un autre... + } // je suis plus grand ou egal a un autre... else { // je suis strictement plus grand qu'un autre... if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '>')) { // si mon etat est meilleur, rendre obsolete les autres if ($paquets[$c]['etatnum'] >= $paquets[$cle]['etatnum']) { - if ($paquets[$cle]['obsolete'] != 'oui') { - $paquets[$cle]['obsolete'] = 'oui'; - $changements[$cle] = true; - } + if ($paquets[$cle]['obsolete'] != 'oui') { + $paquets[$cle]['obsolete'] = 'oui'; + $changements[$cle] = true; + } } } // je suis egal a un autre // si mon etat est strictement meilleur, rendre obsolete les autres elseif ($paquets[$c]['etatnum'] > $paquets[$cle]['etatnum']) { - if ($paquets[$cle]['obsolete'] != 'oui') { - $paquets[$cle]['obsolete'] = 'oui'; - $changements[$cle] = true; - } + if ($paquets[$cle]['obsolete'] != 'oui') { + $paquets[$cle]['obsolete'] = 'oui'; + $changements[$cle] = true; + } } } @@ -611,17 +633,15 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) { } if ($oui) { - sql_updateq('spip_paquets', array('obsolete'=>'oui'), sql_in('id_paquet', $oui)); + sql_updateq('spip_paquets', array('obsolete' => 'oui'), sql_in('id_paquet', $oui)); } if ($non) { - sql_updateq('spip_paquets', array('obsolete'=>'non'), sql_in('id_paquet', $non)); + sql_updateq('spip_paquets', array('obsolete' => 'non'), sql_in('id_paquet', $non)); } } } - - /** * Supprime les plugins devenus orphelins dans cette liste. * @@ -629,34 +649,37 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) { * Liste d'identifiants de plugins * @return array * Liste de plugins non orphelins -**/ + **/ function svp_supprimer_plugins_orphelins($ids_plugin) { // tous les plugins encore lies a des depots... if ($ids_plugin) { - $p = sql_allfetsel('DISTINCT(p.id_plugin)', array('spip_plugins AS p', 'spip_paquets AS pa'), array(sql_in('p.id_plugin', $ids_plugin), 'p.id_plugin=pa.id_plugin')); + $p = sql_allfetsel('DISTINCT(p.id_plugin)', array('spip_plugins AS p', 'spip_paquets AS pa'), + array(sql_in('p.id_plugin', $ids_plugin), 'p.id_plugin=pa.id_plugin')); $p = array_map('array_shift', $p); $diff = array_diff($ids_plugin, $p); // pour chaque plugin non encore utilise, on les vire ! sql_delete('spip_plugins', sql_in('id_plugin', $diff)); + return $p; // les plugins encore en vie ! } + return array(); } /** * Cherche dans les dépots distants un plugin qui serait plus à jour - * que le prefixe, version et état que l'on transmet + * que le prefixe, version et état que l'on transmet * * @param string $prefixe - * Préfixe du plugin + * Préfixe du plugin * @param string $version - * Version du paquet à comparer + * Version du paquet à comparer * @param int $etatnum - * État du paquet numérique + * État du paquet numérique * @return string - * Version plus à jour, sinon rien -**/ + * Version plus à jour, sinon rien + **/ function svp_rechercher_maj_version($prefixe, $version, $etatnum) { $maj_version = ""; @@ -668,13 +691,14 @@ function svp_rechercher_maj_version($prefixe, $version, $etatnum) { 'pl.id_plugin = pa.id_plugin', 'pa.id_depot>' . sql_quote(0), 'pl.prefixe=' . sql_quote($prefixe), - 'pa.etatnum>=' . sql_quote($etatnum)))) - { + 'pa.etatnum>=' . sql_quote($etatnum) + )) + ) { foreach ($res as $paquet_distant) { // si version superieure et etat identique ou meilleur, // c'est que c'est une mise a jour possible ! - if (spip_version_compare($paquet_distant['version'],$version,'>')) { + if (spip_version_compare($paquet_distant['version'], $version, '>')) { if (!strlen($maj_version) or spip_version_compare($paquet_distant['version'], $maj_version, '>')) { $maj_version = $paquet_distant['version']; } @@ -689,21 +713,19 @@ function svp_rechercher_maj_version($prefixe, $version, $etatnum) { } - - /** * Actualise l'information 'maj_version' pour tous les paquets locaux - * + * * @uses svp_rechercher_maj_version() -**/ + **/ function svp_actualiser_maj_version() { $update = array(); // tous les paquets locaux if ($locaux = sql_allfetsel( array('id_paquet', 'prefixe', 'version', 'maj_version', 'etatnum'), array('spip_paquets'), - array('id_depot=' . sql_quote(0)))) - { + array('id_depot=' . sql_quote(0))) + ) { foreach ($locaux as $paquet) { $new_maj_version = svp_rechercher_maj_version($paquet['prefixe'], $paquet['version'], $paquet['etatnum']); if ($new_maj_version != $paquet['maj_version']) { diff --git a/inc/svp_outiller.php b/inc/svp_outiller.php index 8757fa6..efd4b33 100644 --- a/inc/svp_outiller.php +++ b/inc/svp_outiller.php @@ -1,29 +1,31 @@ array(_SVP_VERSION_SPIP_MIN,'1.9.2'), - '2.0' => array('2.0.0','2.0.99'), - '2.1' => array('2.1.0','2.1.99'), - '3.0' => array('3.0.0','3.0.99'), - '3.1' => array('3.1.0',_SVP_VERSION_SPIP_MAX) + '1.9' => array(_SVP_VERSION_SPIP_MIN, '1.9.2'), + '2.0' => array('2.0.0', '2.0.99'), + '2.1' => array('2.1.0', '2.1.99'), + '3.0' => array('3.0.0', '3.0.99'), + '3.1' => array('3.1.0', _SVP_VERSION_SPIP_MAX) ); # define('_INFOS_BRANCHES_SPIP', serialize($infos_branches_spip)); /** * Liste des licences de plugin * - * @global array $GLOBALS['licences_plugin'] + * @global array $GLOBALS ['licences_plugin'] */ $GLOBALS['licences_plugin'] = array( 'apache' => array( 'versions' => array('2.0', '1.1', '1.0'), 'nom' => 'Apache licence, version @version@', - 'url' => 'http://www.apache.org/licenses/LICENSE-@version@'), + 'url' => 'http://www.apache.org/licenses/LICENSE-@version@' + ), 'art' => array( 'versions' => array('1.3'), 'nom' => 'Art libre @version@', - 'url' => 'http://artlibre.org/licence/lal'), + 'url' => 'http://artlibre.org/licence/lal' + ), 'mit' => array( 'versions' => array(), 'nom' => 'MIT', - 'url' => 'http://opensource.org/licenses/mit-license.php'), + 'url' => 'http://opensource.org/licenses/mit-license.php' + ), 'bsd' => array( 'versions' => array(), 'nom' => 'BSD', - 'url' => 'http://www.freebsd.org/copyright/license.html'), + 'url' => 'http://www.freebsd.org/copyright/license.html' + ), 'agpl' => array( 'versions' => array('3'), 'nom' => 'AGPL @version@', - 'url' => 'http://www.gnu.org/licenses/agpl.html'), + 'url' => 'http://www.gnu.org/licenses/agpl.html' + ), 'fdl' => array( 'versions' => array('1.3', '1.2', '1.1'), 'nom' => 'FDL @version@', - 'url' => 'http://www.gnu.org/licenses/fdl-@version@.html'), + 'url' => 'http://www.gnu.org/licenses/fdl-@version@.html' + ), 'lgpl' => array( 'versions' => array('3.0', '2.1'), 'nom' => array('3.0' => 'LGPL 3', '2.1' => 'LGPL 2.1'), - 'url' => 'http://www.gnu.org/licenses/lgpl-@version@.html'), + 'url' => 'http://www.gnu.org/licenses/lgpl-@version@.html' + ), 'gpl' => array( 'versions' => array('3', '2', '1'), 'nom' => 'GPL @version@', - 'url' => 'http://www.gnu.org/licenses/gpl-@version@.0.html'), + 'url' => 'http://www.gnu.org/licenses/gpl-@version@.0.html' + ), 'ccby' => array( 'versions' => array('2.0', '2.5', '3.0'), 'suffixes' => array('-sa', '-nc', '-nd', '-nc-nd', '-nc-sa'), 'nom' => 'CC BY@suffixe@ @version@', - 'url' => 'http://creativecommons.org/licenses/by@suffixe@/@version@/') + 'url' => 'http://creativecommons.org/licenses/by@suffixe@/@version@/' + ) ); # define('_LICENCES_PLUGIN', serialize($licences_plugin)); /** - * Fusionne 2 intervalles de compatibilité + * Fusionne 2 intervalles de compatibilité * * Soit '[1.9;2.1]' et '[2.1;3.0.*]', la fonction retourne '[1.9;3.0.*]' * * En gros la fonction est utilisé pour calculer l'intervalle de validité * d'un plugin ayant plusieurs paquets avec des compatibilités différentes. * La compatibilité du plugin est le total de toutes les compatibilités. - * + * * @uses extraire_bornes() * @uses construire_intervalle() * @param string $intervalle_a @@ -105,7 +117,7 @@ $GLOBALS['licences_plugin'] = array( * Intervalle de compatibilité * @return string * Intervalle de compatibilité -**/ + **/ function fusionner_intervalles($intervalle_a, $intervalle_b) { // On recupere les bornes de chaque intervalle @@ -134,15 +146,17 @@ function fusionner_intervalles($intervalle_a, $intervalle_b) { // On calcul maintenant : // -- la borne min de l'intervalle fusionne = min(min_a, min_b) - if (spip_version_compare($borne_a['min']['valeur'], $borne_b['min']['valeur'], '<=')) + if (spip_version_compare($borne_a['min']['valeur'], $borne_b['min']['valeur'], '<=')) { $bornes_fusionnees['min'] = $borne_a['min']; - else + } else { $bornes_fusionnees['min'] = $borne_b['min']; + } // -- la borne max de l'intervalle fusionne = max(max_a, max_b) - if (spip_version_compare($borne_a['max']['valeur'], $borne_b['max']['valeur'], '<=')) + if (spip_version_compare($borne_a['max']['valeur'], $borne_b['max']['valeur'], '<=')) { $bornes_fusionnees['max'] = $borne_b['max']; - else + } else { $bornes_fusionnees['max'] = $borne_a['max']; + } return construire_intervalle($bornes_fusionnees); } @@ -164,26 +178,28 @@ function fusionner_intervalles($intervalle_a, $intervalle_b) { * - min : la borne inférieure, qui contient les index 'valeur' et 'incluse' * - max : la borne supérieure, qui contient les index 'valeur' et 'incluse' * Le sous index 'incluse' vaut true si cette borne est incluse dans l'intervalle. -**/ + **/ function extraire_bornes($intervalle, $initialiser = false) { static $borne_vide = array('valeur' => '', 'incluse' => false); static $borne_inf_init = array('valeur' => _SVP_VERSION_SPIP_MIN, 'incluse' => true); static $borne_sup_init = array('valeur' => _SVP_VERSION_SPIP_MAX, 'incluse' => true); - if ($initialiser) + if ($initialiser) { $bornes = array('min' => $borne_inf_init, 'max' => $borne_sup_init); - else + } else { $bornes = array('min' => $borne_vide, 'max' => $borne_vide); + } if ($intervalle - AND preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis', $intervalle, $matches)) { + AND preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis', $intervalle, $matches) + ) { if ($matches[1]) { $bornes['min']['valeur'] = trim($matches[1]); $bornes['min']['incluse'] = ($intervalle{0} == "["); } if ($matches[2]) { $bornes['max']['valeur'] = trim($matches[2]); - $bornes['max']['incluse'] = (substr($intervalle,-1) == "]"); + $bornes['max']['incluse'] = (substr($intervalle, -1) == "]"); } } @@ -191,7 +207,7 @@ function extraire_bornes($intervalle, $initialiser = false) { } /** - * Contruit un intervalle de compatibilité + * Contruit un intervalle de compatibilité * * @param array $bornes * L'intervalle décrit sous forme de tableau avec pour index : @@ -204,11 +220,11 @@ function extraire_bornes($intervalle, $initialiser = false) { * tel que ']2.1.2,3.0.1[' (paquet) ou '(2.1.2,3.0.1)' (plugin) * @return string * Intervalle de compatibilité tel que '[2.1;3.0]' -**/ + **/ function construire_intervalle($bornes, $dtd = 'paquet') { - return ($bornes['min']['incluse'] ? '[' : ($dtd=='paquet' ? ']' : '(')) - . $bornes['min']['valeur'] . ';' . $bornes['max']['valeur'] - . ($bornes['max']['incluse'] ? ']' : ($dtd=='paquet' ? '[' : ')')); + return ($bornes['min']['incluse'] ? '[' : ($dtd == 'paquet' ? ']' : '(')) + . $bornes['min']['valeur'] . ';' . $bornes['max']['valeur'] + . ($bornes['max']['incluse'] ? ']' : ($dtd == 'paquet' ? '[' : ')')); } @@ -221,20 +237,21 @@ function construire_intervalle($bornes, $dtd = 'paquet') { * Intervalle de compatibilité, tel que [2.0.0;3.0.0] * @return string * Branches de SPIP séparées par des virgules, tel que 2.0,2.1,3.0 -**/ + **/ function compiler_branches_spip($intervalle) { include_spip('plugins/installer'); global $infos_branches_spip; $liste_branches_spip = array_keys($GLOBALS['infos_branches_spip']); - + $bornes = extraire_bornes($intervalle, false); // On traite d'abord les cas ou l'intervalle est : // - vide // - non vide mais avec les deux bornes vides // Dans ces cas la compatibilite est totale, on renvoie toutes les branches - if (!$intervalle OR (!$bornes['min']['valeur'] AND !$bornes['max']['valeur'])) + if (!$intervalle OR (!$bornes['min']['valeur'] AND !$bornes['max']['valeur'])) { return implode(',', $liste_branches_spip); + } // On force l'initialisation des bornes et on les nettoie des suffixes d'etat $bornes = extraire_bornes($intervalle, true); @@ -248,8 +265,10 @@ function compiler_branches_spip($intervalle) { $bornes['max']['incluse'] = true; } // On les nettoie des suffixes d'etat - $borne_inf = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1',$bornes['min']['valeur'])); - $borne_sup = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1',$bornes['max']['valeur'])); + $borne_inf = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1', + $bornes['min']['valeur'])); + $borne_sup = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1', + $bornes['max']['valeur'])); // On determine les branches inf et sup issues du phrasage de l'intervalle // -- on initialise la branche inf de l'intervalle que l'on va preciser ensuite @@ -257,18 +276,19 @@ function compiler_branches_spip($intervalle) { $branche_inf = $t[0] . '.' . $t[1]; // -- pour eviter toutes erreur fatale on verifie que la branche est bien dans la liste des possibles // -- -> si non, on renvoie vide - if (!in_array($branche_inf, $liste_branches_spip)) + if (!in_array($branche_inf, $liste_branches_spip)) { return ''; + } // -- on complete la borne inf de l'intervalle de x.y en x.y.z et on determine la vraie branche if (!isset($t[2]) or !$t[2]) { - if ($bornes['min']['incluse']) + if ($bornes['min']['incluse']) { $borne_inf = $infos_branches_spip[$branche_inf][0]; - else { + } else { $branche_inf = $liste_branches_spip[array_search($branche_inf, $liste_branches_spip)+1]; $borne_inf = $infos_branches_spip[$branche_inf][0]; } } - + // -- on initialise la branche sup de l'intervalle que l'on va preciser ensuite $t = explode('.', $borne_sup); // des gens mettent juste * (pas glop) @@ -276,13 +296,14 @@ function compiler_branches_spip($intervalle) { // -- pour eviter toutes erreur fatale on verifie que la branche est bien dans la liste des possibles // -- -> si non, on renvoie vide - if (!in_array($branche_sup, $liste_branches_spip)) + if (!in_array($branche_sup, $liste_branches_spip)) { return ''; + } // -- on complete la borne sup de l'intervalle de x.y en x.y.z et on determine la vraie branche if (!isset($t[2]) or !$t[2]) { - if ($bornes['max']['incluse']) + if ($bornes['max']['incluse']) { $borne_sup = $infos_branches_spip[$branche_sup][1]; - else { + } else { $branche_sup = $liste_branches_spip[array_search($branche_sup, $liste_branches_spip)-1]; $borne_sup = $infos_branches_spip[$branche_sup][1]; } @@ -290,8 +311,9 @@ function compiler_branches_spip($intervalle) { // -- on verifie que les bornes sont bien dans l'ordre : // -> sinon on retourne la branche sup uniquement - if (spip_version_compare($borne_inf, $borne_sup, '>=')) + if (spip_version_compare($borne_inf, $borne_sup, '>=')) { return $branche_sup; + } // A ce stade, on a un intervalle ferme en bornes ou en branches // Il suffit de trouver les branches qui y sont incluses, sachant que les branches inf et sup @@ -308,24 +330,28 @@ function compiler_branches_spip($intervalle) { /** - * Transforme un texte écrit en entités HTML, dans le charset du site + * Transforme un texte écrit en entités HTML, dans le charset du site * * @param string $texte * Texte avec des entités HTML * @param string $charset * @return string $texte * Texte dans le charset du site -**/ + **/ function entite2charset($texte, $charset = null) { - if (!strlen($texte)) return ''; - if (!$charset) + if (!strlen($texte)) { + return ''; + } + if (!$charset) { $charset = $GLOBALS['meta']['charset']; + } include_spip('inc/charsets'); + return unicode2charset(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\1', $texte), ENT_NOQUOTES, $charset)); } /** - * Teste si 2 balises XML sont identiques + * Teste si 2 balises XML sont identiques * * @param array|string $balise1 * Balise à comparer @@ -333,20 +359,23 @@ function entite2charset($texte, $charset = null) { * Balise à comparer * @return bool * True si elles sont identiques, false sinon. -**/ + **/ function balise_identique($balise1, $balise2) { if (is_array($balise1)) { - foreach ($balise1 as $_attribut1 => $_valeur1){ - if (!array_key_exists($_attribut1, $balise2)) + foreach ($balise1 as $_attribut1 => $_valeur1) { + if (!array_key_exists($_attribut1, $balise2)) { return false; - else - if ($_valeur1 != $balise2[$_attribut1]) + } else { + if ($_valeur1 != $balise2[$_attribut1]) { return false; + } + } } + return true; - } - else + } else { return ($balise1 == $balise2); + } } @@ -375,30 +404,35 @@ function definir_licence($prefixe, $nom, $suffixe, $version) { $suffixe = strtolower($suffixe); if (((trim($prefixe) == 'creative common') AND ($nom == 'attribution')) - OR (($prefixe == 'cc') AND ($nom == 'by'))) + OR (($prefixe == 'cc') AND ($nom == 'by')) + ) { $nom = 'ccby'; + } if (array_key_exists($nom, $licences_plugin)) { if (!$licences_plugin[$nom]['versions']) { // La licence n'est pas versionnee : on affecte donc directement le nom et l'url $licence['nom'] = $licences_plugin[$nom]['nom']; $licence['url'] = $licences_plugin[$nom]['url']; - } - else { + } else { // Si la version est pas bonne on prend la plus recente - if (!$version OR !in_array($version, $licences_plugin[$nom]['versions'], true)) + if (!$version OR !in_array($version, $licences_plugin[$nom]['versions'], true)) { $version = $licences_plugin[$nom]['versions'][0]; - if (is_array($licences_plugin[$nom]['nom'])) + } + if (is_array($licences_plugin[$nom]['nom'])) { $licence['nom'] = $licences_plugin[$nom]['nom'][$version]; - else + } else { $licence['nom'] = str_replace('@version@', $version, $licences_plugin[$nom]['nom']); + } $licence['url'] = str_replace('@version@', $version, $licences_plugin[$nom]['url']); if ($nom == 'ccby') { - if ($suffixe == '-sharealike') + if ($suffixe == '-sharealike') { $suffixe = '-sa'; - if (!$suffixe OR !in_array($suffixe, $licences_plugin[$nom]['suffixes'], true)) + } + if (!$suffixe OR !in_array($suffixe, $licences_plugin[$nom]['suffixes'], true)) { $suffixe = ''; + } $licence['nom'] = str_replace('@suffixe@', strtoupper($suffixe), $licence['nom']); $licence['url'] = str_replace('@suffixe@', $suffixe, $licence['url']); } @@ -409,34 +443,35 @@ function definir_licence($prefixe, $nom, $suffixe, $version) { } /** - * Liste les librairies présentes + * Liste les librairies présentes * * Cherche des librairie dans tous les dossiers 'lib' présents dans chaque * chemin déclaré (plugins, squelettes, SPIP). Un répertoire dans un dossier * 'lib' est considéré comme une librairie, et le nom de ce répertoire est * utilisé comme nom de la librairie. - * + * * @return array * Tableau de couples (nom de la librairie => répertoire de la librairie) -**/ + **/ function svp_lister_librairies() { $libs = array(); foreach (array_reverse(creer_chemin()) as $d) { - if (is_dir($dir = $d.'lib/') AND $t = @opendir($dir)) { + if (is_dir($dir = $d . 'lib/') AND $t = @opendir($dir)) { while (($f = readdir($t)) !== false) { - if ($f[0] != '.' AND is_dir("$dir/$f")) + if ($f[0] != '.' AND is_dir("$dir/$f")) { $libs[$f] = $dir; + } } } } + return $libs; } - /** * Retourne '00x.00y.00z' à partir de 'x.y.z' - * + * * Retourne la chaine de la version x.y.z sous une forme normalisée * permettant le tri naturel. On complète à gauche d'un nombre de zéro * manquant pour aller à 3 caractères entre chaque point. @@ -446,7 +481,7 @@ function svp_lister_librairies() { * Numéro de version dénormalisée * @return string * Numéro de version normalisée -**/ + **/ function normaliser_version($version = '') { $version_normalisee = ''; @@ -454,12 +489,13 @@ function normaliser_version($version = '') { if (preg_match(',([0-9.]+)[\s-.]?(dev|alpha|a|beta|b|rc|pl|p)?,i', $version, $matches)) { if (isset($matches[1]) and $matches[1]) { $v = explode('.', $matches[1]); - foreach($v as $_nombre) { + foreach ($v as $_nombre) { $vn[] = str_pad($_nombre, 3, '0', STR_PAD_LEFT); } $version_normalisee = implode('.', $vn); - if (isset($matches[2]) and $matches[2]) - $version_normalisee = $version_normalisee . '-' . $matches[2]; + if (isset($matches[2]) and $matches[2]) { + $version_normalisee = $version_normalisee . '-' . $matches[2]; + } } } diff --git a/inc/svp_phraser.php b/inc/svp_phraser.php index 29b826c..23f69f0 100644 --- a/inc/svp_phraser.php +++ b/inc/svp_phraser.php @@ -3,13 +3,15 @@ /** * Fichier permettant de phraser les XML des fichiers paquet.xml et plugin.xml * ainsi que des fichiers décrivant le contenu d'un dépot de paquets. - * + * * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Plugins -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} include_spip('inc/xml'); include_spip('inc/config'); @@ -21,7 +23,9 @@ if (!defined('_SVP_MODE_RUNTIME')) { * - En mode runtime (true), on ne charge que les plugins compatibles avec la version courante * - En mode non runtime (false) on charge tous les plugins : cas du site Plugins SPIP * Runtime est le mode par defaut - * @var bool */ + * + * @var bool + */ define('_SVP_MODE_RUNTIME', false); } else { define('_SVP_MODE_RUNTIME', (lire_config('svp/mode_runtime', 'oui') == 'oui' ? true : false)); @@ -31,9 +35,9 @@ if (!defined('_SVP_MODE_RUNTIME')) { // Type parseur XML à appliquer pour récupérer les infos du plugin /** @var string Phraseur à utiliser pour un XML de plugin.xml */ -define('_SVP_DTD_PLUGIN', 'plugin'); +define('_SVP_DTD_PLUGIN', 'plugin'); /** @var string Phraseur à utiliser pour un XML de paquet.xml */ -define('_SVP_DTD_PAQUET', 'paquet'); +define('_SVP_DTD_PAQUET', 'paquet'); // Regexp de recherche des balises principales de archives.xml define('_SVP_REGEXP_BALISE_DEPOT', '#]*>(.*)#Uims'); @@ -67,26 +71,39 @@ $GLOBALS['categories_plugin'] = array( /** Liste des balises techniques autorisées dans la balise */ $GLOBALS['balises_techniques'] = array( - 'menu', 'chemin', 'lib', 'necessite', 'onglet', 'procure', 'pipeline', 'utilise', - 'options', 'fonctions', 'install'); + 'menu', + 'chemin', + 'lib', + 'necessite', + 'onglet', + 'procure', + 'pipeline', + 'utilise', + 'options', + 'fonctions', + 'install' +); # define('_BALISES_TECHNIQUES', serialize($balises_techniques)); - + /** Liste des balises autorisant une traduction */ $GLOBALS['balises_multis'] = array( - 'nom', 'slogan', 'description'); + 'nom', + 'slogan', + 'description' +); # define('_BALISES_MULTIS', serialize($balises_multis)); /** * Phrase un fichier décrivant un dépot, dont le chemin local est donné - * + * * Le fichier est au format XML et contient deux balises principales : * - ... : informations de description du depot (facultatif) * - ... : liste des informations sur chaque archive (obligatoire) * * La fonction met en cache le résultat du phrasage de chaque archive et ne * rephrase que les archives ayant changées. - * + * * @uses svp_aplatir_balises() * @uses svp_phraser_archives() * @param string $fichier_xml @@ -95,20 +112,22 @@ $GLOBALS['balises_multis'] = array( * false si erreur, * Tableau de 2 index sinon : * - depot : description du dépot - * - paquets : + * - paquets : */ function svp_phraser_depot($fichier_xml) { // le fichier xml fournit sous forme de fichier - lire_fichier($fichier_xml,$xml); + lire_fichier($fichier_xml, $xml); // Initialisation du tableau des informations // -- Si aucun bloc depot n'est trouve le titre et le type prennent une valeur par defaut $infos = array( - 'depot' => array( - 'titre' => _T('svp:titre_nouveau_depot'), - 'type' => 'manuel'), - 'paquets' => array()); + 'depot' => array( + 'titre' => _T('svp:titre_nouveau_depot'), + 'type' => 'manuel' + ), + 'paquets' => array() + ); // Extraction et phrasage du bloc depot si il existe @@ -124,22 +143,26 @@ function svp_phraser_depot($fichier_xml) { // -- Le bloc peut etre une chaine de grande taille et provoquer une erreur // sur une recherche de regexp. On ne teste donc pas l'existence de cette balise // -- Si aucun bloc c'est aussi une erreur - if (!preg_match_all(_SVP_REGEXP_BALISE_ARCHIVE, $xml, $matches)) + if (!preg_match_all(_SVP_REGEXP_BALISE_ARCHIVE, $xml, $matches)) { return false; + } // lire le cache des md5 pour ne parser que ce qui a change $fichier_xml_md5 = $fichier_xml . ".md5.txt"; - lire_fichier($fichier_xml_md5,$cache_md5); + lire_fichier($fichier_xml_md5, $cache_md5); if (!$cache_md5 - OR !$cache_md5 = unserialize($cache_md5)) + OR !$cache_md5 = unserialize($cache_md5) + ) { $cache_md5 = array(); + } $infos['paquets'] = svp_phraser_archives($matches[0], $cache_md5); - ecrire_fichier($fichier_xml_md5,serialize($cache_md5)); + ecrire_fichier($fichier_xml_md5, serialize($cache_md5)); // -- Si aucun paquet extrait c'est aussi une erreur - if (!$infos['paquets']) + if (!$infos['paquets']) { return false; + } return $infos; } @@ -171,36 +194,38 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { $seen = array(); $paquets = array(); - $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code']; + $version_spip = $GLOBALS['spip_version_branche'] . "." . $GLOBALS['spip_version_code']; // On verifie qu'il existe au moins une archive - if (!$archives) + if (!$archives) { return $paquets; + } // On phrase chacune des archives // Seul le bloc est obligatoire - foreach ($archives as $_cle => $_archive){ + foreach ($archives as $_cle => $_archive) { // quand version spip ou mode runtime changent, // il faut mettre le xml a jour pour voir les plugins compatibles ou non - $md5 = md5($_archive.":$version_spip:"._SVP_MODE_RUNTIME); - if (isset($md5_cache[$md5])){ - if (is_array($p=$md5_cache[$md5])) - $paquets[$p['file']] = $p; // ce paquet est connu + $md5 = md5($_archive . ":$version_spip:" . _SVP_MODE_RUNTIME); + if (isset($md5_cache[$md5])) { + if (is_array($p = $md5_cache[$md5])) { + $paquets[$p['file']] = $p; + } // ce paquet est connu $seen[] = $md5; - } - elseif (preg_match(_SVP_REGEXP_BALISE_ZIP, $_archive, $matches)) { + } elseif (preg_match(_SVP_REGEXP_BALISE_ZIP, $_archive, $matches)) { // Extraction de la balise $zip = svp_phraser_zip($matches[1]); if ($zip) { - + // Extraction de la balise traductions $traductions = array(); - if (preg_match(_SVP_REGEXP_BALISE_TRADUCTIONS, $_archive, $matches)) + if (preg_match(_SVP_REGEXP_BALISE_TRADUCTIONS, $_archive, $matches)) { $traductions = svp_phraser_traductions($matches[1]); + } + - // La balise peut posseder un attribut qui precise la DTD utilisee pour les plugins (plugin ou paquet) // Sinon, c'est la DTD plugin qui est utilisee list($tag, $attributs) = spip_xml_decompose_tag($_archive); @@ -210,12 +235,14 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { // Extraction *des balises* plugin ou *de la balise* paquet suivant la DTD et la version SPIP // -- DTD : si on utilise plugin.xml on extrait la balise sinon la balise $xml = svp_phraser_plugin($dtd, $_archive); - + // Si on est en mode runtime, on est seulement interesse par les plugins compatibles avec // la version courant de SPIP. On ne stocke donc pas les autres plugins. // Si on est pas en mode runtime on prend tout ! if (!_SVP_MODE_RUNTIME - OR (_SVP_MODE_RUNTIME AND isset($xml['compatibilite']) AND plugin_version_compatible($xml['compatibilite'], $version_spip, 'spip'))) { + OR (_SVP_MODE_RUNTIME AND isset($xml['compatibilite']) AND plugin_version_compatible($xml['compatibilite'], + $version_spip, 'spip')) + ) { $paquets[$zip['file']] = $zip; $paquets[$zip['file']]['traductions'] = $traductions; $paquets[$zip['file']]['dtd'] = $dtd; @@ -223,8 +250,7 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { $paquets[$zip['file']]['md5'] = $md5; $md5_cache[$md5] = $paquets[$zip['file']]; $seen[] = $md5; - } - else{ + } else { $md5_cache[$md5] = $zip['file']; $seen[] = $md5; } @@ -233,8 +259,8 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { } // supprimer du cache les zip qui ne sont pas dans le nouveau $archives - $oldies = array_diff(array_keys($md5_cache),$seen); - foreach ($oldies as $old_md5){ + $oldies = array_diff(array_keys($md5_cache), $seen); + foreach ($oldies as $old_md5) { unset($md5_cache[$old_md5]); } @@ -242,7 +268,6 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { } - /** * Phrase le contenu du XML décrivant une archive suivant une DTD * de plugin.xml ou de paquet.xml donnée @@ -252,23 +277,23 @@ function svp_phraser_archives($archives, &$md5_cache = array()) { * les traductions du nom, slogan et description * * @uses svp_aplatir_balises() - * + * * @global $balises_multis * @static array $informer - * + * * @param string $dtd * Nom du type de dtd : plugin ou paquet (pour phraser un plugin.xml ou un paquet.xml) * @param string $contenu * Contenu XML à phraser * @return array * Description du plugin -**/ + **/ function svp_phraser_plugin($dtd, $contenu) { global $balises_multis; static $informer = array(); - + $plugin = array(); - + // On initialise les informations du plugin avec le contenu du plugin.xml ou paquet.xml $regexp = ($dtd == 'plugin') ? _SVP_REGEXP_BALISE_PLUGIN : _SVP_REGEXP_BALISE_PAQUET; if ($nb_balises = preg_match_all($regexp, $contenu, $matches)) { @@ -288,20 +313,23 @@ function svp_phraser_plugin($dtd, $contenu) { // -- sinon on arrange la structure pour deplacer le contenu des balises dites techniques dans un sous tableau // d'index 0 par similitude avec la structure fusionnee $fusionner = charger_fonction('fusion_' . $dtd, 'plugins'); - if ($dtd == 'plugin') + if ($dtd == 'plugin') { $plugin = $fusionner($plugins); - else + } else { $plugin = $fusionner($plugins[0]); + } // Pour la DTD paquet, les traductions du nom, slogan et description sont compilees dans une balise // du fichier archives.xml. Il faut donc completer les informations precedentes avec cette balise if (($dtd == _SVP_DTD_PAQUET) AND (preg_match(_SVP_REGEXP_BALISE_MULTIS, $contenu, $matches))) { $multis = array(); - if (is_array($arbre = spip_xml_parse($matches[1]))) + if (is_array($arbre = spip_xml_parse($matches[1]))) { $multis = svp_aplatir_balises($balises_multis, $arbre); + } // Le nom peut etre traduit ou pas, il faut donc le tester - if ($multis['nom']) + if ($multis['nom']) { $plugin['nom'] = $multis['nom']; + } // Slogan et description sont forcement des items de langue $plugin['slogan'] = $multis['slogan']; $plugin['description'] = $multis['description']; @@ -316,9 +344,9 @@ function svp_phraser_plugin($dtd, $contenu) { * Phrase le contenu de la balise * * Extrait du XML les informations du zip - * + * * @uses svp_aplatir_balises() - * + * * @param string $contenu * Description XML de l'archive * @return array @@ -331,10 +359,11 @@ function svp_phraser_plugin($dtd, $contenu) { */ function svp_phraser_zip($contenu) { static $balises_zip = array('file', 'size', 'date', 'source', 'last_commit'); - + $zip = array(); - if (is_array($arbre = spip_xml_parse($contenu))) + if (is_array($arbre = spip_xml_parse($contenu))) { $zip = svp_aplatir_balises($balises_zip, $arbre); + } return $zip; } @@ -355,15 +384,15 @@ function svp_phraser_zip($contenu) { * l'ensemble des traducteurs pour chacune des langues présentes */ function svp_phraser_traductions($contenu) { - + $traductions = array(); if (is_array($arbre = spip_xml_parse($contenu))) { foreach ($arbre as $_tag => $_langues) { // On commence par les balises et leurs attributs list($tag, $attributs_traduction) = spip_xml_decompose_tag($_tag); $traductions[$attributs_traduction['module']]['reference'] = $attributs_traduction['reference']; - $traductions[$attributs_traduction['module']]['gestionnaire'] = isset($attributs_traduction['gestionnaire']) ? $attributs_traduction['gestionnaire'] : '' ; - + $traductions[$attributs_traduction['module']]['gestionnaire'] = isset($attributs_traduction['gestionnaire']) ? $attributs_traduction['gestionnaire'] : ''; + // On continue par les balises qui donnent le code en attribut // et les balises qui donnent uniquement le nom en attribut if (is_array($_langues[0])) { @@ -388,11 +417,11 @@ function svp_phraser_traductions($contenu) { /** * Aplatit plusieurs clés d'un arbre xml dans un tableau - * + * * Effectue un trim() de la valeur trouvée dans l'arbre * * @uses spip_xml_aplatit() - * + * * @param array $balises * Liste de noms de balises XML. * Peut aussi être un tableau indiquant un renommage d'une balise @@ -414,20 +443,23 @@ function svp_phraser_traductions($contenu) { function svp_aplatir_balises($balises, $arbre_xml, $mode = 'vide_et_nonvide', $tableau_initial = array()) { $tableau_aplati = array(); - if (!$balises) + if (!$balises) { return $tableau_initial; + } - foreach ($balises as $_cle => $_valeur){ + foreach ($balises as $_cle => $_valeur) { $tag = (is_string($_cle)) ? $_cle : $_valeur; $valeur_aplatie = ''; if (isset($arbre_xml[$tag])) { $valeur_aplatie = trim(spip_xml_aplatit($arbre_xml[$tag])); } if (($mode == 'vide_et_nonvide') - OR (($mode == 'nonvide') AND $valeur_aplatie)) + OR (($mode == 'nonvide') AND $valeur_aplatie) + ) { $tableau_aplati[$_valeur] = $valeur_aplatie; - else + } else { $tableau_aplati[$_valeur] = isset($tableau_initial[$_valeur]) ? $tableau_initial[$_valeur] : ''; + } } return $tableau_aplati; diff --git a/inc/svp_rechercher.php b/inc/svp_rechercher.php index 68a6543..094ddd7 100644 --- a/inc/svp_rechercher.php +++ b/inc/svp_rechercher.php @@ -6,9 +6,11 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Recherche -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} include_spip('inc/plugin'); // ----------------------- Recherches de plugins --------------------------------- @@ -25,7 +27,7 @@ include_spip('inc/plugin'); * * @uses liste_des_champs() * @uses recherche_en_base() - * + * * @param string $phrase * Texte de la recherche * @param string $categorie @@ -46,18 +48,26 @@ include_spip('inc/plugin'); * ou seulement la plus récente (false) ? * @param string $tri * Ordre du tri : nom | score - * + * * @return array * Tableau classé par pertinence de résultat * - 'prefixe' => tableau de description du paquet (si pas de doublons demandé) * - n => tableau de descriptions du paquet (si doublons autorisés) -**/ -function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $version_spip = '', - $exclusions=array(), $afficher_exclusions=false, $doublon=false, $tri='nom') -{ + **/ +function svp_rechercher_plugins_spip( + $phrase, + $categorie, + $etat, + $depot, + $version_spip = '', + $exclusions = array(), + $afficher_exclusions = false, + $doublon = false, + $tri = 'nom' +) { include_spip('inc/rechercher'); - + $plugins = array(); $scores = array(); $ids_paquets = array(); @@ -68,7 +78,7 @@ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $versio $liste = liste_des_champs(); $tables = array('plugin' => $liste['plugin']); $options = array('jointures' => true, 'score' => true); - + // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui // correspondent a la phrase recherchee // -- On obtient une liste d'id de plugins et d'id de paquets @@ -97,19 +107,18 @@ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $versio if (array_search($id_paquet, $ids_paquets) === false) { $ids_paquets[] = $id_paquet; $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']); - } - else { - $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score']) - + intval($resultats['plugin'][$id_plugin]['score']); + } else { + $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score']) + +intval($resultats['plugin'][$id_plugin]['score']); } } } - } - else { + } else { if ($ids_paquets = sql_allfetsel('id_paquet', 'spip_paquets')) { $ids_paquets = array_map('reset', $ids_paquets); - foreach ($ids_paquets as $_id) + foreach ($ids_paquets as $_id) { $scores[$_id] = 0; + } } } @@ -119,24 +128,40 @@ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $versio // -- Preparation de la requete if ($ids_paquets) { $from = array('spip_plugins AS t1', 'spip_paquets AS t2', 'spip_depots AS t3'); - $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe', 't1.id_plugin AS id_plugin', - 't2.id_paquet AS id_paquet', 't2.description AS description', 't2.compatibilite_spip AS compatibilite_spip', - 't2.lien_doc AS lien_doc', - 't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat', - 't2.logo AS logo', 't2.version AS version', 't2.nom_archive AS nom_archive', - 't3.url_archives AS url_archives', ); + $select = array( + 't1.nom AS nom', + 't1.slogan AS slogan', + 't1.prefixe AS prefixe', + 't1.id_plugin AS id_plugin', + 't2.id_paquet AS id_paquet', + 't2.description AS description', + 't2.compatibilite_spip AS compatibilite_spip', + 't2.lien_doc AS lien_doc', + 't2.auteur AS auteur', + 't2.licence AS licence', + 't2.etat AS etat', + 't2.logo AS logo', + 't2.version AS version', + 't2.nom_archive AS nom_archive', + 't3.url_archives AS url_archives', + ); $where = array('t1.id_plugin=t2.id_plugin', 't2.id_depot=t3.id_depot'); - if ($ids_paquets) + if ($ids_paquets) { $where[] = sql_in('t2.id_paquet', $ids_paquets); - if (($categorie) AND ($categorie != 'toute_categorie')) + } + if (($categorie) AND ($categorie != 'toute_categorie')) { $where[] = 't1.categorie=' . sql_quote($categorie); - if (($etat) AND ($etat != 'tout_etat')) + } + if (($etat) AND ($etat != 'tout_etat')) { $where[] = 't2.etat=' . sql_quote($etat); - if (($depot) AND ($depot != 'tout_depot')) + } + if (($depot) AND ($depot != 'tout_depot')) { $where[] = 't2.id_depot=' . sql_quote($depot); - if ($exclusions AND !$afficher_exclusions) + } + if ($exclusions AND !$afficher_exclusions) { $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT'); - + } + if ($resultats = sql_select($select, $from, $where)) { while ($paquets = sql_fetch($resultats)) { $prefixe = $paquets['prefixe']; @@ -151,43 +176,47 @@ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $versio $paquets['slogan'] = $slogan; $paquets['description'] = $description; // -- on ajoute le score si on a bien saisi une phrase - if ($phrase) + if ($phrase) { $paquets['score'] = $scores[intval($paquets['id_paquet'])]; - else + } else { $paquets['score'] = 0; + } // -- on construit l'url de l'archive $paquets['url_archive'] = $paquets['url_archives'] . '/' . $paquets['nom_archive']; // -- on gere les exclusions si elle doivent etre affichees - if ($afficher_exclusions AND in_array($paquets['id_plugin'], $exclusions)) + if ($afficher_exclusions AND in_array($paquets['id_plugin'], $exclusions)) { $paquets['installe'] = true; - else + } else { $paquets['installe'] = false; + } // -- On traite les doublons (meme plugin, versions differentes) - if ($doublon) - // ajout systematique du paquet + if ($doublon) // ajout systematique du paquet + { $plugins[] = $paquets; - else { + } else { // ajout // - si pas encore trouve // - ou si sa version est inferieure (on garde que la derniere version) if (!isset($plugins[$prefixe]) - OR !$plugins[$prefixe] - OR ($plugins[$prefixe] AND spip_version_compare($plugins[$prefixe]['version'], $version, '<'))) { + OR !$plugins[$prefixe] + OR ($plugins[$prefixe] AND spip_version_compare($plugins[$prefixe]['version'], $version, '<')) + ) { $plugins[$prefixe] = $paquets; } } } } } - + // On trie le tableau par score décroissant ou nom croissant $fonction = 'svp_trier_par_' . $tri; - if ($doublon) + if ($doublon) { usort($plugins, $fonction); - else + } else { uasort($plugins, $fonction); + } } - + return $plugins; } @@ -199,7 +228,7 @@ function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $versio * @return array * Liste d'identifiants de plugins */ -function svp_lister_plugins_installes(){ +function svp_lister_plugins_installes() { $ids = array(); @@ -233,15 +262,17 @@ function svp_lister_plugins_installes(){ * true si l'intervalle est compatible, false sinon */ function svp_verifier_compatibilite_spip($intervalle, $version_spip = '') { - if (!$version_spip) - $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code']; - return plugin_version_compatible($intervalle, $version_spip,'spip'); + if (!$version_spip) { + $version_spip = $GLOBALS['spip_version_branche'] . "." . $GLOBALS['spip_version_code']; + } + + return plugin_version_compatible($intervalle, $version_spip, 'spip'); } /** * Callback de tri pour trier les résultats de plugin par score décroissant. - * + * * Cette fonction est appelée par un usort ou uasort * * @param array $p1 @@ -250,19 +281,21 @@ function svp_verifier_compatibilite_spip($intervalle, $version_spip = '') { * Plugin à comparer * @return int */ -function svp_trier_par_score($p1, $p2){ - if ($p1['score'] == $p2['score']) +function svp_trier_par_score($p1, $p2) { + if ($p1['score'] == $p2['score']) { $retour = 0; - else + } else { $retour = ($p1['score'] < $p2['score']) ? 1 : -1; + } + return $retour; } - /** +/** * Callback de tri pour trier les résultats de plugin par nom (alphabétique). * - * Si le nom est identique on classe par version decroissante + * Si le nom est identique on classe par version decroissante * Cette fonction est appelée par un usort ou uasort * * @param array $p1 @@ -271,14 +304,15 @@ function svp_trier_par_score($p1, $p2){ * Plugin à comparer * @return int */ -function svp_trier_par_nom($p1, $p2){ +function svp_trier_par_nom($p1, $p2) { $c1 = strcasecmp($p1['nom'], $p2['nom']); if ($c1 == 0) { $c2 = spip_version_compare($p1['version'], $p1['version'], '<'); $retour = ($c2) ? 1 : -1; - } - else + } else { $retour = ($c1 < 0) ? -1 : 1; + } + return $retour; } diff --git a/inc/where_compatible_spip.php b/inc/where_compatible_spip.php index e08b0c7..0eb036e 100644 --- a/inc/where_compatible_spip.php +++ b/inc/where_compatible_spip.php @@ -6,16 +6,18 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Recherche -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Construit le WHERE d'une requête SQL de selection des plugins ou paquets * compatibles avec une version ou une branche de spip. - * + * * Cette fonction est appelée par le critère {compatible_spip} - * + * * @used-by svp_compter() * @used-by critere_compatible_spip_dist() * @@ -35,33 +37,32 @@ function inc_where_compatible_spip($version = '', $table, $op) { $min = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', 1)'; $max = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', -1)'; - $where = 'CASE WHEN '.$min.' = \'\' - OR '.$min.' = \'[\' - THEN \'1.9.0\' <= \''.$version.'\' - ELSE TRIM(LEADING \'[\' FROM '.$min.') <= \''.$version.'\' + $where = 'CASE WHEN ' . $min . ' = \'\' + OR ' . $min . ' = \'[\' + THEN \'1.9.0\' <= \'' . $version . '\' + ELSE TRIM(LEADING \'[\' FROM ' . $min . ') <= \'' . $version . '\' END AND - CASE WHEN '.$max.' = \'\' - OR '.$max.' = \']\' - THEN \'99.99.99\' >= \''.$version.'\' - WHEN '.$max.' = \')\' - OR '.$max.' = \'[\' - THEN \'99.99.99\' > \''.$version.'\' - WHEN RIGHT('.$max.', 1) = \')\' - OR RIGHT('.$max.', 1) = \'[\' - THEN LEFT('.$max.', LENGTH('.$max.') - 1) > \''.$version.'\' - ELSE LEFT('.$max.', LENGTH('.$max.') - 1) >= \''.$version.'\' + CASE WHEN ' . $max . ' = \'\' + OR ' . $max . ' = \']\' + THEN \'99.99.99\' >= \'' . $version . '\' + WHEN ' . $max . ' = \')\' + OR ' . $max . ' = \'[\' + THEN \'99.99.99\' > \'' . $version . '\' + WHEN RIGHT(' . $max . ', 1) = \')\' + OR RIGHT(' . $max . ', 1) = \'[\' + THEN LEFT(' . $max . ', LENGTH(' . $max . ') - 1) > \'' . $version . '\' + ELSE LEFT(' . $max . ', LENGTH(' . $max . ') - 1) >= \'' . $version . '\' END'; - } - // le critere s'applique a une BRANCHE (1.9, 2.0, ...) + } // le critere s'applique a une BRANCHE (1.9, 2.0, ...) elseif (count(explode('.', $version)) == 2) { - $where = 'LOCATE(\''.$version.'\', '.$table.'.branches_spip) '.$op.' 0'; - } - // le critere est vide ou mal specifie + $where = 'LOCATE(\'' . $version . '\', ' . $table . '.branches_spip) ' . $op . ' 0'; + } // le critere est vide ou mal specifie else { $where = '1=1'; } return $where; } + ?> diff --git a/plugins/fusion_paquet.php b/plugins/fusion_paquet.php index f569d9d..bc0837d 100644 --- a/plugins/fusion_paquet.php +++ b/plugins/fusion_paquet.php @@ -7,9 +7,11 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/plugin'); include_spip('inc/svp_outiller'); @@ -17,10 +19,10 @@ include_spip('inc/svp_outiller'); /** * Fusion des informations de chaque balise spip d'un paquet.xml en * considérant la compatibilité SPIP - * + * * Pour les balises paquets sans balise spip cette fonction permet de générer * une structure identique pour les balises dites techniques - * + * * @param array $plugins * Arbre de description du paquet.xml * @return array @@ -31,8 +33,9 @@ function plugins_fusion_paquet($plugins) { global $balises_techniques; $fusion = array(); - if (!$plugins) + if (!$plugins) { return $fusion; + } // On initialise les informations a retourner avec l'index 0 du tableau qui contient les donnees communes // de la balise paquet @@ -52,16 +55,16 @@ function plugins_fusion_paquet($plugins) { $fusion[$_btech][0] = $balise; } } - } - else { + } else { // Balise spip // On merge les balises techniques existantes en les rangeant dans un sous tableau indexe par // la compatibilite et ce pour chaque balise foreach ($_paquet_spip as $_index => $_balise) { if ($_index AND $_index != 'balise') { $fusion[$_index][$_compatibilite] = $_balise; - if (!isset($fusion[$_index][0])) + if (!isset($fusion[$_index][0])) { $fusion[$_index][0] = array(); + } } } } diff --git a/plugins/fusion_plugin.php b/plugins/fusion_plugin.php index 56ffcec..bde8898 100644 --- a/plugins/fusion_plugin.php +++ b/plugins/fusion_plugin.php @@ -7,26 +7,28 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/plugin'); include_spip('inc/svp_outiller'); /** * Fusion des informations de chaque balise plugin d'un plugin.xml en * considérant la compatibilité SPIP - * + * * Pour les balises plugins uniques cette fonction permet de générer une structure * identique pour les balises dites techniques - * + * * On limite le traitement a deux balises plugins maximum, * ce qui est le cas de tous les plugin.xml actuellement connus * * @uses _SVP_VERSION_SPIP_MIN * @uses extraire_bornes() * @uses fusionner_intervalles() - * + * * @param array $plugins * Arbre des balises plugins présents dans un plugin.xml * @return array @@ -37,8 +39,9 @@ function plugins_fusion_plugin($plugins) { global $balises_techniques; $fusion = array(); - if (!$plugins) + if (!$plugins) { return $fusion; + } if (count($plugins) == 1) { // Balise plugin unique : on ne traite que les balises techniques @@ -48,20 +51,19 @@ function plugins_fusion_plugin($plugins) { $balise = $fusion[$_btech]; unset($fusion[$_btech]); $fusion[$_btech][0] = $balise; - } - else { + } else { $fusion[$_btech] = array(); } } - } - else { + } else { // On initialise les informations a retourner avec le bloc a priori le plus recent determine par la compatibilite SPIP : // On selectionne le bloc dont la borne min de compatibilite SPIP est la plus elevee $cle_min_max = -1; $borne_min_max = _SVP_VERSION_SPIP_MIN; foreach ($plugins as $_cle => $_plugin) { - if (!$_plugin['compatibilite']) + if (!$_plugin['compatibilite']) { $borne_min = _SVP_VERSION_SPIP_MIN; + } $bornes_spip = extraire_bornes($_plugin['compatibilite']); $borne_min = ($bornes_spip['min']['valeur']) ? $bornes_spip['min']['valeur'] : _SVP_VERSION_SPIP_MIN; if (spip_version_compare($borne_min_max, $borne_min, '<=')) { @@ -79,11 +81,13 @@ function plugins_fusion_plugin($plugins) { // -- categorie, logo : si la valeur du bloc selectionne est vide on essaye d'en trouver une non vide dans les autres blocs // -- compatible : on constuit l'intervalle global de compatibilite SPIP // -- necessite, utilise, lib : on construit le tableau par intervalle de compatibilite SPIP - $cle_min_min = ($cle_min_max==0) ? 1 : 0; - if (!$fusion['categorie'] AND $plugins[$cle_min_min]['categorie']) + $cle_min_min = ($cle_min_max == 0) ? 1 : 0; + if (!$fusion['categorie'] AND $plugins[$cle_min_min]['categorie']) { $fusion['categorie'] = $plugins[$cle_min_min]['categorie']; - if ((!isset($fusion['logo']) OR !$fusion['logo']) AND $plugins[$cle_min_min]['logo']) + } + if ((!isset($fusion['logo']) OR !$fusion['logo']) AND $plugins[$cle_min_min]['logo']) { $fusion['logo'] = $plugins[$cle_min_min]['logo']; + } $fusion['compatibilite'] = fusionner_intervalles($fusion['compatibilite'], $plugins[$cle_min_min]['compatibilite']); // necessite, utilise, lib, chemin, pipeline, bouton, onglet : on indexe chaque liste de dependances @@ -92,58 +96,60 @@ function plugins_fusion_plugin($plugins) { if (!isset($fusion[$_btech]) AND !isset($plugins[$cle_min_min][$_btech])) { // Aucun des tableaux ne contient cette balise technique : on la positionne a un array vide $fusion[$_btech] = array(); - } - else if (!isset($fusion[$_btech]) OR !$fusion[$_btech]) { - if ($plugins[$cle_min_min][$_btech]) { - // La balise technique est vide dans le tableau de fusion mais non vide dans la deuxieme balise plugin - // On range cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide - $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']] = $plugins[$cle_min_min][$_btech]; - $fusion[$_btech][0] = array(); - } - } - else if (!isset($plugins[$cle_min_min][$_btech]) OR !$plugins[$cle_min_min][$_btech]) { - // La balise technique est non vide dans le tableau de fusion mais vide dans la deuxieme balise plugin - // On deplace cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide - $balise = $fusion[$_btech]; - unset($fusion[$_btech]); - $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']] = $balise; - $fusion[$_btech][0] = array(); - } - else { - // Les deux tableaux contiennent une balise technique non vide : il faut fusionner cette balise technique ! - // On parcourt le premier tableau (fusion) en verifiant une egalite avec le deuxieme tableau - foreach ($fusion[$_btech] as $_cle0 => $_balise0) { - $balise_commune = false; - foreach ($plugins[$cle_min_min][$_btech] as $_cle1 => $_balise1) { - if (balise_identique($_balise0, $_balise1)) { - // On classe cette balise dans le bloc commun (index 0) et on la supprime dans les - // 2 tableaux en cours de comparaison - unset($fusion[$_btech][$_cle0]); - $fusion[$_btech][0][] = $_balise1; - unset($plugins[$cle_min_min][$_btech][$_cle1]); - $balise_commune = true; - break; - } - } - if (!$balise_commune) { - $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']][] = $_balise0; - unset($fusion[$_btech][$_cle0]); + } else { + if (!isset($fusion[$_btech]) OR !$fusion[$_btech]) { + if ($plugins[$cle_min_min][$_btech]) { + // La balise technique est vide dans le tableau de fusion mais non vide dans la deuxieme balise plugin + // On range cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide + $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']] = $plugins[$cle_min_min][$_btech]; + $fusion[$_btech][0] = array(); } - if (!isset($fusion[$_btech][0])) + } else { + if (!isset($plugins[$cle_min_min][$_btech]) OR !$plugins[$cle_min_min][$_btech]) { + // La balise technique est non vide dans le tableau de fusion mais vide dans la deuxieme balise plugin + // On deplace cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide + $balise = $fusion[$_btech]; + unset($fusion[$_btech]); + $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']] = $balise; $fusion[$_btech][0] = array(); - } + } else { + // Les deux tableaux contiennent une balise technique non vide : il faut fusionner cette balise technique ! + // On parcourt le premier tableau (fusion) en verifiant une egalite avec le deuxieme tableau + foreach ($fusion[$_btech] as $_cle0 => $_balise0) { + $balise_commune = false; + foreach ($plugins[$cle_min_min][$_btech] as $_cle1 => $_balise1) { + if (balise_identique($_balise0, $_balise1)) { + // On classe cette balise dans le bloc commun (index 0) et on la supprime dans les + // 2 tableaux en cours de comparaison + unset($fusion[$_btech][$_cle0]); + $fusion[$_btech][0][] = $_balise1; + unset($plugins[$cle_min_min][$_btech][$_cle1]); + $balise_commune = true; + break; + } + } + if (!$balise_commune) { + $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']][] = $_balise0; + unset($fusion[$_btech][$_cle0]); + } + if (!isset($fusion[$_btech][0])) { + $fusion[$_btech][0] = array(); + } + } - // On traite maintenant les balises restantes du deuxieme tableau - if ($plugins[$cle_min_min][$_btech]) { - foreach ($plugins[$cle_min_min][$_btech] as $_balise2) { - $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']][] = $_balise2; + // On traite maintenant les balises restantes du deuxieme tableau + if ($plugins[$cle_min_min][$_btech]) { + foreach ($plugins[$cle_min_min][$_btech] as $_balise2) { + $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']][] = $_balise2; + } + } } } } } } - + return $fusion; } diff --git a/plugins/preparer_sql_paquet.php b/plugins/preparer_sql_paquet.php index ff619a0..98ae1ae 100644 --- a/plugins/preparer_sql_paquet.php +++ b/plugins/preparer_sql_paquet.php @@ -7,68 +7,68 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Plugins -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Pour une description de plugin donnée (issue de la dtd de paquet.xml), - * prépare les données à installer en bdd + * prépare les données à installer en bdd * * Les données sont parfois sérialisées, parfois compilées * pour tenir compte des spécificités de cette DTD et du stockage en bdd. - * + * * @param array $plugin * Description de plugin * @return array * Couples clés => valeurs de description du paquet -**/ -function plugins_preparer_sql_paquet($plugin) -{ + **/ +function plugins_preparer_sql_paquet($plugin) { include_spip('inc/svp_outiller'); $champs = array(); - if (!$plugin) + if (!$plugin) { return $champs; + } // On initialise les champs ne necessitant aucune transformation foreach (array( - 'categorie' => 'categorie', - 'etat' => 'etat', - 'version_base' => 'schema', - 'logo' => 'logo', - 'lien_doc' => 'documentation', - 'lien_demo' => 'demonstration', - 'lien_dev' => 'developpement' - ) as $cle_champ => $cle_plugin) - { - $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) + 'categorie' => 'categorie', + 'etat' => 'etat', + 'version_base' => 'schema', + 'logo' => 'logo', + 'lien_doc' => 'documentation', + 'lien_demo' => 'demonstration', + 'lien_dev' => 'developpement' + ) as $cle_champ => $cle_plugin) { + $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) ? $plugin[$cle_plugin] : ''; } // on normalise la version 1.3.12 => 001.003.012 $champs['version'] = (isset($plugin['version']) AND $plugin['version']) - ? normaliser_version($plugin['version']) - : ''; + ? normaliser_version($plugin['version']) + : ''; // On passe le prefixe en lettres majuscules comme ce qui est fait dans SPIP // Ainsi les valeurs dans la table spip_plugins coincideront avec celles de la meta plugin $champs['prefixe'] = strtoupper($plugin['prefix']); // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP) - static $num = array('stable'=>4, 'test'=>3, 'dev'=>2, 'experimental'=>1); + static $num = array('stable' => 4, 'test' => 3, 'dev' => 2, 'experimental' => 1); $champs['etatnum'] = isset($num[$plugin['etat']]) ? $num[$plugin['etat']] : 0; // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html foreach (array( - 'nom' => 'nom', - 'description' => 'description', - 'slogan' => 'slogan' - ) as $cle_champ => $cle_plugin) - { - $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) - ? entite2charset($plugin[$cle_plugin],'utf-8') + 'nom' => 'nom', + 'description' => 'description', + 'slogan' => 'slogan' + ) as $cle_champ => $cle_plugin) { + $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) + ? entite2charset($plugin[$cle_plugin], 'utf-8') : ''; } @@ -76,39 +76,39 @@ function plugins_preparer_sql_paquet($plugin) // Tags : liste de mots-cles // Traitement des auteurs, credits, licences et copyright foreach (array( - 'tags' => 'tags', - 'auteur' => 'auteur', - 'credit' => 'credit', - 'licence' => 'licence', - 'copyright' => 'copyright', - ) as $cle_champ => $cle_plugin) - { - $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) + 'tags' => 'tags', + 'auteur' => 'auteur', + 'credit' => 'credit', + 'licence' => 'licence', + 'copyright' => 'copyright', + ) as $cle_champ => $cle_plugin) { + $champs[$cle_champ] = (isset($plugin[$cle_plugin]) and $plugin[$cle_plugin]) ? serialize($plugin[$cle_plugin]) : ''; } // Extraction de la compatibilite SPIP et construction de la liste des branches spip supportees $champs['compatibilite_spip'] = (isset($plugin['compatibilite']) AND $plugin['compatibilite']) - ? $plugin['compatibilite'] - : ''; - $champs['branches_spip'] = (isset($plugin['compatibilite']) AND $plugin['compatibilite']) - ? compiler_branches_spip($plugin['compatibilite']) - : ''; - + ? $plugin['compatibilite'] + : ''; + $champs['branches_spip'] = (isset($plugin['compatibilite']) AND $plugin['compatibilite']) + ? compiler_branches_spip($plugin['compatibilite']) + : ''; + // Construction du tableau des dependances necessite, lib et utilise $dependances['necessite'] = $plugin['necessite']; $dependances['librairie'] = $plugin['lib']; - $dependances['utilise'] = $plugin['utilise']; - $champs['dependances'] = serialize($dependances); + $dependances['utilise'] = $plugin['utilise']; + $champs['dependances'] = serialize($dependances); $champs['procure'] = ''; - if (isset($plugin['procure']) AND $plugin['procure']){ + if (isset($plugin['procure']) AND $plugin['procure']) { $champs['procure'] = array(); - foreach($plugin['procure'] as $procure){ + foreach ($plugin['procure'] as $procure) { $p = strtoupper($procure['nom']); if (!isset($champs['procure'][$p]) - OR spip_version_compare($procure['version'],$champs['procure'][$p],'>')){ + OR spip_version_compare($procure['version'], $champs['procure'][$p], '>') + ) { $champs['procure'][$p] = $procure['version']; } } diff --git a/plugins/preparer_sql_plugin.php b/plugins/preparer_sql_plugin.php index 933a8e5..9ea3079 100644 --- a/plugins/preparer_sql_plugin.php +++ b/plugins/preparer_sql_plugin.php @@ -7,31 +7,33 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Pour une description de plugin donnée (issue de la dtd de plugin.xml), - * prépare les données à installer en bdd + * prépare les données à installer en bdd * * Les données sont parfois sérialisées, parfois transcodées, parfois compilées * pour tenir compte des spécificités de cette DTD et du stockage en bdd. - * + * * @uses compiler_branches_spip() * @param array $plugin * Description de plugin * @return array * Couples clés => valeurs de description du paquet -**/ -function plugins_preparer_sql_plugin($plugin) -{ + **/ +function plugins_preparer_sql_plugin($plugin) { include_spip('inc/svp_outiller'); $champs = array(); - if (!$plugin) + if (!$plugin) { return $champs; - + } + // On initialise les champs ne necessitant aucune transformation $champs['categorie'] = (isset($plugin['categorie']) and $plugin['categorie']) ? $plugin['categorie'] : ''; $champs['etat'] = (isset($plugin['etat']) and $plugin['etat']) ? $plugin['etat'] : ''; @@ -46,44 +48,47 @@ function plugins_preparer_sql_plugin($plugin) $champs['prefixe'] = strtoupper($plugin['prefix']); // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP) - static $num = array('stable'=>4, 'test'=>3, 'dev'=>2, 'experimental'=>1); + static $num = array('stable' => 4, 'test' => 3, 'dev' => 2, 'experimental' => 1); $champs['etatnum'] = (isset($plugin['etat']) and isset($num[$plugin['etat']])) ? $num[$plugin['etat']] : 0; // Tags : liste de mots-cles $champs['tags'] = (isset($plugin['tags']) and $plugin['tags']) ? serialize($plugin['tags']) : ''; - + // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html - $champs['description'] = entite2charset($plugin['description'],'utf-8'); - + $champs['description'] = entite2charset($plugin['description'], 'utf-8'); + // Traitement des auteurs, credits, licences et copyright // -- on extrait les auteurs, licences et copyrights sous forme de tableaux // -- depuis le commit 18294 du core la balise auteur est renvoyee sous forme de tableau mais // contient toujours qu'un seul index - $balise_auteur = entite2charset($plugin['auteur'][0],'utf-8'); + $balise_auteur = entite2charset($plugin['auteur'][0], 'utf-8'); $auteurs = normaliser_auteur_licence($balise_auteur, 'auteur'); - $balise_licence = isset($plugin['licence'][0]) ? entite2charset($plugin['licence'][0],'utf-8') : ''; + $balise_licence = isset($plugin['licence'][0]) ? entite2charset($plugin['licence'][0], 'utf-8') : ''; $licences = normaliser_auteur_licence($balise_licence, 'licence'); // -- on merge les tableaux recuperes dans auteur et licence $champs['auteur'] = $champs['licence'] = $champs['copyright'] = ''; - if ($t = array_merge($auteurs['auteur'], $licences['auteur'])) + if ($t = array_merge($auteurs['auteur'], $licences['auteur'])) { $champs['auteur'] = serialize($t); - if ($t = array_merge($auteurs['licence'], $licences['licence'])) + } + if ($t = array_merge($auteurs['licence'], $licences['licence'])) { $champs['licence'] = serialize($t); - if ($t = array_merge($auteurs['copyright'], $licences['copyright'])) + } + if ($t = array_merge($auteurs['copyright'], $licences['copyright'])) { $champs['copyright'] = serialize($t); - + } + // Extrait d'un nom et un slogan normalises // Slogan : si vide on ne fait plus rien de special, on traitera ça a l'affichage - $champs['slogan'] = $plugin['slogan'] ? entite2charset($plugin['slogan'],'utf-8') : ''; + $champs['slogan'] = $plugin['slogan'] ? entite2charset($plugin['slogan'], 'utf-8') : ''; // Nom : on repere dans le nom du plugin un chiffre en fin de nom // et on l'ampute de ce numero pour le normaliser // et on passe tout en unicode avec le charset du site - $champs['nom'] = trim(entite2charset($plugin['nom'],'utf-8')); + $champs['nom'] = trim(entite2charset($plugin['nom'], 'utf-8')); // Extraction de la compatibilite SPIP et construction de la liste des branches spip supportees $champs['compatibilite_spip'] = ($plugin['compatibilite']) ? $plugin['compatibilite'] : ''; $champs['branches_spip'] = ($plugin['compatibilite']) ? compiler_branches_spip($plugin['compatibilite']) : ''; - + // Construction du tableau des dependances necessite, lib et utilise $dependances['necessite'] = $plugin['necessite']; $dependances['librairie'] = $plugin['lib']; @@ -91,12 +96,13 @@ function plugins_preparer_sql_plugin($plugin) $champs['dependances'] = serialize($dependances); $champs['procure'] = ''; - if (isset($plugin['procure']) AND $plugin['procure']){ + if (isset($plugin['procure']) AND $plugin['procure']) { $champs['procure'] = array(); - foreach($plugin['procure'] as $procure){ + foreach ($plugin['procure'] as $procure) { $p = strtoupper($procure['nom']); if (!isset($champs['procure'][$p]) - OR spip_version_compare($procure['version'],$champs['procure'][$p],'>')){ + OR spip_version_compare($procure['version'], $champs['procure'][$p], '>') + ) { $champs['procure'][$p] = $procure['version']; } } @@ -113,12 +119,12 @@ function plugins_preparer_sql_plugin($plugin) /** - * Normalise un nom issu d'un plugin.xml + * Normalise un nom issu d'un plugin.xml * * @todo Supprimer cette fonction qui ne sert nulle part ? - * + * * @uses extraire_trads() - * + * * @param string $nom * Le nom * @param string $langue @@ -127,7 +133,7 @@ function plugins_preparer_sql_plugin($plugin) * Supprimer les numéros ? * @return string * Le nom -**/ + **/ function normaliser_nom($nom, $langue = '', $supprimer_numero = true) { include_spip('inc/texte'); @@ -139,20 +145,24 @@ function normaliser_nom($nom, $langue = '', $supprimer_numero = true) { $nouveau_nom = ''; foreach ($noms as $_lang => $_nom) { $_nom = trim($_nom); - if (!$_lang) + if (!$_lang) { $_lang = _LANGUE_PAR_DEFAUT; - if ($supprimer_numero) + } + if ($supprimer_numero) { $nbr_matches = preg_match(',(.+)(\s+[\d._]*)$,Um', $_nom, $matches); - else + } else { $nbr_matches = 0; - if (!$langue OR $langue == $_lang OR count($noms) == 1) - $nouveau_nom .= (($multi) ? '[' . $_lang . ']' : '') . - (($nbr_matches > 0) ? trim($matches[1]) : $_nom); + } + if (!$langue OR $langue == $_lang OR count($noms) == 1) { + $nouveau_nom .= (($multi) ? '[' . $_lang . ']' : '') . + (($nbr_matches > 0) ? trim($matches[1]) : $_nom); + } } - - if ($nouveau_nom) - // On renvoie un nouveau nom multi ou pas sans la valeur de la branche + + if ($nouveau_nom) // On renvoie un nouveau nom multi ou pas sans la valeur de la branche + { $nouveau_nom = (($multi) ? '' : '') . $nouveau_nom . (($multi) ? '' : ''); + } return $nouveau_nom; } @@ -160,7 +170,7 @@ function normaliser_nom($nom, $langue = '', $supprimer_numero = true) { /** * Normalise un lien issu d'un plugin.xml - * + * * Éliminer les textes superflus dans les liens (raccourcis [XXX->http...]) * et normaliser l'esperluete pour éviter l'erreur d'entité indéfinie * @@ -170,23 +180,25 @@ function normaliser_nom($nom, $langue = '', $supprimer_numero = true) { * URL normalisée */ function normaliser_lien($url) { - if (!preg_match(',https?://[^]\s]+,', $url, $r)) + if (!preg_match(',https?://[^]\s]+,', $url, $r)) { return ''; + } $url = str_replace('&', '&', str_replace('&', '&', $r[0])); + return $url; } /** * Normalise un auteur ou une licence issue d'un plugin.xml - * + * * - Élimination des multi (exclus dans la nouvelle version) * - Transformation en attribut des balises A * - Interprétation des balises BR et LI et de la virgule et du * espace+tiret comme séparateurs * * @uses _RACCOURCI_LIEN - * + * * @param string $texte * Texte de la balise * @param string $balise @@ -202,8 +214,8 @@ function normaliser_auteur_licence($texte, $balise) { // On extrait le multi si besoin et on selectionne la traduction francaise $t = normaliser_multi($texte); - $res = array('auteur' => array(), 'licence' => array(),'copyright' => array()); - foreach(preg_split('@(
    )|
  • |,|\s-|\n_*\s*|&| & | et @', $t[_LANGUE_PAR_DEFAUT]) as $v) { + $res = array('auteur' => array(), 'licence' => array(), 'copyright' => array()); + foreach (preg_split('@(
    )|
  • |,|\s-|\n_*\s*|&| & | et @', $t[_LANGUE_PAR_DEFAUT]) as $v) { // On detecte d'abord si le bloc texte en cours contient un eventuel copyright // -- cela generera une balise copyright et non auteur $copy = ''; @@ -212,7 +224,7 @@ function normaliser_auteur_licence($texte, $balise) { $v = str_replace($r[0], '', $v); $res['copyright'][] = $copy; } - + // On detecte ensuite un lien eventuel d'un auteur // -- soit sous la forme d'une href d'une ancre // -- soit sous la forme d'un raccourci SPIP @@ -222,50 +234,54 @@ function normaliser_auteur_licence($texte, $balise) { if (preg_match('@]*href=(\W)(.*?)\1[^>]*>(.*?)@', $v, $r)) { $href = $r[2]; $v = str_replace($r[0], $r[3], $v); - } - elseif (preg_match(_RACCOURCI_LIEN,$v, $r)) { + } elseif (preg_match(_RACCOURCI_LIEN, $v, $r)) { if (preg_match('/([^\w\d._-]*)(([\w\d._-]+)@([\w\d.-]+))/', $r[4], $m)) { $mail = $r[4]; - } - else { + } else { $href = $r[4]; } $v = ($r[1]) ? $r[1] : str_replace($r[0], '', $v); - } else + } else { $href = ''; - + } + // On detecte ensuite un mail eventuel if (!$mail AND preg_match('/([^\w\d._-]*)(([\w\d._-]+)@([\w\d.-]+))/', $v, $r)) { $mail = $r[2]; $v = str_replace($r[2], '', $v); if (!$v) { // On considere alors que la premiere partie du mail peut faire office de nom d'auteur - if (preg_match('/(([\w\d_-]+)[.]([\w\d_-]+))@/', $r[2], $s)) + if (preg_match('/(([\w\d_-]+)[.]([\w\d_-]+))@/', $r[2], $s)) { $v = ucfirst($s[2]) . ' ' . ucfirst($s[3]); - else + } else { $v = ucfirst($r[3]); + } } } - + // On detecte aussi si le bloc texte en cours contient une eventuelle licence // -- cela generera une balise licence et non auteur // cette heuristique n'est pas deterministe car la phrase de licence n'est pas connue $licence = array(); - if (preg_match('/\b((gnu|free|creative\s+common|cc)*[\/|\s|-]*(apache|lgpl|agpl|gpl|fdl|mit|bsd|art\s+|attribution|by)(\s+licence|\-sharealike|-nc-nd|-nc-sa|-sa|-nc|-nd)*\s*v*(\d*[\.\d+]*))\b/i', $v, $r)) { + if (preg_match('/\b((gnu|free|creative\s+common|cc)*[\/|\s|-]*(apache|lgpl|agpl|gpl|fdl|mit|bsd|art\s+|attribution|by)(\s+licence|\-sharealike|-nc-nd|-nc-sa|-sa|-nc|-nd)*\s*v*(\d*[\.\d+]*))\b/i', + $v, $r)) { if ($licence = definir_licence($r[2], $r[3], $r[4], $r[5])) { $res['licence'][] = $licence; } } - + // On finalise la balise auteur ou licence si on a pas trouve de licence prioritaire - if ($href) + if ($href) { $href = !preg_match(',https?://,', $href, $matches) ? "http://" . $href : $href; + } $v = trim(textebrut($v)); - if ((strlen($v) > 2) AND !$licence) - if ($balise == 'auteur') + if ((strlen($v) > 2) AND !$licence) { + if ($balise == 'auteur') { $res['auteur'][] = array('nom' => $v, 'url' => $href, 'mail' => $mail); - else + } else { $res['licence'][] = array('nom' => $v, 'url' => $href); + } + } } return $res; @@ -284,16 +300,18 @@ function normaliser_auteur_licence($texte, $balise) { function normaliser_multi($texte) { include_spip('inc/filtres'); - if (!preg_match_all(_EXTRAIRE_MULTI, $texte, $regs, PREG_SET_ORDER)) + if (!preg_match_all(_EXTRAIRE_MULTI, $texte, $regs, PREG_SET_ORDER)) { return array(_LANGUE_PAR_DEFAUT => $texte); + } $trads = array(); foreach ($regs as $reg) { foreach (extraire_trads($reg[1]) as $k => $v) { // Si le code de langue n'est pas précisé dans le multi c'est donc la langue par défaut $lang = ($k) ? $k : _LANGUE_PAR_DEFAUT; - $trads[$lang]= str_replace($reg[0], $v, isset($trads[$k]) ? $trads[$k] : $texte); + $trads[$lang] = str_replace($reg[0], $v, isset($trads[$k]) ? $trads[$k] : $texte); } } + return $trads; } diff --git a/prive/squelettes/inclure/voir_en_ligne_fonctions.php b/prive/squelettes/inclure/voir_en_ligne_fonctions.php index 4b3ebb5..f85ee32 100644 --- a/prive/squelettes/inclure/voir_en_ligne_fonctions.php +++ b/prive/squelettes/inclure/voir_en_ligne_fonctions.php @@ -1,4 +1,5 @@ \ No newline at end of file diff --git a/prive/squelettes/navigation/svp_admin_plugin_fonctions.php b/prive/squelettes/navigation/svp_admin_plugin_fonctions.php index 5e45b22..a137834 100644 --- a/prive/squelettes/navigation/svp_admin_plugin_fonctions.php +++ b/prive/squelettes/navigation/svp_admin_plugin_fonctions.php @@ -4,8 +4,10 @@ * Charger les fonctions d'outillage pour la page d'administration des plugins * * @package SPIP\SVP\Fonctions -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/svp_outiller'); diff --git a/svp_administrations.php b/svp_administrations.php index 8091b79..758a19b 100644 --- a/svp_administrations.php +++ b/svp_administrations.php @@ -6,7 +6,7 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Installation -**/ + **/ include_spip('base/create'); @@ -14,34 +14,34 @@ include_spip('base/create'); * Installation et mises à jour du plugin * * Crée les tables SQL du plugin (spip_depots, spip_plugins, spip_depots_plugins, spip_paquets) - * + * * @param string $nom_meta_base_version * Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP * @param string $version_cible * Version du schéma de données dans ce plugin (déclaré dans paquet.xml) * @return void -**/ -function svp_upgrade($nom_meta_base_version, $version_cible){ + **/ +function svp_upgrade($nom_meta_base_version, $version_cible) { $maj = array(); - $install = array('maj_tables', array('spip_depots','spip_plugins','spip_depots_plugins','spip_paquets')); + $install = array('maj_tables', array('spip_depots', 'spip_plugins', 'spip_depots_plugins', 'spip_paquets')); $maj['create'][] = $install; - $maj['0.2'][] = array('maj_tables', 'spip_paquets'); - $maj['0.3'][] = array('maj_tables', 'spip_paquets'); // prefixe et attente - $maj['0.3'][] = array('svp_synchroniser_prefixe'); + $maj['0.2'][] = array('maj_tables', 'spip_paquets'); + $maj['0.3'][] = array('maj_tables', 'spip_paquets'); // prefixe et attente + $maj['0.3'][] = array('svp_synchroniser_prefixe'); include_spip('inc/svp_depoter_local'); // on force le recalcul des infos des paquets locaux. - $maj['0.3.1'][] = array('svp_actualiser_paquets_locaux', true); + $maj['0.3.1'][] = array('svp_actualiser_paquets_locaux', true); // autant mettre tout a jour pour avoir une base propre apres renommage extensions=> plugins_dist $maj['0.4.0'][] = array('svp_vider_tables', $nom_meta_base_version); $maj['0.4.0'][] = $install; // on force le recalcul des infos des paquets locaux. - $maj['0.4.1'][] = array('svp_actualiser_paquets_locaux', true); + $maj['0.4.1'][] = array('svp_actualiser_paquets_locaux', true); // on force le recalcul des infos des paquets locaux. - $maj['0.5.0'][] = array('maj_tables', 'spip_paquets'); - $maj['0.5.1'][] = array('svp_actualiser_paquets_locaux', true); + $maj['0.5.0'][] = array('maj_tables', 'spip_paquets'); + $maj['0.5.1'][] = array('svp_actualiser_paquets_locaux', true); include_spip('base/upgrade'); maj_plugin($nom_meta_base_version, $version_cible, $maj); @@ -51,11 +51,11 @@ function svp_upgrade($nom_meta_base_version, $version_cible){ * Désinstallation du plugin * * Supprime les tables SQL du plugin (spip_depots, spip_plugins, spip_depots_plugins, spip_paquets) - * + * * @param string $nom_meta_base_version * Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP * @return void -**/ + **/ function svp_vider_tables($nom_meta_base_version) { sql_drop_table("spip_depots"); sql_drop_table("spip_plugins"); @@ -85,7 +85,7 @@ function svp_synchroniser_prefixe() { if (sql_preferer_transaction()) { sql_demarrer_transaction(); } - + foreach ($paquets as $paquet) { sql_updateq('spip_paquets', array('prefixe' => $paquet['prefixe']), @@ -97,4 +97,5 @@ function svp_synchroniser_prefixe() { } } } + ?> diff --git a/svp_fonctions.php b/svp_fonctions.php index e245918..48fcf5b 100644 --- a/svp_fonctions.php +++ b/svp_fonctions.php @@ -6,13 +6,16 @@ * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Fonctions -**/ + **/ -function svp_importer_charset($texte){ - if ($GLOBALS['meta']['charset']=='utf-8') +function svp_importer_charset($texte) { + if ($GLOBALS['meta']['charset'] == 'utf-8') { return $texte; - return importer_charset($texte,'utf-8'); + } + + return importer_charset($texte, 'utf-8'); } + /** * Retourne un texte expliquant l'intervalle de compatibilité avec un plugin ou SPIP * @@ -24,25 +27,30 @@ function svp_importer_charset($texte){ * Nom du plugin pour qui est cette intervalle * @return string * Texte expliquant l'intervalle -**/ -function svp_afficher_intervalle($intervalle, $logiciel){ - if (!strlen($intervalle)) return ''; - if (!preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis',$intervalle,$regs)) return false; + **/ +function svp_afficher_intervalle($intervalle, $logiciel) { + if (!strlen($intervalle)) { + return ''; + } + if (!preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis', $intervalle, $regs)) { + return false; + } $mineure = $regs[1]; $majeure = preg_replace(',\.99$,', '.*', $regs[2]); - $mineure_inc = $intervalle{0}=="["; - $majeure_inc = substr($intervalle,-1)=="]"; - if (strlen($mineure)){ - if (!strlen($majeure)) + $mineure_inc = $intervalle{0} == "["; + $majeure_inc = substr($intervalle, -1) == "]"; + if (strlen($mineure)) { + if (!strlen($majeure)) { $version = $logiciel . ($mineure_inc ? ' ≥ ' : ' > ') . $mineure; - else - $version = $mineure . ($mineure_inc ? ' ≤ ' : ' < ') . $logiciel . ($majeure_inc ? ' ≤ ' : ' < ') . $majeure; - } - else { - if (!strlen($majeure)) + } else { + $version = $mineure . ($mineure_inc ? ' ≤ ' : ' < ') . $logiciel . ($majeure_inc ? ' ≤ ' : ' < ') . $majeure; + } + } else { + if (!strlen($majeure)) { $version = $logiciel; - else - $version = $logiciel . ($majeure_inc ? ' ≤ ' : ' < ') . $majeure; + } else { + $version = $logiciel . ($majeure_inc ? ' ≤ ' : ' < ') . $majeure; + } } return $version; @@ -58,9 +66,10 @@ function svp_afficher_intervalle($intervalle, $logiciel){ * Le type d'état (stable, test, ...) * @return string * Traduction de l'état dans la langue en cours -**/ + **/ function svp_afficher_etat($etat) { include_spip('plugins/afficher_plugin'); + return plugin_etat_en_clair($etat); } @@ -80,15 +89,15 @@ function svp_afficher_etat($etat) { * @param string $sep * Séparateur entre les noms de dépendances * @param string $lien - * Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs : + * Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs : * - * - local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut + * - local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut * donc que le site propose des pages publiques pour les plugins sinon une 404 sera affichée; - * - pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP; - * - non : aucun lien n'est affiché. + * - pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP; + * - non : aucun lien n'est affiché. * @return string * Texte informant des dépendances -**/ + **/ function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', $sep = '
    ', $lien = 'local') { $texte = ''; @@ -97,24 +106,27 @@ function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', if (is_array($dependances)) { ksort($dependances); - foreach($dependances as $_compatibilite => $_dependance) { + foreach ($dependances as $_compatibilite => $_dependance) { $compatibilite = ($_compatibilite !== 0) - ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP'))) - : ''; - if ($compatibilite) + ? _T('svp:info_compatibilite_dependance', + array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP'))) + : ''; + if ($compatibilite) { $texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite; + } foreach ($_dependance as $_plugin) { - if ($texte) + if ($texte) { $texte .= $sep; - if (($dependance == 'necessite' ) OR ($dependance == 'utilise')) { + } + if (($dependance == 'necessite') OR ($dependance == 'utilise')) { if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom']))) { $nom = extraire_multi($plugin['nom']); - if ($lien == 'non') + if ($lien == 'non') { $logiciel = $nom; - else { + } else { $url = ($lien == 'local') - ? generer_url_entite($plugin['id_plugin'], 'plugin') - : "http://plugins.spip.net/{$_plugin['nom']}.html"; + ? generer_url_entite($plugin['id_plugin'], 'plugin') + : "http://plugins.spip.net/{$_plugin['nom']}.html"; $bulle = _T('svp:bulle_aller_plugin'); $logiciel = '' . $nom . ''; } @@ -128,10 +140,10 @@ function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', $intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel); } $texte .= ($intervalle) ? $intervalle : $logiciel; + } else // On demande l'affichage des librairies + { + $texte .= '' . $_plugin['nom'] . ''; } - else - // On demande l'affichage des librairies - $texte .= '' . $_plugin['nom'] . ''; } } } @@ -147,12 +159,13 @@ function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', * en base dans la table spip_paquets * @return bool * Le plugin possède t'il des dépendances ? -**/ + **/ function svp_dependances_existe($balise_serialisee) { $dependances = unserialize($balise_serialisee); - foreach($dependances as $_dependance) { - if ($_dependance) + foreach ($dependances as $_dependance) { + if ($_dependance) { return true; + } } return false; @@ -172,22 +185,23 @@ function svp_dependances_existe($balise_serialisee) { * Séparateur entre les différents crédits * @return string * Texte informant des crédits -**/ + **/ function svp_afficher_credits($balise_serialisee, $sep = ', ') { $texte = ''; $credits = unserialize($balise_serialisee); if (is_array($credits)) { foreach ($credits as $_credit) { - if ($texte) + if ($texte) { $texte .= $sep; + } // Si le credit en cours n'est pas un array c'est donc un copyright $texte .= (!is_array($_credit)) - ? PtoBR(propre($_credit)) // propre pour les [lien->url] des auteurs de plugin.xml ... - : ($_credit['url'] ? '' : '') . - $_credit['nom'] . - ($_credit['url'] ? '' : ''); + ? PtoBR(propre($_credit)) // propre pour les [lien->url] des auteurs de plugin.xml ... + : ($_credit['url'] ? '' : '') . + $_credit['nom'] . + ($_credit['url'] ? '' : ''); } } @@ -206,21 +220,23 @@ function svp_afficher_credits($balise_serialisee, $sep = ', ') { * Séparateur entre les différentes langues * @return string * Texte informant des langues et traducteurs -**/ -function svp_afficher_langues($langues, $sep = ', '){ + **/ +function svp_afficher_langues($langues, $sep = ', ') { $texte = ''; if ($langues) { foreach ($langues as $_code => $_traducteurs) { - if ($texte) + if ($texte) { $texte .= $sep; + } $traducteurs_langue = array(); foreach ($_traducteurs as $_traducteur) { - if (is_array($_traducteur)) + if (is_array($_traducteur)) { $traducteurs_langue[] = ($_traducteur['lien'] ? '' : '') . $_traducteur['nom'] . ($_traducteur['lien'] ? '' : ''); + } } $texte .= $_code . (count($traducteurs_langue) > 0 ? ' (' . implode(', ', $traducteurs_langue) . ')' : ''); } @@ -241,26 +257,26 @@ function svp_afficher_langues($langues, $sep = ', '){ * Identifiant du dépot * @return string * Code HTML présentant les statistiques du dépot -**/ -function svp_afficher_statistiques_globales($id_depot = 0){ + **/ +function svp_afficher_statistiques_globales($id_depot = 0) { $info = ''; $total = svp_compter('depot', $id_depot); if (!$id_depot) { // Si on filtre pas sur un depot alors on affiche le nombre de depots $info = '
  • -
    ' . ucfirst(trim(_T('svp:info_depots_disponibles', array('total_depots'=>'')))) . '
    +
    ' . ucfirst(trim(_T('svp:info_depots_disponibles', array('total_depots' => '')))) . '
    ' . $total['depot'] . '
  • '; } // Compteur des plugins filtre ou pas par depot $info .= '
  • -
    ' . ucfirst(trim(_T('svp:info_plugins_heberges', array('total_plugins'=>'')))) . '
    +
    ' . ucfirst(trim(_T('svp:info_plugins_heberges', array('total_plugins' => '')))) . '
    ' . $total['plugin'] . '
  • '; // Compteur des paquets filtre ou pas par depot $info .= '
  • -
    ' . ucfirst(trim(_T('svp:info_paquets_disponibles', array('total_paquets'=>'')))) . '
    +
    ' . ucfirst(trim(_T('svp:info_paquets_disponibles', array('total_paquets' => '')))) . '
    ' . $total['paquet'] . '
  • '; @@ -287,10 +303,11 @@ function svp_afficher_statistiques_globales($id_depot = 0){ * Numéro de branche de SPIP. (3.0, 2.1, ...) * @return string * Texte indiquant un nombre total de paquets -**/ -function svp_compter_telechargements($id_depot = 0, $categorie = '', $compatible_spip = ''){ + **/ +function svp_compter_telechargements($id_depot = 0, $categorie = '', $compatible_spip = '') { $total = svp_compter('paquet', $id_depot, $categorie, $compatible_spip); - $info = _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet'])); + $info = _T('svp:info_paquets_disponibles', array('total_paquets' => $total['paquet'])); + return $info; } @@ -315,25 +332,24 @@ function svp_compter_telechargements($id_depot = 0, $categorie = '', $compatible * certains jeux de squelettes. * @return string * Texte indiquant certains totaux tel que nombre de plugins, nombre de paquets... -**/ -function svp_compter_depots($id_depot, $contrib = 'plugin'){ + **/ +function svp_compter_depots($id_depot, $contrib = 'plugin') { $info = ''; $total = svp_compter('depot', $id_depot); if (!$id_depot) { - $info = _T('svp:info_depots_disponibles', array('total_depots'=>$total['depot'])) . ', ' . - _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' . - _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet'])); - } - else { + $info = _T('svp:info_depots_disponibles', array('total_depots' => $total['depot'])) . ', ' . + _T('svp:info_plugins_heberges', array('total_plugins' => $total['plugin'])) . ', ' . + _T('svp:info_paquets_disponibles', array('total_paquets' => $total['paquet'])); + } else { if ($contrib == 'plugin') { - $info = _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' . - _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']-$total['autre'])); - } - else { - $info = _T('svp:info_contributions_hebergees', array('total_autres'=>$total['autre'])); + $info = _T('svp:info_plugins_heberges', array('total_plugins' => $total['plugin'])) . ', ' . + _T('svp:info_paquets_disponibles', array('total_paquets' => $total['paquet']-$total['autre'])); + } else { + $info = _T('svp:info_contributions_hebergees', array('total_autres' => $total['autre'])); } } + return $info; } @@ -357,10 +373,11 @@ function svp_compter_depots($id_depot, $contrib = 'plugin'){ * Numéro de branche de SPIP. (3.0, 2.1, ...) * @return string * Texte indiquant un nombre total de paquets -**/ + **/ function svp_compter_plugins($id_depot = 0, $categorie = '', $compatible_spip = '') { $total = svp_compter('plugin', $id_depot, $categorie, $compatible_spip); - $info = _T('svp:info_plugins_disponibles', array('total_plugins'=>$total['plugin'])); + $info = _T('svp:info_plugins_disponibles', array('total_plugins' => $total['plugin'])); + return $info; } @@ -393,48 +410,49 @@ function svp_compter_plugins($id_depot = 0, $categorie = '', $compatible_spip = * Numéro de branche de SPIP. (3.0, 2.1, ...) * @return array * Couples (entite => nombre). -**/ -function svp_compter($entite, $id_depot = 0, $categorie = '', $compatible_spip = ''){ + **/ +function svp_compter($entite, $id_depot = 0, $categorie = '', $compatible_spip = '') { $compteurs = array(); $group_by = array(); $where = array(); - if ($id_depot) + if ($id_depot) { $where[] = "t1.id_depot=" . sql_quote($id_depot); - else + } else { $where[] = "t1.id_depot>0"; + } if ($entite == 'plugin') { $from = 'spip_plugins AS t2, spip_depots_plugins AS t1'; $where[] = "t1.id_plugin=t2.id_plugin"; - if ($categorie) + if ($categorie) { $where[] = "t2.categorie=" . sql_quote($categorie); + } if ($compatible_spip) { $creer_where = charger_fonction('where_compatible_spip', 'inc'); - $where[] = $creer_where($compatible_spip, 't2', '>'); + $where[] = $creer_where($compatible_spip, 't2', '>'); } $compteurs['plugin'] = sql_count(sql_select('t2.id_plugin', $from, $where)); - } - elseif ($entite == 'paquet') { + } elseif ($entite == 'paquet') { if ($categorie) { - $ids = sql_allfetsel('id_plugin', 'spip_plugins', 'categorie='.sql_quote($categorie)); + $ids = sql_allfetsel('id_plugin', 'spip_plugins', 'categorie=' . sql_quote($categorie)); $ids = array_map('reset', $ids); $where[] = sql_in('t1.id_plugin', $ids); } if ($compatible_spip) { $creer_where = charger_fonction('where_compatible_spip', 'inc'); - $where[] = $creer_where($compatible_spip, 't1', '>'); + $where[] = $creer_where($compatible_spip, 't1', '>'); } $compteurs['paquet'] = sql_countsel('spip_paquets AS t1', $where); - } - elseif ($entite == 'depot') { - $champs = array('COUNT(t1.id_depot) AS depot', - 'SUM(t1.nbr_plugins) AS plugin', - 'SUM(t1.nbr_paquets) AS paquet', - 'SUM(t1.nbr_autres) AS autre'); + } elseif ($entite == 'depot') { + $champs = array( + 'COUNT(t1.id_depot) AS depot', + 'SUM(t1.nbr_plugins) AS plugin', + 'SUM(t1.nbr_paquets) AS paquet', + 'SUM(t1.nbr_autres) AS autre' + ); $compteurs = sql_fetsel($champs, 'spip_depots AS t1', $where); - } - elseif ($entite == 'categorie') { + } elseif ($entite == 'categorie') { $from = array('spip_plugins AS t2'); $where_depot = $where[0]; $where = array(); @@ -445,12 +463,13 @@ function svp_compter($entite, $id_depot = 0, $categorie = '', $compatible_spip = } if ($compatible_spip) { $creer_where = charger_fonction('where_compatible_spip', 'inc'); - $where[] = $creer_where($compatible_spip, 't2', '>'); + $where[] = $creer_where($compatible_spip, 't2', '>'); } - if ($categorie) + if ($categorie) { $where[] = "t2.categorie=" . sql_quote($categorie); - else + } else { $group_by = array('t2.categorie'); + } $compteurs['categorie'] = sql_countsel($from, $where, $group_by); } @@ -479,17 +498,18 @@ function svp_compter($entite, $id_depot = 0, $categorie = '', $compatible_spip = * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_SVP_CATEGORIES($p) { // tri, peut être 'ordre_cle' ou 'ordre_alpha' - if (!$tri = interprete_argument_balise(1,$p)) { + if (!$tri = interprete_argument_balise(1, $p)) { $tri = "'ordre_cle'"; } // catégorie (pour n'en prendre qu'une au lieu de toutes) - if (!$categorie = interprete_argument_balise(2,$p)) { + if (!$categorie = interprete_argument_balise(2, $p)) { $categorie = "''"; } - $p->code = 'calcul_svp_categories(' . $tri . ',' . $categorie . ')'; + $p->code = 'calcul_svp_categories(' . $tri . ',' . $categorie . ')'; + return $p; } @@ -498,14 +518,14 @@ function balise_SVP_CATEGORIES($p) { * en index, associé à sa traduction en valeur. * * @uses svp_traduire_categorie() - * + * * @param string $tri * Type de tri (ordre_cle ou ordre_alpha) * @param string $categorie * Restreindre le tableau de retour à cette catégorie si elle existe * @return array * Couples (type de catégorie => Texte de la catégorie) -**/ + **/ function calcul_svp_categories($tri = 'ordre_cle', $categorie = '') { $retour = array(); @@ -513,16 +533,17 @@ function calcul_svp_categories($tri = 'ordre_cle', $categorie = '') { $svp_categories = $GLOBALS['categories_plugin']; if (is_array($svp_categories)) { - if (($categorie) AND in_array($categorie, $svp_categories)) + if (($categorie) AND in_array($categorie, $svp_categories)) { $retour[$categorie] = _T('svp:categorie_' . strtolower($categorie)); - else { + } else { if ($tri == 'ordre_alpha') { sort($svp_categories); // On positionne l'absence de categorie en fin du tableau $svp_categories[] = array_shift($svp_categories); } - foreach ($svp_categories as $_alias) + foreach ($svp_categories as $_alias) { $retour[$_alias] = svp_traduire_categorie($_alias); + } } } @@ -549,13 +570,14 @@ function calcul_svp_categories($tri = 'ordre_cle', $categorie = '') { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_SVP_BRANCHES_SPIP($p) { // nom d'une branche en premier argument - if (!$branche = interprete_argument_balise(1,$p)) { + if (!$branche = interprete_argument_balise(1, $p)) { $branche = "''"; } - $p->code = 'calcul_svp_branches_spip('.$branche.')'; + $p->code = 'calcul_svp_branches_spip(' . $branche . ')'; + return $p; } @@ -568,7 +590,7 @@ function balise_SVP_BRANCHES_SPIP($p) { * @return array * Liste des branches array('1.9', '2.0', '2.1', ....) * ou liste mini et maxi d'une branche array('3.0.0', '3.0.99') -**/ + **/ function calcul_svp_branches_spip($branche) { $retour = array(); @@ -576,10 +598,10 @@ function calcul_svp_branches_spip($branche) { $svp_branches = $GLOBALS['infos_branches_spip']; if (is_array($svp_branches)) { - if (($branche) AND in_array($branche, $svp_branches)) - // On renvoie les bornes inf et sup de la branche specifiee + if (($branche) AND in_array($branche, $svp_branches)) // On renvoie les bornes inf et sup de la branche specifiee + { $retour = $svp_branches[$branche]; - else { + } else { // On renvoie uniquement les numeros de branches $retour = array_keys($svp_branches); } @@ -595,12 +617,13 @@ function calcul_svp_branches_spip($branche) { * Type de catégorie (auteur, communication, date...) * @return string * Titre complet et traduit de la catégorie -**/ + **/ function svp_traduire_categorie($alias) { $traduction = ''; if ($alias) { $traduction = _T('svp:categorie_' . strtolower($alias)); } + return $traduction; } @@ -611,13 +634,14 @@ function svp_traduire_categorie($alias) { * Type de dépot (svn, git, manuel) * @return string * Titre complet et traduit du type de dépot -**/ + **/ function svp_traduire_type_depot($type) { $traduction = ''; if ($type) { $traduction = _T('svp:info_type_depot_' . $type); } + return $traduction; } @@ -631,37 +655,34 @@ function svp_traduire_type_depot($type) { * Tous les autres types d'url renvoient une chaine vide * @return string * URL calculée en fonction de l'URL d'entrée -**/ + **/ function svp_calculer_url_demo($url_demo, $url_absolue = false) { $url_calculee = ''; - $url_demo = trim($url_demo); - if (strlen($url_demo) > 0) { - $url_elements = @parse_url($url_demo); - if (isset($url_elements['scheme']) AND $url_elements['scheme']) { - // Cas 1 : http://xxxx. C'est donc une url absolue que l'on conserve telle qu'elle. - $url_calculee = $url_demo; - } - else { - if (!$url_absolue) { - if (isset($url_elements['query']) AND $url_elements['query']) { - // Cas 2 : ?exec=xxx ou ?page=yyy. C'est donc une url relative que l'on transforme - // en url absolue privée ou publique en fonction de la query. - $egal = strpos($url_elements['query'], '='); - $page = substr($url_elements['query'], $egal+1, strlen($url_elements['query']) - $egal - 1); - if (strpos($url_elements['query'], 'exec=') !== false) { - $url_calculee = generer_url_ecrire($page); - } - else { - $url_calculee = generer_url_public($page); - } - } - elseif (isset($url_elements['path']) AND $url_elements['path']) { - // Cas 3 : xxx/yyy. C'est donc une url relative que l'on transforme - $url_calculee = generer_url_public($url_demo); - } - } - } + $url_demo = trim($url_demo); + if (strlen($url_demo) > 0) { + $url_elements = @parse_url($url_demo); + if (isset($url_elements['scheme']) AND $url_elements['scheme']) { + // Cas 1 : http://xxxx. C'est donc une url absolue que l'on conserve telle qu'elle. + $url_calculee = $url_demo; + } else { + if (!$url_absolue) { + if (isset($url_elements['query']) AND $url_elements['query']) { + // Cas 2 : ?exec=xxx ou ?page=yyy. C'est donc une url relative que l'on transforme + // en url absolue privée ou publique en fonction de la query. + $egal = strpos($url_elements['query'], '='); + $page = substr($url_elements['query'], $egal+1, strlen($url_elements['query'])-$egal-1); + if (strpos($url_elements['query'], 'exec=') !== false) { + $url_calculee = generer_url_ecrire($page); + } else { + $url_calculee = generer_url_public($page); + } + } elseif (isset($url_elements['path']) AND $url_elements['path']) { + // Cas 3 : xxx/yyy. C'est donc une url relative que l'on transforme + $url_calculee = generer_url_public($url_demo); + } + } + } } return $url_calculee; @@ -684,9 +705,9 @@ function svp_calculer_url_demo($url_demo, $url_absolue = false) { * {compatible_spip #ENV{vers}} ou {compatible_spip #ENV{vers, 1.9.2}} * {compatible_spip #GET{vers}} ou {compatible_spip #GET{vers, 2.1}} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void */ function critere_compatible_spip_dist($idb, &$boucles, $crit) { @@ -706,7 +727,7 @@ function critere_compatible_spip_dist($idb, &$boucles, $crit) { if (isset($crit->param[0][0])) { $version = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent); $boucle->hash .= ' - $where = $creer_where('.$version.', \''.$table.'\', \''.$op.'\'); + $where = $creer_where(' . $version . ', \'' . $table . '\', \'' . $op . '\'); '; } // pas de version/branche explicite dans l'appel du critere @@ -714,7 +735,7 @@ function critere_compatible_spip_dist($idb, &$boucles, $crit) { else { $boucle->hash .= ' $version = isset($Pile[0][\'compatible_spip\']) ? $Pile[0][\'compatible_spip\'] : \'\'; - $where = $creer_where($version, \''.$table.'\', \''.$op.'\'); + $where = $creer_where($version, \'' . $table . '\', \'' . $op . '\'); '; } @@ -743,15 +764,22 @@ function critere_compatible_spip_dist($idb, &$boucles, $crit) { * Tableau classé par pertinence de résultat * - 'prefixe' => tableau de description du paquet (si pas de doublons demandé) * - n => tableau de descriptions du paquet (si doublons autorisés) -**/ -function filtre_construire_recherche_plugins($phrase = '', $categorie = '', $etat = '', $depot = '', $afficher_exclusions = true, $afficher_doublons = false) { + **/ +function filtre_construire_recherche_plugins( + $phrase = '', + $categorie = '', + $etat = '', + $depot = '', + $afficher_exclusions = true, + $afficher_doublons = false +) { // On traite les paramètres d'affichage $afficher_exclusions = ($afficher_exclusions == 'oui') ? true : false; $afficher_doublons = ($afficher_doublons == 'oui') ? true : false; $tri = ($phrase) ? 'score' : 'nom'; - $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code']; + $version_spip = $GLOBALS['spip_version_branche'] . "." . $GLOBALS['spip_version_code']; // On recupere la liste des paquets: // - sans doublons, ie on ne garde que la version la plus recente @@ -774,9 +802,10 @@ function filtre_construire_recherche_plugins($phrase = '', $categorie = '', $eta * * @return int * Nombre d'heures (sinon 0) -**/ + **/ function filtre_svp_periode_actualisation_depots() { include_spip('genie/svp_taches_generales_cron'); + return _SVP_CRON_ACTUALISATION_DEPOTS ? _SVP_PERIODE_ACTUALISATION_DEPOTS : 0; } @@ -792,21 +821,22 @@ function filtre_svp_periode_actualisation_depots() { * Numéro de version normalisée * @return string * Numéro de version dénormalisée -**/ + **/ function denormaliser_version($version_normalisee = '') { $version = ''; if ($version_normalisee) { $v = explode('.', $version_normalisee); - foreach($v as $_nombre) { + foreach ($v as $_nombre) { $n = ltrim($_nombre, '0'); // On traite les cas du type 001.002.000-dev qui doivent etre transformes en 1.2.0-dev. // Etant donne que la denormalisation est toujours effectuee sur une version normalisee on sait // que le suffixe commence toujours pas '-' - $vn[] = ((strlen($n)>0) AND substr($n, 0, 1)!='-' ) ? $n : "0$n"; + $vn[] = ((strlen($n) > 0) AND substr($n, 0, 1) != '-') ? $n : "0$n"; } $version = implode('.', $vn); } + return $version; } @@ -826,6 +856,8 @@ function test_plugins_auto() { include_spip('inc/plugin'); // pour _DIR_PLUGINS_AUTO $test = (defined('_DIR_PLUGINS_AUTO') and _DIR_PLUGINS_AUTO and is_writable(_DIR_PLUGINS_AUTO)); } + return $test; } + ?> diff --git a/svp_ieconfig.php b/svp_ieconfig.php index 5ce6f2e..a9419ec 100644 --- a/svp_ieconfig.php +++ b/svp_ieconfig.php @@ -2,13 +2,15 @@ /** * Déclarations des configurations qui peuvent être sauvegardées - * + * * @plugin SVP pour SPIP * @license GPL * @package SPIP\SVP\Pipelines -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Ajoute les metas sauvegardables de SVP pour le plugin IEConfig @@ -17,10 +19,10 @@ if (!defined("_ECRIRE_INC_VERSION")) return; * * @param array $table * Déclaration des sauvegardes - * @return array + * @return array * Déclaration des sauvegardes complétées -**/ -function svp_ieconfig_metas($table){ + **/ +function svp_ieconfig_metas($table) { $table['svp']['titre'] = _T('svp:titre_page_configurer'); $table['svp']['icone'] = 'svp-16.png'; $table['svp']['metas_serialize'] = 'svp'; diff --git a/svp_pipelines.php b/svp_pipelines.php index 2f28a3b..511d73a 100644 --- a/svp_pipelines.php +++ b/svp_pipelines.php @@ -1,29 +1,30 @@ type_requete == 'depots' ) { $id_table = $boucle->id_table; - $m_id_depot = $id_table .'.id_depot'; + $m_id_depot = $id_table . '.id_depot'; // Restreindre aux depots distants if ( #!isset($boucle->modificateur['criteres']['id_depot']) && - !isset($boucle->modificateur['tout'])) { - $boucle->where[] = array("'>'", "'$m_id_depot'", "'\"0\"'"); + !isset($boucle->modificateur['tout']) + ) { + $boucle->where[] = array("'>'", "'$m_id_depot'", "'\"0\"'"); } - } - // PLUGINS + } // PLUGINS elseif ($boucle->type_requete == 'plugins') { $id_table = $boucle->id_table; /* @@ -118,16 +123,18 @@ function svp_pre_boucle($boucle) { } */ if ( - # !$id_depot && - !isset($boucle->modificateur['tout'])) { - // Restreindre aux plugins distant (id_depot > 0) - $boucle->from["depots_plugins"] = "spip_depots_plugins"; - $boucle->where[] = array("'='", "'depots_plugins.id_plugin'", "'$id_table.id_plugin'"); - $boucle->where[] = array("'>'", "'depots_plugins.id_depot'", "'\"0\"'"); + # !$id_depot && + !isset($boucle->modificateur['tout']) + ) { + // Restreindre aux plugins distant (id_depot > 0) + $boucle->from["depots_plugins"] = "spip_depots_plugins"; + $boucle->where[] = array("'='", "'depots_plugins.id_plugin'", "'$id_table.id_plugin'"); + $boucle->where[] = array("'>'", "'depots_plugins.id_depot'", "'\"0\"'"); } } return $boucle; } + ?> diff --git a/teleporter/git.php b/teleporter/git.php index d0b4a5d..1319a7a 100644 --- a/teleporter/git.php +++ b/teleporter/git.php @@ -1,17 +1,19 @@ 'assoc')); - if (!$infos){ - spip_log("Suppression de $dest qui n'est pas au format GIT","teleport"); + $branche = (isset($options['branche']) ? $options['branche'] : 'master'); + if (is_dir($dest)) { + $infos = teleporter_git_read($dest, array('format' => 'assoc')); + if (!$infos) { + spip_log("Suppression de $dest qui n'est pas au format GIT", "teleport"); $old = teleporter_nettoyer_vieille_version($dest); - } - elseif ($infos['source']!==$source) { - spip_log("Suppression de $dest qui n'est pas sur le bon repository GIT","teleport"); + } elseif ($infos['source'] !== $source) { + spip_log("Suppression de $dest qui n'est pas sur le bon repository GIT", "teleport"); $old = teleporter_nettoyer_vieille_version($dest); - } - elseif (!isset($options['revision']) - OR $options['revision']!=$infos['revision']){ - $command = _GIT_COMMAND." checkout ".escapeshellarg($branche); - teleporter_git_exec($dest,$command); - $command = _GIT_COMMAND." pull --all"; - teleporter_git_exec($dest,$command); - - if (isset($options['revision'])){ - $command = _GIT_COMMAND." checkout ".escapeshellarg($options['revision']); - teleporter_git_exec($dest,$command); + } elseif (!isset($options['revision']) + OR $options['revision'] != $infos['revision'] + ) { + $command = _GIT_COMMAND . " checkout " . escapeshellarg($branche); + teleporter_git_exec($dest, $command); + $command = _GIT_COMMAND . " pull --all"; + teleporter_git_exec($dest, $command); + + if (isset($options['revision'])) { + $command = _GIT_COMMAND . " checkout " . escapeshellarg($options['revision']); + teleporter_git_exec($dest, $command); + } else { + $command = _GIT_COMMAND . " checkout " . escapeshellarg($branche); + teleporter_git_exec($dest, $command); } - else { - $command = _GIT_COMMAND." checkout ".escapeshellarg($branche); - teleporter_git_exec($dest,$command); - } - } - else { - spip_log("$dest deja sur GIT $source Revision ".$options['revision'],"teleport"); + } else { + spip_log("$dest deja sur GIT $source Revision " . $options['revision'], "teleport"); } } - if (!is_dir($dest)){ - $command = _GIT_COMMAND." clone "; - $command .= escapeshellarg($source)." ".escapeshellarg($dest); - teleporter_git_exec($dest,$command); - if (isset($options['revision'])){ - $command = _GIT_COMMAND." checkout ".escapeshellarg($options['revision']); - teleporter_git_exec($dest,$command); + if (!is_dir($dest)) { + $command = _GIT_COMMAND . " clone "; + $command .= escapeshellarg($source) . " " . escapeshellarg($dest); + teleporter_git_exec($dest, $command); + if (isset($options['revision'])) { + $command = _GIT_COMMAND . " checkout " . escapeshellarg($options['revision']); + teleporter_git_exec($dest, $command); } } // verifier que tout a bien marche $infos = teleporter_git_read($dest); - if (!$infos) return false; + if (!$infos) { + return false; + } return true; } @@ -82,7 +83,7 @@ function teleporter_git_dist($methode, $source, $dest, $options = array()){ * Lire l'état GIT du repository * * Retourne les informations GIT d'un répertoire donné - * + * * @param string $dest * Chemin du répertoire à tester * @param array $options @@ -97,41 +98,45 @@ function teleporter_git_dist($methode, $source, $dest, $options = array()){ */ function teleporter_git_read($dest, $options = array()) { - if (!is_dir("$dest/.git")) + if (!is_dir("$dest/.git")) { return ""; + } $curdir = getcwd(); chdir($dest); - exec(_GIT_COMMAND." remote -v",$output); - $output = implode("\n",$output); + exec(_GIT_COMMAND . " remote -v", $output); + $output = implode("\n", $output); $source = ""; - if (preg_match(",(\w+://.*)\s+\(fetch\)$,Uims",$output,$m)) + if (preg_match(",(\w+://.*)\s+\(fetch\)$,Uims", $output, $m)) { $source = $m[1]; - elseif (preg_match(",([^@\s]+@[^:\s]+:.*)\s+\(fetch\)$,Uims",$output,$m)) + } elseif (preg_match(",([^@\s]+@[^:\s]+:.*)\s+\(fetch\)$,Uims", $output, $m)) { $source = $m[1]; + } - if (!$source){ + if (!$source) { chdir($curdir); + return ""; } $source = $m[1]; - exec(_GIT_COMMAND." log -1",$output); - $hash = explode(" ",reset($output)); + exec(_GIT_COMMAND . " log -1", $output); + $hash = explode(" ", reset($output)); $hash = end($hash); // [TODO] lire la branche ? chdir($curdir); - if (preg_match(",[^0-9a-f],i",$hash)) + if (preg_match(",[^0-9a-f],i", $hash)) { return false; + } return array( 'source' => $source, - 'revision' => substr($hash,0,7), + 'revision' => substr($hash, 0, 7), 'dest' => $dest ); } @@ -147,7 +152,7 @@ function teleporter_git_read($dest, $options = array()) { * @return void */ function teleporter_git_exec($dest, $command) { - spip_log("{$dest}:{$command}","teleport"); + spip_log("{$dest}:{$command}", "teleport"); $curdir = getcwd(); chdir($dest); exec($command); @@ -160,11 +165,12 @@ function teleporter_git_exec($dest, $command) { * * @return bool * true si on peut utiliser la commande svn -**/ + **/ function teleporter_git_tester() { static $erreurs = null; if (is_null($erreurs)) { - exec(_GIT_COMMAND." --version", $output, $erreurs); + exec(_GIT_COMMAND . " --version", $output, $erreurs); } + return !$erreurs; } diff --git a/teleporter/http.php b/teleporter/http.php index 16bb08b..8d72ed2 100644 --- a/teleporter/http.php +++ b/teleporter/http.php @@ -1,18 +1,18 @@ $extension)); + list($fichier, $extension) = $res; + if (!$deballe = charger_fonction("http_deballe_" . preg_replace(",\W,", "_", $extension), "teleporter", true)) { + return _T('svp:erreur_teleporter_format_archive_non_supporte', array('extension' => $extension)); + } $old = teleporter_nettoyer_vieille_version($dest); - if (!$target = $deballe($fichier, $dest, $tmp)){ + if (!$target = $deballe($fichier, $dest, $tmp)) { // retablir l'ancien sinon - if ($old) - rename($old,$dest); - return _T('svp:erreur_teleporter_echec_deballage_archive',array('fichier' => $fichier)); + if ($old) { + rename($old, $dest); + } + + return _T('svp:erreur_teleporter_echec_deballage_archive', array('fichier' => $fichier)); } return true; @@ -59,7 +63,7 @@ function teleporter_http_dist($methode, $source, $dest, $options = array()){ * Récupérer la source et détecter son extension * * @uses teleporter_http_extension() - * + * * @param string $source * URL de la source HTTP * @param string $dest_tmp @@ -68,11 +72,12 @@ function teleporter_http_dist($methode, $source, $dest, $options = array()){ * - Texte d'erreur si une erreur survient, * - Liste sinon (répertoire de destination temporaire, extension du fichier source) */ -function teleporter_http_recuperer_source($source, $dest_tmp){ +function teleporter_http_recuperer_source($source, $dest_tmp) { # securite : ici on repart toujours d'une source neuve - if (file_exists($dest_tmp)) + if (file_exists($dest_tmp)) { spip_unlink($dest_tmp); + } $extension = ""; @@ -83,66 +88,77 @@ function teleporter_http_recuperer_source($source, $dest_tmp){ include_spip('inc/distant'); $head = recuperer_page($source, false, true, 0); - if (preg_match(",^Content-Type:\s*?(.*)$,Uims",$head,$m) - AND include_spip('base/typedoc')){ + if (preg_match(",^Content-Type:\s*?(.*)$,Uims", $head, $m) + AND include_spip('base/typedoc') + ) { $mime = $m[1]; // passer du mime a l'extension ! - if ($e = array_search($mime,$GLOBALS['tables_mime'])) + if ($e = array_search($mime, $GLOBALS['tables_mime'])) { $extension = $e; + } } if (!$extension - // cas des extensions incertaines car mime-type ambigu - OR in_array($extension,array('bin','gz'))){ - if (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)['\"]?$,Uims",$head,$m) - AND $e=teleporter_http_extension($m[1])){ + // cas des extensions incertaines car mime-type ambigu + OR in_array($extension, array('bin', 'gz')) + ) { + if (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)['\"]?$,Uims", $head, $m) + AND $e = teleporter_http_extension($m[1]) + ) { $extension = $e; } // au cas ou, si le content-type n'est pas la // mais que l'extension est explicite - else{ + else { $extension = teleporter_http_extension($source); } } # format de fichier inconnu if (!$extension) { - spip_log("Type de fichier inconnu pour la source $source","teleport"._LOG_ERREUR); - return _T('svp:erreur_teleporter_type_fichier_inconnu',array('source' => $source)); + spip_log("Type de fichier inconnu pour la source $source", "teleport" . _LOG_ERREUR); + + return _T('svp:erreur_teleporter_type_fichier_inconnu', array('source' => $source)); } - $dest_tmp = preg_replace(";\.[\w]{2,3}$;i","",$dest_tmp).".$extension"; + $dest_tmp = preg_replace(";\.[\w]{2,3}$;i", "", $dest_tmp) . ".$extension"; - if (!defined('_SVP_PAQUET_MAX_SIZE')) define('_SVP_PAQUET_MAX_SIZE', 67108864); // 64Mo + if (!defined('_SVP_PAQUET_MAX_SIZE')) { + define('_SVP_PAQUET_MAX_SIZE', 67108864); + } // 64Mo include_spip('inc/distant'); - $dest_tmp = copie_locale($source,'force',$dest_tmp,_SVP_PAQUET_MAX_SIZE); + $dest_tmp = copie_locale($source, 'force', $dest_tmp, _SVP_PAQUET_MAX_SIZE); if (!$dest_tmp - OR !file_exists($dest_tmp = _DIR_RACINE . $dest_tmp)) { - spip_log("Chargement impossible de la source $source","teleport"._LOG_ERREUR); - return _T('svp:erreur_teleporter_chargement_source_impossible',array('source' => $source)); + OR !file_exists($dest_tmp = _DIR_RACINE . $dest_tmp) + ) { + spip_log("Chargement impossible de la source $source", "teleport" . _LOG_ERREUR); + + return _T('svp:erreur_teleporter_chargement_source_impossible', array('source' => $source)); } - return array($dest_tmp,$extension); + return array($dest_tmp, $extension); } /** - * Retrouve l'extension d'un fichier + * Retrouve l'extension d'un fichier * * @note * Retourne tgz pour un fichier .tar.gz - * + * * @param string $file * Chemin du fichier * @return string * Extension du fichier, sinon vide -**/ -function teleporter_http_extension($file){ + **/ +function teleporter_http_extension($file) { $e = pathinfo($file, PATHINFO_EXTENSION); // cas particuliers : redresser .tar.gz - if ($e=='gz' - AND preg_match(',tar\.gz,i',$file)) + if ($e == 'gz' + AND preg_match(',tar\.gz,i', $file) + ) { $e = 'tgz'; + } return $e; } @@ -154,37 +170,43 @@ function teleporter_http_extension($file){ * Liste de chemin de fichiers * @return string * Chemin commun entre tous les fichiers -**/ -function http_deballe_recherche_racine($list){ + **/ +function http_deballe_recherche_racine($list) { // on cherche la plus longue racine commune a tous les fichiers // pour l'enlever au deballage $max_n = 999999; $paths = array(); - foreach($list as $n) { + foreach ($list as $n) { $p = array(); - foreach(explode('/', $n['filename']) as $n => $x) { - if ($n>$max_n) + foreach (explode('/', $n['filename']) as $n => $x) { + if ($n > $max_n) { continue; - $sofar = join('/',$p); - if (!isset($paths[$n])) $paths[$n] = array(); - if (!isset($paths[$n][$sofar])) $paths[$n][$sofar] = 0; + } + $sofar = join('/', $p); + if (!isset($paths[$n])) { + $paths[$n] = array(); + } + if (!isset($paths[$n][$sofar])) { + $paths[$n][$sofar] = 0; + } $paths[$n][$sofar]++; $p[] = $x; } - $max_n = min($n,$max_n); + $max_n = min($n, $max_n); } $total = $paths[0]['']; $i = 0; while (isset($paths[$i]) - AND count($paths[$i]) <= 1 - AND array_values($paths[$i]) == array($total)) + AND count($paths[$i]) <= 1 + AND array_values($paths[$i]) == array($total)) { $i++; + } $racine = ''; - if ($i){ + if ($i) { $racine = array_keys($paths[$i-1]); - $racine = array_pop($racine).'/'; + $racine = array_pop($racine) . '/'; } return $racine; diff --git a/teleporter/http_deballe_tgz.php b/teleporter/http_deballe_tgz.php index 9578713..1d802fd 100644 --- a/teleporter/http_deballe_tgz.php +++ b/teleporter/http_deballe_tgz.php @@ -1,6 +1,6 @@ '', - 'rename' => array(), - 'edit' => array(), - 'root_extract' => false, # extraire a la racine de dest ? - 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur') - ) - as $opt=>$def) { + foreach (array( + 'remove' => '', + 'rename' => array(), + 'edit' => array(), + 'root_extract' => false, # extraire a la racine de dest ? + 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur') + ) + as $opt => $def) { isset($quoi[$opt]) || ($quoi[$opt] = $def); } - if (!@file_exists($fichier = $quoi['fichier'])) + if (!@file_exists($fichier = $quoi['fichier'])) { return 0; + } include_spip('inc/pcltar'); $racine = ''; - if ($list = PclTarList($fichier)){ + if ($list = PclTarList($fichier)) { $racine = http_deballe_recherche_racine($list); $quoi['remove'] = $racine; - } - else { - spip_log('charger_decompresser erreur lecture liste tar ' . PclErrorString() .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR); + } else { + spip_log('charger_decompresser erreur lecture liste tar ' . PclErrorString() . ' pour paquet: ' . $quoi['archive'], + "teleport" . _LOG_ERREUR); + return PclErrorString(); } // si pas de racine commune, reprendre le nom du fichier zip // en lui enlevant la racine h+md5 qui le prefixe eventuellement // cf action/charger_plugin L74 - if (!strlen($nom = basename($racine))) - $nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip')); + if (!strlen($nom = basename($racine))) { + $nom = preg_replace(",^h[0-9a-f]{8}-,i", "", basename($fichier, '.zip')); + } $dir_export = $quoi['root_extract'] ? $quoi['dest'] : $quoi['dest'] . $nom; - $dir_export = rtrim($dir_export,'/').'/'; + $dir_export = rtrim($dir_export, '/') . '/'; - $tmpname = $quoi['tmp'].$nom.'/'; + $tmpname = $quoi['tmp'] . $nom . '/'; // choisir la cible selon si on veut vraiment extraire ou pas $target = $quoi['extract'] ? $dir_export : $tmpname; // ici, il faut vider le rep cible si il existe deja, non ? - if (is_dir($target)) + if (is_dir($target)) { supprimer_repertoire($target); + } - $ok = PclTarExtract($fichier,$target,$quoi['remove']); + $ok = PclTarExtract($fichier, $target, $quoi['remove']); if ($ok == 0) { - spip_log('charger_decompresser erreur tar ' . PclErrorString() .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR); + spip_log('charger_decompresser erreur tar ' . PclErrorString() . ' pour paquet: ' . $quoi['archive'], + "teleport" . _LOG_ERREUR); + return PclErrorString(); } - spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport"); + spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'], "teleport"); $size = $compressed_size = 0; - $removex = ',^'.preg_quote($quoi['remove'], ',').','; + $removex = ',^' . preg_quote($quoi['remove'], ',') . ','; foreach ($list as $a => $f) { $size += $f['size']; $compressed_size += $f['compressed_size']; - $list[$a] = preg_replace($removex,'',$f['filename']); + $list[$a] = preg_replace($removex, '', $f['filename']); } // Indiquer par un fichier install.log // a la racine que c'est chargeur qui a installe ce plugin - ecrire_fichier($target.'install.log', + ecrire_fichier($target . 'install.log', "installation: charger_plugin\n" - ."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n" - ."source: ".$quoi['archive']."\n" + . "date: " . gmdate('Y-m-d\TH:i:s\Z', time()) . "\n" + . "source: " . $quoi['archive'] . "\n" ); diff --git a/teleporter/http_deballe_zip.php b/teleporter/http_deballe_zip.php index cec9c4e..2abaeda 100644 --- a/teleporter/http_deballe_zip.php +++ b/teleporter/http_deballe_zip.php @@ -1,19 +1,19 @@ $archive, // normalement l'url source mais on l'a pas ici @@ -36,18 +36,21 @@ function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){ ); // le fichier .zip est la et bien forme if (is_array($status) - AND is_dir($status['target'])) { + AND is_dir($status['target']) + ) { return $status['target']; - } - // fichier absent - else if ($status == -1) { - spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR); - return false; - } - // fichier la mais pas bien dezippe + } // fichier absent else { - spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR); - return false; + if ($status == -1) { + spip_log("dezip de $archive impossible : fichier absent", "teleport" . _LOG_ERREUR); + + return false; + } // fichier la mais pas bien dezippe + else { + spip_log("probleme lors du dezip de $archive", "teleport" . _LOG_ERREUR); + + return false; + } } } @@ -56,7 +59,7 @@ function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){ * Charger un zip à partir d'un tableau d'options descriptives * * @uses http_deballe_recherche_racine() - * + * * @param array $quoi * Tableau d'options * @return array|bool|int|string @@ -68,22 +71,25 @@ function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){ * - tmpname : répertoire temporaire où les fichiers sont décompressés * - target : cible sur laquelle décompresser les fichiers... */ -function teleporter_http_charger_zip($quoi = array()){ - if (!$quoi) +function teleporter_http_charger_zip($quoi = array()) { + if (!$quoi) { return false; + } - foreach (array( 'remove' => 'spip', - 'rename' => array(), - 'edit' => array(), - 'root_extract' => false, # extraire a la racine de dest ? - 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur') - ) - as $opt=>$def) { + foreach (array( + 'remove' => 'spip', + 'rename' => array(), + 'edit' => array(), + 'root_extract' => false, # extraire a la racine de dest ? + 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur') + ) + as $opt => $def) { isset($quoi[$opt]) || ($quoi[$opt] = $def); } - if (!@file_exists($fichier = $quoi['fichier'])) + if (!@file_exists($fichier = $quoi['fichier'])) { return 0; + } include_spip('inc/pclzip'); $zip = new PclZip($fichier); @@ -95,54 +101,58 @@ function teleporter_http_charger_zip($quoi = array()){ // si pas de racine commune, reprendre le nom du fichier zip // en lui enlevant la racine h+md5 qui le prefixe eventuellement // cf action/charger_plugin L74 - if (!strlen($nom = basename($racine))) - $nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip')); + if (!strlen($nom = basename($racine))) { + $nom = preg_replace(",^h[0-9a-f]{8}-,i", "", basename($fichier, '.zip')); + } $dir_export = $quoi['root_extract'] ? $quoi['dest'] : $quoi['dest'] . $nom; - $dir_export = rtrim($dir_export,'/').'/'; + $dir_export = rtrim($dir_export, '/') . '/'; - $tmpname = $quoi['tmp'].$nom.'/'; + $tmpname = $quoi['tmp'] . $nom . '/'; // choisir la cible selon si on veut vraiment extraire ou pas $target = $quoi['extract'] ? $dir_export : $tmpname; // ici, il faut vider le rep cible si il existe deja, non ? - if (is_dir($target)) + if (is_dir($target)) { supprimer_repertoire($target); + } // et enfin on extrait $ok = $zip->extract( PCLZIP_OPT_PATH, - $target + $target , PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD, PCLZIP_OPT_REPLACE_NEWER, PCLZIP_OPT_REMOVE_PATH, $quoi['remove'] ); if ($zip->error_code < 0) { - spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR); + spip_log('charger_decompresser erreur zip ' . $zip->error_code . ' pour paquet: ' . $quoi['archive'], + "teleport" . _LOG_ERREUR); + return //$zip->error_code $zip->errorName(true); } - spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport"); + spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'], "teleport"); $size = $compressed_size = 0; - $removex = ',^'.preg_quote($quoi['remove'], ',').','; + $removex = ',^' . preg_quote($quoi['remove'], ',') . ','; foreach ($list as $a => $f) { $size += $f['size']; $compressed_size += $f['compressed_size']; - $list[$a] = preg_replace($removex,'',$f['filename']); + $list[$a] = preg_replace($removex, '', $f['filename']); } // Indiquer par un fichier install.log // a la racine que c'est chargeur qui a installe ce plugin - ecrire_fichier($target.'install.log', + ecrire_fichier($target . 'install.log', "installation: charger_plugin\n" - ."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n" - ."source: ".$quoi['archive']."\n" + . "date: " . gmdate('Y-m-d\TH:i:s\Z', time()) . "\n" + . "source: " . $quoi['archive'] . "\n" ); diff --git a/teleporter/svn.php b/teleporter/svn.php index 9543218..9dbeadd 100644 --- a/teleporter/svn.php +++ b/teleporter/svn.php @@ -1,6 +1,6 @@