/** * Effacer les fichiers d'un paquet * * @param array $info * Description courte du paquet * @return bool * false si erreur, true sinon */ public function do_kill($info) { // 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'])); 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'])); // on supprime le paquet sql_delete('spip_paquets', 'id_paquet=' . sql_quote($info['i'])); // ainsi que le plugin s'il n'est plus utilise $utilise = sql_allfetsel('pl.id_plugin', array('spip_paquets AS pa', 'spip_plugins AS pl'), array('pa.id_plugin = pl.id_plugin', 'pa.id_plugin=' . sql_quote($id_plugin))); if (!$utilise) { sql_delete('spip_plugins', 'id_plugin=' . sql_quote($id_plugin)); } else { // on met a jour d'eventuels obsoletes qui ne le sont plus maintenant // ie si on supprime une version superieure à une autre qui existe en local... include_spip('inc/svp_depoter_local'); svp_corriger_obsolete_paquets(array($id_plugin)); } // on tente un nettoyage jusqu'a la racine de auto/ // si la suppression concerne une profondeur d'au moins 2 // et que les repertoires sont vides $chemins = explode('/', $i['src_archive']); // auto / prefixe / version // le premier c'est auto array_shift($chemins); // le dernier est deja fait... array_pop($chemins); // entre les deux... while (count($chemins)) { $vide = true; $dir = constant($i['constante']) . 'auto/' . implode('/', $chemins); $fichiers = scandir($dir); if ($fichiers) { foreach ($fichiers as $f) { if ($f[0] != '.') { $vide = false; break; } } } // on tente de supprimer si c'est effectivement vide. if ($vide and !supprimer_repertoire($dir)) { break; } array_pop($chemins); } return true; } } return false; }
/** * Insère en base tous les paquets locaux transmis * * 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) * * @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('id_depot' => 0, 'nom_archive' => '', 'nbo_archive' => '', 'maj_archive' => '', 'src_archive' => '', 'date_modif' => '', 'maj_version' => '', 'signature' => ''); $preparer_sql_paquet = charger_fonction('preparer_sql_paquet', 'plugins'); // pour chaque decouverte, on insere les paquets en base. // on evite des requetes individuelles, tres couteuses en sqlite... $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'); 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. // De cette façon, les informations des plugins locaux et distants seront identiques // => 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'])) { $paquet['nom'] = $multis['nom']; } $paquet['slogan'] = isset($multis['slogan']) ? $multis['slogan'] : ''; $paquet['description'] = isset($multis['description']) ? $multis['description'] : ''; } $le_paquet = $paquet_base; #$le_paquet['traductions'] = serialize($paquet['traductions']); if ($champs = $preparer_sql_paquet($paquet)) { // Eclater les champs recuperes en deux sous tableaux, un par table (plugin, paquet) $champs = eclater_plugin_paquet($champs); $paquet_plugin = true; // On complete les informations du paquet et du plugin $le_paquet = array_merge($le_paquet, $champs['paquet']); $le_plugin = $champs['plugin']; // On loge l'absence de categorie ou une categorie erronee et on positionne la categorie par defaut "aucune" if (!$le_plugin['categorie']) { $le_plugin['categorie'] = 'aucune'; } else { if (!in_array($le_plugin['categorie'], $GLOBALS['categories_plugin'])) { $le_plugin['categorie'] = 'aucune'; } } // creation du plugin... $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... // // + 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)))) { // 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; $insert_plugins_vmax[$prefixe] = $le_paquet['version']; } elseif (spip_version_compare($le_paquet['version'], $insert_plugins_vmax[$prefixe], '>')) { $insert_plugins[$prefixe] = $le_plugin; $insert_plugins_vmax[$prefixe] = $le_paquet['version']; } } else { $id_plugin = $res['id_plugin']; $cle_plugins[$prefixe] = $id_plugin; // 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)); } } } // ajout du prefixe dans le paquet $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'] = 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) { $actif = "oui"; } $le_paquet['actif'] = $actif; // le plugin etait il actif mais temporairement desactive // parce qu'une dependence a disparue ? $attente = "non"; if (isset($attentes[$prefixe]) and $attentes[$prefixe]['dir_type'] == $const_dir and $attentes[$prefixe]['dir'] == $chemin) { $attente = "oui"; $le_paquet['actif'] = "oui"; // il est presenté dans la liste des actifs (en erreur). } $le_paquet['attente'] = $attente; // on recherche d'eventuelle mises a jour existantes if ($maj_version = svp_rechercher_maj_version($prefixe, $le_paquet['version'], $le_paquet['etatnum'])) { $le_paquet['maj_version'] = $maj_version; } $insert_paquets[] = $le_paquet; } } } if ($insert_plugins) { sql_insertq_multi('spip_plugins', $insert_plugins); $pls = sql_allfetsel(array('id_plugin', 'prefixe'), 'spip_plugins', sql_in('prefixe', array_keys($insert_plugins))); foreach ($pls as $p) { $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; // remettre les necessite, utilise, librairie dans la cle 0 // comme SVP if ($dep = unserialize($insert_paquets[$c]['dependances']) and is_array($dep)) { foreach ($dep as $d => $contenu) { if ($contenu) { $new = array(); foreach ($contenu as $n) { unset($n['id']); $new[strtolower($n['nom'])] = $n; } $dep[$d] = array($new); } } $insert_paquets[$c]['dependances'] = serialize($dep); } } sql_insertq_multi('spip_paquets', $insert_paquets); svp_corriger_obsolete_paquets(array_keys($id_plugin_concernes)); } }