/** * Retrouver le prefixe des tables * @param string $serveur * @return string */ function base_prefixe_tables($serveur = '') { spip_connect($serveur); $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0]; $prefixe = $connexion['prefixe']; return $prefixe; }
function action_converser_dist() { if ($lang = _request('var_lang')) action_converser_post($lang); elseif ($lang = _request('var_lang_ecrire')) { if ( _request('arg') AND spip_connect()) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); sql_updateq("spip_auteurs", array("lang" => $lang), "id_auteur = " . $GLOBALS['visiteur_session']['id_auteur']); $GLOBALS['visiteur_session']['lang'] = $lang; $session = charger_fonction('session', 'inc'); if ($spip_session = $session($GLOBALS['visiteur_session'])) { spip_setcookie( 'spip_session', $spip_session, time() + 3600 * 24 * 14 ); } } action_converser_post($lang, 'spip_lang_ecrire'); } $redirect = rawurldecode(_request('redirect')); if (!$redirect) $redirect = _DIR_RESTREINT_ABS; $redirect = parametre_url($redirect,'lang',$lang,'&'); redirige_par_entete($redirect, true); }
function dump_afficher_tables_sauvegardees($status_file) { $status = dump_lire_status($status_file); $tables = $status['tables_copiees']; // lister les tables sauvegardees et aller verifier dans le dump // qu'on a le bon nombre de donnees dump_serveur($status['connect']); spip_connect('dump'); foreach ($tables as $t => $n) { $n = abs(intval($n)); $n_dump = intval(sql_countsel($t, '', '', '', 'dump')); $res = "{$t} "; if ($n_dump == 0 and $n == 0) { $res .= "(" . _T('dump:aucune_donnee') . ")"; } else { $res .= "({$n_dump}/{$n})"; } if ($n !== $n_dump) { $res = "<strong>{$res}</strong>"; } $tables[$t] = $res; } $n = floor(count($tables) / 2); $corps = "<div style='width:49%;float:left;'><ul class='spip'><li class='spip'>" . join("</li><li class='spip'>", array_slice($tables, 0, $n)) . "</li></ul></div>" . "<div style='width:49%;float:left;'><ul class='spip'><li>" . join("</li><li class='spip'>", array_slice($tables, $n)) . "</li></ul></div>" . "<div class='nettoyeur'></div>"; return $corps; }
/** * Vérifier si une table a crashé * * Pour cela, on vérifie si on peut se connecter à la base de données. * * @see message_crash_tables() * * @return bool|array * Si pas de table de crashée, on retourne `false`. * Sinon, retourne un tableau contenant tous les noms * des tables qui ont crashé. */ function verifier_crash_tables() { if (spip_connect()) { include_spip('base/serial'); include_spip('base/auxiliaires'); $crash = array(); foreach (array('tables_principales', 'tables_auxiliaires') as $com) { foreach ($GLOBALS[$com] as $table => $desc) { if (!sql_select('*', $table, '', '', '', 1) and !defined('spip_interdire_cache')) { # cas "LOST CONNECTION" $crash[] = $table; } } } #$crash[] = 'test'; if ($crash) { ecrire_meta('message_crash_tables', serialize($crash)); spip_log('crash des tables', 'err'); spip_log($crash, 'err'); } else { effacer_meta('message_crash_tables'); } return $crash; } return false; }
function exec_admin_repair_dist() { $ok = false; if (!spip_connect()) $message = _T('titre_probleme_technique'); else { $version_sql = sql_version(); if (!$version_sql) $message = _T('avis_erreur_connexion_mysql'); else { $s = $GLOBALS['connexions'][0]['type']; if ($s == 'mysql' AND version_compare($version_sql,'3.23.14','<')) $message = _T('avis_version_mysql', array('version_mysql' => " MySQL $version_sql")); else { $message = _T('texte_requetes_echouent'); $ok = true; } } $action = _T('texte_tenter_reparation'); } if ($ok) { $admin = charger_fonction('admin', 'inc'); echo $admin('admin_repair', $action, $message, true); } else { include_spip('inc/minipres'); echo minipres(_T('titre_reparation'), "<p>$message</p>"); } }
function base_restaurer_dist($titre = '', $reprise = false) { $status_file = _DUMP_STATUS_FILE; $status_file = _DIR_TMP . basename($status_file) . ".txt"; if (!lire_fichier($status_file, $status) or !($status = unserialize($status))) { } else { $redirect = parametre_url(generer_action_auteur('restaurer', _DUMP_STATUS_FILE), "step", intval(_request('step') + 1), '&'); $timeout = ini_get('max_execution_time'); // valeur conservatrice si on a pas reussi a lire le max_execution_time if (!$timeout) { $timeout = 30; } // parions sur une valeur tellement courante ... $max_time = time() + $timeout / 2; include_spip('inc/minipres'); @ini_set("zlib.output_compression", "0"); // pour permettre l'affichage au fur et a mesure $titre = _T('dump:restauration_en_cours') . " (" . count($status['tables']) . ") "; $balise_img = chercher_filtre('balise_img'); $titre .= $balise_img(chemin_image('searching.gif')); echo install_debut_html($titre); // script de rechargement auto sur timeout echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . $timeout * 1000 . ")"); echo "<div style='text-align: left'>\n"; dump_serveur($status['connect']); spip_connect('dump'); // au premier coup on ne fait rien sauf afficher l'ecran de sauvegarde if (_request('step')) { $options = array('callback_progression' => 'dump_afficher_progres', 'max_time' => $max_time, 'no_erase_dest' => lister_tables_noerase(), 'where' => $status['where'] ? $status['where'] : array(), 'desc_tables_dest' => array()); if ($desc = sql_getfetsel('valeur', 'spip_meta', "nom='dump_structure_temp'", '', '', '', '', 'dump') and $desc = unserialize($desc)) { $options['desc_tables_dest'] = $desc; } #var_dump(sql_allfetsel('nom,valeur','spip_meta',"",'','','','','dump')); #die(); $res = base_copier_tables($status_file, $status['tables'], 'dump', '', $options); } else { // mais on en profite pour reparer les version base pour etre sur de ne pas les perdre sql_updateq("spip_meta", array('impt' => 'oui'), "nom='version_installee'", '', 'dump'); sql_updateq("spip_meta", array('impt' => 'oui'), "nom LIKE '%_base_version'", '', 'dump'); } echo "</div>\n"; if (!$res) { echo dump_relance($redirect); } echo install_fin_html(); ob_end_flush(); flush(); if (!$res) { exit; } // quand on sort de $export avec true c'est qu'on a fini dump_end(_DUMP_STATUS_FILE, 'restaurer'); include_spip('inc/headers'); echo redirige_formulaire(generer_url_ecrire("restaurer", 'status=' . _DUMP_STATUS_FILE, '', true, true)); } }
function action_converser_dist() { $update_session = false; if (_request('arg') and spip_connect()) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); $update_session = true; } $lang = action_converser_changer_langue($update_session); $redirect = rawurldecode(_request('redirect')); if (!$redirect) { $redirect = _DIR_RESTREINT_ABS; } $redirect = parametre_url($redirect, 'lang', $lang, '&'); redirige_par_entete($redirect, true); }
/** * Lister toutes les tables d'un serveur * en excluant eventuellement une liste fournie * * @param string $serveur * @param array $tables * @param array $exclude * @param bool $affiche_vrai_prefixe * @return array */ function base_lister_toutes_tables($serveur = '', $tables = array(), $exclude = array(), $affiche_vrai_prefixe = false) { spip_connect($serveur); $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0]; $prefixe = $connexion['prefixe']; $p = '/^' . $prefixe . '/'; $res = $tables; foreach (sql_alltable(null, $serveur) as $t) { if (preg_match($p, $t)) { $t1 = preg_replace($p, 'spip', $t); if (!in_array($t1, $tables) and !in_array($t1, $exclude)) { $res[] = $affiche_vrai_prefixe ? $t : $t1; } } } sort($res); return $res; }
/** * Connexion a l'annuaire LDAP * Il faut passer par spip_connect() pour avoir les info * donc potentiellement indiquer un serveur * meme si dans les fait cet argument est toujours vide * * @param string $serveur * @return string */ function auth_ldap_connect($serveur='') { include_spip('base/connect_sql'); static $connexions_ldap = array(); if (isset($connexions_ldap[$serveur])) return $connexions_ldap[$serveur]; $connexion = spip_connect($serveur); if (!is_array($connexion['ldap'])) { if ($connexion['authentification']['ldap']) { $f = _DIR_CONNECT . $connexion['authentification']['ldap']; unset($GLOBALS['ldap_link']); if (is_readable($f)) include_once($f); if (isset($GLOBALS['ldap_link'])) $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'], 'base' => $GLOBALS['ldap_base']); else spip_log("connection LDAP $serveur mal definie dans $f"); if (isset($GLOBALS['ldap_champs'])) $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs']; } else spip_log("connection LDAP $serveur inconnue"); } return $connexions_ldap[$serveur]=$connexion['ldap']; }
function inc_sauvegarder_dist($status_file, $redirect = '') { $status_file = _DIR_TMP . basename($status_file) . ".txt"; if (!lire_fichier($status_file, $status) or !($status = unserialize($status))) { } else { $timeout = ini_get('max_execution_time'); // valeur conservatrice si on a pas reussi a lire le max_execution_time if (!$timeout) { $timeout = 30; } // parions sur une valeur tellement courante ... $max_time = time() + $timeout / 2; include_spip('inc/minipres'); @ini_set("zlib.output_compression", "0"); // pour permettre l'affichage au fur et a mesure $titre = _T('dump:sauvegarde_en_cours') . " (" . count($status['tables']) . ") "; $balise_img = chercher_filtre('balise_img'); $titre .= $balise_img(chemin_image('searching.gif')); echo install_debut_html($titre); // script de rechargement auto sur timeout echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . $timeout * 1000 . ")"); echo "<div style='text-align: left'>\n"; dump_serveur($status['connect']); spip_connect('dump'); // au premier coup on ne fait rien sauf afficher l'ecran de sauvegarde $res = false; if (_request('step')) { $options = array('callback_progression' => 'dump_afficher_progres', 'max_time' => $max_time, 'no_erase_dest' => lister_tables_noerase(), 'where' => $status['where'] ? $status['where'] : array()); $res = base_copier_tables($status_file, $status['tables'], '', 'dump', $options); } echo "</div>\n"; if (!$res and $redirect) { echo dump_relance($redirect); } echo install_fin_html(); ob_end_flush(); flush(); return $res; } }
/** * Reparer la base de donnees */ function exec_base_repair_dist() { $ok = false; if (!spip_connect()) { $message = _T('titre_probleme_technique'); } else { $version_sql = sql_version(); if (!$version_sql) { $message = _T('avis_erreur_connexion_mysql'); } else { $message = _T('texte_requetes_echouent'); $ok = true; } $action = _T('texte_tenter_reparation'); } if ($ok) { $admin = charger_fonction('admin', 'inc'); echo $admin('repair', $action, $message, true); } else { include_spip('inc/minipres'); echo minipres(_T('titre_reparation'), "<p>{$message}</p>"); } }
/** * Confirmer une signature * Retour a l'ecran du lien de confirmation d'une signature de petition. * var_confirm contient le hash de la signature. * Au premier appel on traite et on publie * Au second appel on retourne le resultat a afficher * * @staticvar string $confirm * @param <type> $var_confirm * @return string */ function action_confirmer_signature_dist($var_confirm = null) { static $confirm = null; // reponse mise en cache dans la session ? $code_message = 'signature_message_' . strval($var_confirm); if (isset($GLOBALS['visiteur_session'][$code_message])) { return $GLOBALS['visiteur_session'][$code_message]; } // reponse deja calculee depuis public/assembler.php if (isset($confirm)) { return $confirm; } if (is_null($var_confirm)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $var_confirm = $securiser_action(); } if (!$var_confirm or $var_confirm == 'publie' or $var_confirm == 'poubelle') { return ''; } if (!spip_connect()) { $confirm = _T('petitions:form_pet_probleme_technique'); return ''; } include_spip('inc/texte'); include_spip('inc/filtres'); // Suppression d'une signature par un moderateur ? // Cf. plugin notifications if (isset($_GET['refus'])) { // verifier validite de la cle de suppression // l'id_signature est dans var_confirm include_spip('inc/securiser_action'); if ($id_signature = intval($var_confirm) and ($_GET['refus'] == _action_auteur("supprimer signature {$id_signature}", '', '', 'alea_ephemere') or $_GET['refus'] == _action_auteur("supprimer signature {$id_signature}", '', '', 'alea_ephemere_ancien'))) { include_spip('action/editer_signature'); signature_modifier($id_signature, array("statut" => 'poubelle')); $confirm = _T('petitions:info_signature_supprimee'); } else { $confirm = _T('petitions:info_signature_supprimee_erreur'); } return ''; } $row = sql_fetsel('*', 'spip_signatures', "statut=" . sql_quote($var_confirm), '', "1"); if (!$row) { $confirm = _T('petitions:form_pet_aucune_signature'); return ''; } $id_signature = $row['id_signature']; $id_petition = $row['id_petition']; $adresse_email = $row['ad_email']; $url_site = $row['url_site']; $row = sql_fetsel('email_unique, site_unique, id_article', 'spip_petitions', "id_petition=" . intval($id_petition)); $email_unique = $row['email_unique'] == "oui"; $site_unique = $row['site_unique'] == "oui"; $id_article = $row['id_article']; include_spip('action/editer_signature'); signature_modifier($id_signature, array('statut' => 'publie')); if ($email_unique) { $r = "id_petition=" . intval($id_petition) . " AND ad_email=" . sql_quote($adresse_email); if (signature_entrop($r)) { $confirm = _T('petitions:form_pet_deja_signe'); } } if ($site_unique) { $r = "id_petition=" . intval($id_petition) . " AND url_site=" . sql_quote($url_site); if (signature_entrop($r)) { $confirm = _T('petitions:form_pet_site_deja_enregistre'); } } include_spip('inc/session'); if (!$confirm) { $confirm = _T('petitions:form_pet_signature_validee'); // noter dans la session que l'email est valide // de facon a permettre de signer les prochaines // petitions sans refaire un tour d'email session_set('email_confirme', $adresse_email); // invalider les pages ayant des boucles signatures include_spip('inc/invalideur'); suivre_invalideur("id='signature/{$id_signature}'"); suivre_invalideur("id='article/{$id_article}'"); } // Conserver la reponse dans la session du visiteur if ($confirm) { session_set($code_message, $confirm); } }
/** * Exécute une requête MySQL, munie d'une trace à la demande * * @param string $query Requête * @param string $serveur Nom de la connexion * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|resource|string|bool * - string : Texte de la requête si on ne l'exécute pas * - ressource|bool : Si requête exécutée * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ function spip_mysql_query($query, $serveur = '', $requeter = true) { $connexion =& $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; $query = _mysql_traite_query($query, $db, $prefixe); // renvoyer la requete inerte si demandee if (!$requeter) { return $query; } if (isset($_GET['var_profile'])) { include_spip('public/tracer'); $t = trace_query_start(); } else { $t = 0; } $connexion['last'] = $query; $connexion['total_requetes']++; // ajouter un debug utile dans log/mysql-slow.log ? $debug = ''; if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) { if (isset($GLOBALS['debug']['aucasou'])) { list(, $id, , $infos) = $GLOBALS['debug']['aucasou']; $debug .= " BOUCLE{$id} @ " . $infos[0] . " | "; } $debug .= " " . $_SERVER['REQUEST_URI'] . ' + ' . $GLOBALS['ip']; $debug = ' /*' . str_replace('*/', '@/', $debug) . ' */'; } $r = mysqli_query($link, $query . $debug); //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP if ($e = spip_mysql_errno($serveur)) { // Log d'un Gone Away if ($e == 2006) { //Si Gone Away on relance une connexion vierge //Fermer la connexion defaillante mysqli_close($connexion['link']); unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]); //Relancer une connexion vierge spip_connect($serveur); $connexion =& $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $link = $connexion['link']; //On retente au cas où $r = mysqli_query($link, $query . $debug); } } if ($e = spip_mysql_errno($serveur)) { // Log de l'erreur eventuelle $e .= spip_mysql_error($query, $serveur); } // et du fautif return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r; }
function actualise_plugins_actifs($pipe_recherche = false){ if (!spip_connect()) return false; $plugin_actifs = liste_chemin_plugin_actifs(); $plugin_liste = liste_plugin_files(); $plugin_new = array_intersect($plugin_actifs,$plugin_liste); $actifs_avant = $GLOBALS['meta']['plugin']; ecrire_plugin_actifs($plugin_new,$pipe_recherche); // retourner -1 si la liste des plugins actifs a change return (strcmp($GLOBALS['meta']['plugin'],$actifs_avant)==0) ? 1 : -1; }
function formulaires_signature_traiter_dist($id_article) { $reponse = _T('petitions:form_pet_probleme_technique'); include_spip('base/abstract_sql'); if (spip_connect()) { $controler_signature = charger_fonction('controler_signature', 'inc'); $reponse = $controler_signature($id_article, _request('session_nom'), _request('session_email'), _request('message'), _request('signature_nom_site'), _request('signature_url_site'), _request('url_page')); } return array('message_ok' => $reponse); }
/** * Retrouver le login interne lie a une info login saisie * la saisie peut correspondre a un login delegue * qui sera alors converti en login interne apres verification * * @param string $login * @param string $serveur * @return string/bool */ function auth_retrouver_login($login, $serveur = '') { if (!spip_connect($serveur)) { include_spip('inc/minipres'); echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); exit; } foreach ($GLOBALS['liste_des_authentifications'] as $methode) { if ($auteur = auth_administrer('retrouver_login', array($methode, $login, $serveur))) { return $auteur; } } return false; }
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { // Second appel, destine a l'enregistrement du cache sur le disque if (isset($chemin_cache)) return creer_cache($page, $chemin_cache); // Toute la suite correspond au premier appel $contexte_implicite = $page['contexte_implicite']; // Cas ignorant le cache car completement dynamique if ($_SERVER['REQUEST_METHOD'] == 'POST' OR (substr($contexte_implicite['cache'],0,8)=='modeles/') OR (_request('connect')) // Mode auteur authentifie appelant de ecrire/ : il ne faut rien lire du cache // et n'y ecrire que la compilation des squelettes (pas les pages produites) // car les references aux repertoires ne sont pas relatifs a l'espace public OR test_espace_prive()) { $use_cache = -1; $lastmodified = 0; $chemin_cache = ""; $page = array(); return; } // Controler l'existence d'un cache nous correspondant $chemin_cache = generer_nom_fichier_cache($contexte, $page); $lastmodified = 0; // charger le cache s'il existe if (lire_fichier(_DIR_CACHE . $chemin_cache, $page)) $page = @unserialize($page); else $page = array(); // s'il est sessionne, charger celui correspondant a notre session if (isset($page['invalideurs']) AND isset($page['invalideurs']['session'])) { $chemin_cache_session = $chemin_cache . '_' . spip_session(); if (lire_fichier(_DIR_CACHE . $chemin_cache_session, $page_session) AND $page_session = @unserialize($page_session) AND $page_session['lastmodified'] >= $page['lastmodified']) $page = $page_session; else $page = array(); } // HEAD : cas sans jamais de calcul pour raisons de performance if ($_SERVER['REQUEST_METHOD'] == 'HEAD') { $use_cache = 0; $page = array('contexte_implicite'=>$contexte_implicite); return; } // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, // on supprime le cache if ($GLOBALS['var_mode'] && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME)) ) { $page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE.$chemin_cache); if ($chemin_cache_session) supprimer_fichier(_DIR_CACHE.$chemin_cache_session); } // $delais par defaut (pour toutes les pages sans #CACHE{}) if (!isset($GLOBALS['delais'])) { define('_DUREE_CACHE_DEFAUT', 24*3600); $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; } // determiner la validite de la page if ($page) { $use_cache = cache_valide($page, $page['lastmodified']); // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul $page['contexte_implicite'] = $contexte_implicite; if (!$use_cache) { // $page est un cache utilisable gunzip_page($page); return; } } else { $page = array('contexte_implicite'=>$contexte_implicite); $use_cache = cache_valide($page,0); // fichier cache absent : provoque le calcul } // Si pas valide mais pas de connexion a la base, le garder quand meme if (!spip_connect()) { if (isset($page['texte'])) { gunzip_page($page); $use_cache = 0; } else { spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); include_spip('inc/minipres'); return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); } } if ($use_cache < 0) $chemin_cache = ''; return; }
/** * cron() : execution des taches de fond * On peut lui passer en 1er (ou 2e arg pour compat) * le tableau de taches attendu par inc_genie() * Retourne Vrai si un tache a pu etre effectuee * pas de verrou ici : les verrous sont geres sur chaque tache * a chaque execution * * http://code.spip.net/@cron * * @param array $taches * taches forcees * @param array $taches_old * taches forcees, pour compat avec ancienne syntaxe * @return bool */ function cron($taches = array(), $taches_old = array()) { // si pas en mode cron force, laisser tomber. if (!defined('_DIRECT_CRON_FORCE')) { return false; } if (!is_array($taches)) { $taches = $taches_old; } // compat anciens appels // si taches a inserer en base et base inaccessible, laisser tomber // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php) if ($taches and count($taches) and !spip_connect()) { return false; } spip_log("cron !", 'jq' . _LOG_DEBUG); if ($genie = charger_fonction('genie', 'inc', true)) { return $genie($taches); } return false; }
function spip_connect_sql($version, $ins = '', $serveur = '', $cont = false) { $desc = spip_connect($serveur, $version); if (function_exists($f = @$desc[$version][$ins])) { return $f; } if ($cont) { return $desc; } if ($ins) { spip_log("Le serveur '{$serveur}' version {$version} n'a pas '{$ins}'", _LOG_ERREUR); } include_spip('inc/minipres'); echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); exit; }
/** * Retourne la description d'une table SQL * * Cela sert notamment au moment de la compilation des boucles, critères et balise. * * Les champs et clés de la tables sont retrouvés prioritairement via le * gestionnaire de base de données. Les descriptions sont complétées, * pour les tables éditoriales, des informations déclarées ou construites * par la déclaration des objets éditoriaux. * * @example * $trouver_table = charger_fonction('trouver_table', 'base'); * $desc = $trouver_table('spip_groupes_mots'); * * Cette fonction intervient à la compilation, mais aussi pour la balise * contextuelle EXPOSE ou certains critères. * * L'ensemble des descriptions de table d'un serveur est stocké dans un * fichier cache/sql_desc.txt par soucis de performance. Un appel * avec $nom vide est une demande explicite de vidange de ce cache * * @see lister_tables_objets_sql() * * @api * @param string $nom * Nom de la table * Vide '' demande de vider le cache des discriptions * @param string $serveur * Nom du connecteur * @param bool $table_spip * Indique s'il faut transformer le préfixe de table * @return array|bool * false si table introuvable * tableau de description de la table sinon, en particulier : * - field : tableau des colonnes SQL et leur description (comme dans serial.php ou objets.php) * - key : tableau des KEY (comme dans serial.php ou objets.php) * - table et table_sql : nom de la table (avec spip_ en préfixe) * - id_table : nom SPIP de la table (type de boucle) * le compilateur produit FROM $r['table'] AS $r['id_table'] * - Toutes les autres informations des objets éditoriaux si la table est l'un d'eux. * * **/ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) { static $nom_cache_desc_sql = array(); if (!spip_connect($serveur) or !preg_match('/^[a-zA-Z0-9._-]*/', $nom)) { return null; } $connexion =& $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $objets_sql = lister_tables_objets_sql("::md5"); // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe // ce qui permet une auto invalidation en cas de modif manuelle du fichier // de connexion, et tout risque d'ambiguite if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) { $nom_cache_desc_sql[$serveur][$objets_sql] = _DIR_CACHE . 'sql_desc_' . ($serveur ? "{$serveur}_" : "") . substr(md5($connexion['db'] . ":" . $connexion['prefixe'] . ":{$objets_sql}"), 0, 8) . '.txt'; // nouveau nom de cache = nouvelle version en memoire unset($connexion['tables']); } // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions if (!$nom) { spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]); $connexion['tables'] = array(); return null; } $nom_sql = $nom; if (preg_match('/\\.(.*)$/', $nom, $s)) { $nom_sql = $s[1]; } else { $nom_sql = $nom; } $fdesc = $desc = ''; $connexion =& $GLOBALS['connexions'][$serveur ? $serveur : 0]; // base sous SPIP: gerer les abreviations explicites des noms de table if ($connexion['spip_connect_version']) { if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) { $nom = $GLOBALS['table_des_tables'][$nom]; $nom_sql = 'spip_' . $nom; } } // si c'est la premiere table qu'on cherche // et si on est pas explicitement en recalcul // on essaye de recharger le cache des decriptions de ce serveur // dans le fichier cache if (!isset($connexion['tables'][$nom_sql]) and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul' and (!isset($connexion['tables']) or !$connexion['tables'])) { if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache) and $desc_cache = unserialize($desc_cache)) { $connexion['tables'] = $desc_cache; } } if ($table_spip and !isset($connexion['tables'][$nom_sql])) { if (isset($GLOBALS['tables_principales'][$nom_sql])) { $fdesc = $GLOBALS['tables_principales'][$nom_sql]; } elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) { $nom_sql = 'spip_' . $nom; $fdesc =& $GLOBALS['tables_principales'][$nom_sql]; } elseif (isset($GLOBALS['tables_auxiliaires'][$n = $nom]) or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])) { $nom_sql = $n; $fdesc =& $GLOBALS['tables_auxiliaires'][$n]; } # table locale a cote de SPIP, comme non SPIP: } if (!isset($connexion['tables'][$nom_sql])) { // La *vraie* base a la priorite $desc = sql_showtable($nom_sql, $table_spip, $serveur); if (!$desc or !$desc['field']) { if (!$fdesc) { spip_log("trouver_table: table inconnue '{$serveur}' '{$nom}'", _LOG_INFO_IMPORTANTE); return null; } // on ne sait pas lire la structure de la table : // on retombe sur la description donnee dans les fichiers spip $desc = $fdesc; $desc['exist'] = false; } else { $desc['exist'] = true; } $desc['table'] = $desc['table_sql'] = $nom_sql; $desc['connexion'] = $serveur; // charger les infos declarees pour cette table // en lui passant les infos connues // $desc est prioritaire pour la description de la table $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc); // si tables_objets_sql est bien fini d'init, on peut cacher $connexion['tables'][$nom_sql] = $desc; $res =& $connexion['tables'][$nom_sql]; // une nouvelle table a ete decrite // mettons donc a jour le cache des descriptions de ce serveur if (is_writeable(_DIR_CACHE)) { ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true); } } else { $res =& $connexion['tables'][$nom_sql]; } // toujours retourner $nom dans id_table $res['id_table'] = $nom; return $res; }
#include ("/var/www/lcs/includes/user_lcs.inc.php"); include ("/var/www/lcs/includes/config.inc.php"); include ("/var/www/Annu/includes/ldap.inc.php"); $authlink=mysql_connect("$HOSTAUTH", "$USERAUTH", "$PASSAUTH"); list($user, $groups)=people_get_variables($login, true); if ( $action=="login" ) { if ( $login ) { // ou est l'espace prive ? @define('_DIR_RESTREINT_ABS', 'ecrire/'); include_once _DIR_RESTREINT_ABS.'inc_version.php'; include_once _DIR_RESTREINT_ABS.'inc/vieilles_defs.php'; include_spip('inc/cookie'); include_once _DIR_RESTREINT_ABS.'auth/ldap.php'; include_once 'config/ldap.php'; spip_connect(); ### DBG fich_debug("DBG >> login : $login\n"); // Si l'utilisateur figure deja dans la base, y recuperer les infos $result = spip_query("SELECT * FROM spip_auteurs WHERE login="******" AND source='ldap'"); if (!sql_count($result)) { ### DBG fich_debug("DBG >> Login : $login n'est pas dans la base.\n"); fich_debug("DBG >> statut : ".$GLOBALS['meta']["ldap_statut_import"]."\n"); fich_debug("DBG >> ldap_base : ".$GLOBALS['ldap_base']."\n"); $desc['nom'] = $user["fullname"]; $desc['statut'] = "1comite"; $desc['login'] = $login; $desc['source'] = 'ldap';
/** * Marquer la procédure de dump comme finie * * @param string $status_file * Fichier qui mémorise les infos utiles concernant la sauvegarde en cours * @param string $action * Type d'action supplémentaire à réaliser : * * - restaurer : supprimer la structure qui était stockée dans le dump * - 'auvegarder : stocker dans le dump la structure de la base source */ function dump_end($status_file, $action = '') { $status_file = _DIR_TMP . basename($status_file) . ".txt"; if (!lire_fichier($status_file, $status) or !($status = unserialize($status))) { return; } switch ($action) { case 'restaurer': // supprimer la structure qui etait stockee dans le dump sql_delete('spip_meta', "nom='dump_structure_temp'"); break; case 'sauvegarder': // stocker dans le dump la structure de la base source $structure = array(); foreach ($status['tables_copiees'] as $t => $n) { $structure[$t] = sql_showtable($t, true); } dump_serveur($status['connect']); spip_connect('dump'); // si spip_meta n'a pas ete backup elle n'est pas dans le dump, il faut la creer pour y stocker cette meta if (!sql_showtable("spip_meta", true, "dump")) { $desc = sql_showtable("spip_meta", true); sql_create("spip_meta", $desc['field'], $desc['key'], false, false, "dump"); } sql_delete('spip_meta', "nom='dump_structure_temp'", 'dump'); #enlever une vieille structure deja la, au cas ou sql_insertq('spip_meta', array('nom' => 'dump_structure_temp', 'valeur' => serialize($structure), 'impt' => 'non'), array(), 'dump'); break; } $status['etape'] = 'fini'; ecrire_fichier($status_file, serialize($status)); }
/** * Interface du gestionnaire de cache * Si son 3e argument est non vide, elle passe la main a creer_cache * Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI) * et affecte les 4 autres parametres recus par reference: * - use_cache qui vaut * -1 s'il faut calculer la page sans la mettre en cache * 0 si on peut utiliser un cache existant * 1 s'il faut calculer la page et la mettre en cache * - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable * - page qui est le tableau decrivant la page, si le cache la contenait * - lastmodified qui vaut la date de derniere modif du fichier. * Elle retourne '' si tout va bien * un message d'erreur si le calcul de la page est totalement impossible * * http://code.spip.net/@public_cacher_dist * * @param array $contexte * @param int $use_cache * @param string $chemin_cache * @param array $page * @param int $lastmodified * @return string|void */ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { # fonction de cache minimale : dire "non on ne met rien en cache" # $use_cache = -1; return; // Second appel, destine a l'enregistrement du cache sur le disque if (isset($chemin_cache)) { return creer_cache($page, $chemin_cache); } // Toute la suite correspond au premier appel $contexte_implicite = $page['contexte_implicite']; // Cas ignorant le cache car completement dynamique if ($_SERVER['REQUEST_METHOD'] == 'POST' or _request('connect')) { $use_cache = -1; $lastmodified = 0; $chemin_cache = ""; $page = array(); return; } // Controler l'existence d'un cache nous correspondant $chemin_cache = generer_nom_fichier_cache($contexte, $page); $lastmodified = 0; // charger le cache s'il existe (et si il a bien le bon hash = anticollision) if (!($page = lire_cache($chemin_cache))) { $page = array(); } // s'il est sessionne, charger celui correspondant a notre session if (isset($page['invalideurs']) and isset($page['invalideurs']['session'])) { $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), array("session" => spip_session())); if ($page_session = lire_cache($chemin_cache_session) and $page_session['lastmodified'] >= $page['lastmodified']) { $page = $page_session; } else { $page = array(); } } // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? if (isset($GLOBALS['meta']['invalider'])) { // ne le faire que si la base est disponible if (spip_connect()) { include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE . $chemin_cache); if (isset($chemin_cache_session) and $chemin_cache_session) { supprimer_fichier(_DIR_CACHE . $chemin_cache_session); } } } // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, // on supprime le cache if (defined('_VAR_MODE') && _VAR_MODE && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME))) { $page = array('contexte_implicite' => $contexte_implicite); // ignorer le cache deja lu include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE . $chemin_cache); if (isset($chemin_cache_session) and $chemin_cache_session) { supprimer_fichier(_DIR_CACHE . $chemin_cache_session); } } // $delais par defaut // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé // qui sont a cache nul par defaut if (!isset($GLOBALS['delais'])) { if (!defined('_DUREE_CACHE_DEFAUT')) { define('_DUREE_CACHE_DEFAUT', 24 * 3600); } $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; } // determiner la validite de la page if ($page) { $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0); // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul $page['contexte_implicite'] = $contexte_implicite; if (!$use_cache) { // $page est un cache utilisable gunzip_page($page); return; } } else { $page = array('contexte_implicite' => $contexte_implicite); $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul } // Si pas valide mais pas de connexion a la base, le garder quand meme if (!spip_connect()) { if (isset($page['texte'])) { gunzip_page($page); $use_cache = 0; } else { spip_log("Erreur base de donnees, impossible utiliser {$chemin_cache}"); include_spip('inc/minipres'); return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503)); } } if ($use_cache < 0) { $chemin_cache = ''; } return; }
/** * Calcule ou modifie la liste des plugins actifs et recompile les fichiers caches * qui leurs sont relatifs * * @note * Les ecrire_meta() doivent en principe aussi initialiser la valeur a vide * si elle n'existe pas risque de pb en php5 a cause du typage ou de null * (verifier dans la doc php) * * @param string|string[] $plugin * Plugin ou plugins concernés (leur chemin depuis le répertoire plugins) * @param bool $pipe_recherche * ? * @param string $operation * - raz : recalcule tout * - ajoute : ajoute le plugin indiqué à la liste des plugins actifs * - enleve : enleve le plugin indiqué de la liste des plugins actifs * - force : ? * @return bool * true si il y a eu des modifications sur la liste des plugins actifs, false sinon **/ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') { // creer le repertoire cache/ si necessaire ! (installation notamment) $cache = sous_repertoire(_DIR_CACHE, '', false, true); // Si on n'a ni cache accessible, ni connexion SQL, on ne peut pas faire grand chose encore. if (!$cache and !spip_connect()) { return false; } if ($operation != 'raz') { $plugin_valides = liste_chemin_plugin_actifs(); $plugin_valides = is_plugin_dir($plugin_valides); if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) { $plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL); $plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL); $plugin_valides = array_merge($plugin_valides, $plugin_valides_supp); } // si des plugins sont en attentes (coches mais impossible a activer) // on les reinjecte ici if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) { $plugin_valides = $plugin_valides + liste_chemin_plugin($a); } if ($operation == 'ajoute') { $plugin = array_merge($plugin_valides, $plugin); } elseif ($operation == 'enleve') { $plugin = array_diff($plugin_valides, $plugin); } else { $plugin = $plugin_valides; } } $actifs_avant = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : ''; // si une fonction de gestion de dependances existe, l'appeler ici if ($ajouter_dependances = charger_fonction("ajouter_dependances", "plugins", true)) { $plugin = $ajouter_dependances($plugin); } // recharger le xml des plugins a activer // on forcer le reload ici, meme si le fichier xml n'a pas change // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations // pourra etre evite quand on ne supportera plus les plugin.xml // en deplacant la detection de ces fichiers dans la compilation ci dessous list($infos, $liste) = liste_plugin_valides($plugin, true); // trouver l'ordre d'activation list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste); if ($reste) { plugins_erreurs($reste, $liste, $infos); } // Ignorer les plugins necessitant une lib absente // et preparer la meta d'entete Http $err = $msg = $header = array(); foreach ($plugin_valides as $p => $resume) { $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : ""); if ($resume['dir']) { foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { if (!find_in_path($l['nom'], 'lib/')) { $err[$p] = $resume; $msg[$p][] = $l; unset($plugin_valides[$p]); } } } } if ($err) { plugins_erreurs($err, '', $infos, $msg); } if (isset($GLOBALS['meta']['message_crash_plugins'])) { effacer_meta('message_crash_plugins'); } ecrire_meta('plugin', serialize($plugin_valides)); $liste = array_diff_key($liste, $plugin_valides); ecrire_meta('plugin_attente', serialize($liste)); $header = strtolower(implode(",", $header)); ecrire_meta('plugin_header', substr($header, 0, 900)); if (!isset($GLOBALS['spip_header_silencieux']) or !$GLOBALS['spip_header_silencieux']) { ecrire_fichier(_DIR_VAR . "config.txt", (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : "Composed-By: SPIP") . ' ' . $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header); } else { @unlink(_DIR_VAR . "config.txt"); } // generer charger_plugins_chemin.php plugins_precompile_chemin($plugin_valides, $ordre); // generer les fichiers // charger_plugins_options.php // charger_plugins_fonctions.php // et retourner les fichiers a verifier plugins_precompile_xxxtions($plugin_valides, $ordre); // mise a jour de la matrice des pipelines $prepend_code = pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche); // generer le fichier _CACHE_PIPELINE pipeline_precompile($prepend_code); // attendre eventuellement l'invalidation du cache opcode spip_attend_invalidation_opcode_cache(); if (spip_connect()) { // lancer et initialiser les nouveaux crons ! include_spip('inc/genie'); genie_queue_watch_dist(); } return $GLOBALS['meta']['plugin'] != $actifs_avant; }
/** * Exécute les prochaînes tâches cron et replanifie les suivantes * * Prend une par une les tâches en attente et les lance, dans la limite * d'un temps disponible total et d'un nombre maxi de tâches * * La date de la prochaine tâche à exécuter est mise à jour * après chaque chaque tâche finie afin de relancer le scheduler uniquement * quand c'est nécessaire * * @uses queue_sleep_time_to_next_job() * @uses queue_error_handler() Pour capturer les erreurs en fin de hit * @uses queue_start_job() * @uses queue_close_job() * @uses queue_update_next_job_time() * * @param array $force_jobs * list of id_job to execute when provided * @return null|bool * - null : pas de tâche à réaliser maintenant * - false : pas de connexion SQL * - true : une planification a été faite. */ function queue_schedule($force_jobs = null) { $time = time(); if (defined('_DEBUG_BLOCK_QUEUE')) { spip_log("_DEBUG_BLOCK_QUEUE : schedule stop", 'jq' . _LOG_DEBUG); return; } // rien a faire si le prochain job est encore dans le futur if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { spip_log("queue_sleep_time_to_next_job", 'jq' . _LOG_DEBUG); return; } include_spip('base/abstract_sql'); // on ne peut rien faire si pas de connexion SQL if (!spip_connect()) { return false; } if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { $max_time = ini_get('max_execution_time') / 2; // valeur conservatrice si on a pas reussi a lire le max_execution_time if (!$max_time) { $max_time = 5; } define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. } $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; spip_log("JQ schedule {$time} / {$end_time}", 'jq' . _LOG_DEBUG); if (!defined('_JQ_MAX_JOBS_EXECUTE')) { define('_JQ_MAX_JOBS_EXECUTE', 200); } $nbj = 0; // attraper les jobs // dont la date est passee (echus en attente), // par ordre : // - de priorite // - de date // lorsqu'un job cron n'a pas fini, sa priorite est descendue // pour qu'il ne bloque pas les autres jobs en attente if (is_array($force_jobs) and count($force_jobs)) { $cond = "status=" . intval(_JQ_SCHEDULED) . " AND " . sql_in("id_job", $force_jobs); } else { $now = date('Y-m-d H:i:s', $time); $cond = "status=" . intval(_JQ_SCHEDULED) . " AND date<=" . sql_quote($now); } register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); do { if ($row = array_shift($res)) { $nbj++; // il faut un verrou, a base de sql_delete if (sql_delete('spip_jobs', "id_job=" . intval($row['id_job']) . " AND status=" . intval(_JQ_SCHEDULED))) { #spip_log("JQ schedule job ".$nbj." OK",'jq'); // on reinsert dans la base aussitot avec un status=_JQ_PENDING $row['status'] = _JQ_PENDING; $row['date'] = date('Y-m-d H:i:s', $time); sql_insertq('spip_jobs', $row); // on a la main sur le job : // l'executer $result = queue_start_job($row); $time = time(); queue_close_job($row, $time, $result); } } spip_log("JQ schedule job end time " . $time, 'jq' . _LOG_DEBUG); } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); spip_log("JQ schedule end time " . time(), 'jq' . _LOG_DEBUG); if ($row = array_shift($res)) { queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP spip_log("JQ encore !", 'jq' . _LOG_DEBUG); } else { queue_update_next_job_time(); } return true; }
function menu_langues($nom_select, $default = '') { include_spip('inc/actions'); $langues = liste_options_langues($nom_select); $ret = ""; if (!count($langues)) { return ''; } if (!$default) { $default = $GLOBALS['spip_lang']; } foreach ($langues as $l) { $selected = $l == $default ? ' selected=\'selected\'' : ''; $ret .= "<option value='{$l}'{$selected}>[" . $l . "] " . traduire_nom_langue($l) . "</option>\n"; } if (!test_espace_prive()) { $cible = self(); $base = ''; } else { $cible = self(); $base = spip_connect() ? 'base' : ''; } $change = ' onchange="this.parentNode.parentNode.submit()"'; return generer_action_auteur('converser', $base, $cible, select_langues($nom_select, $change, $ret) . "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>", " method='post'"); }
function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') { // creer le repertoire cache/ si necessaire ! (installation notamment) sous_repertoire(_DIR_CACHE, '', false, true); if (!spip_connect()) { return false; } if ($operation != 'raz') { $plugin_valides = liste_chemin_plugin_actifs(); // si des plugins sont en attentes (coches mais impossible a activer) // on les reinjecte ici if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) { $plugin_valides = $plugin_valides + liste_chemin_plugin($a); } $plugin_valides = is_plugin_dir($plugin_valides); if ($operation == 'ajoute') { $plugin = array_merge($plugin_valides, $plugin); } elseif ($operation == 'enleve') { $plugin = array_diff($plugin_valides, $plugin); } else { $plugin = $plugin_valides; } } $actifs_avant = $GLOBALS['meta']['plugin']; // recharger le xml des plugins a activer // on forcer le reload ici, meme si le fichier xml n'a pas change // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations // pourra etre evite quand on ne supportera plus les plugin.xml // en deplacant la detection de ces fichiers dans la compilation ci dessous list($infos, $liste) = liste_plugin_valides($plugin, true); // trouver l'ordre d'activation list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste); if ($reste) { plugins_erreurs($reste, $liste, $infos); } // Ignorer les plugins necessitant une lib absente // et preparer la meta d'entete Http $err = $msg = $header = array(); foreach ($plugin_valides as $p => $resume) { $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : ""); if ($resume['dir']) { foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { if (!find_in_path($l['nom'], 'lib/')) { $err[$p] = $resume; $msg[$p][] = $l; unset($plugin_valides[$p]); } } } } if ($err) { plugins_erreurs($err, '', $infos, $msg); } if (isset($GLOBALS['meta']['message_crash_plugins'])) { effacer_meta('message_crash_plugins'); } ecrire_meta('plugin', serialize($plugin_valides)); $liste = array_diff_key($liste, $plugin_valides); ecrire_meta('plugin_attente', serialize($liste)); ecrire_meta('plugin_header', substr(strtolower(implode(",", $header)), 0, 900)); // generer charger_plugins_chemin.php plugins_precompile_chemin($plugin_valides, $ordre); // generer les fichiers // charger_plugins_options.php // charger_plugins_fonctions.php // et retourner les fichiers a verifier plugins_precompile_xxxtions($plugin_valides, $ordre); // mise a jour de la matrice des pipelines pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche); // generer le fichier _CACHE_PIPELINE pipeline_precompile(); // lancer et initialiser les nouveaux crons ! include_spip('inc/genie'); genie_queue_watch_dist(); return $GLOBALS['meta']['plugin'] != $actifs_avant; }
/** * cron() : execution des taches de fond * On peut lui passer en 1er (ou 2e arg pour compat) * le tableau de taches attendu par inc_genie() * Retourne Vrai si un tache a pu etre effectuee * pas de verrou ici : les verrous sont geres sur chaque tache * a chaque execution * * http://doc.spip.org/@cron * * @param array $taches * taches forcees * @param array $taches_old * taches forcees, pour compat avec ancienne syntaxe * @return bool */ function cron($taches = array(), $taches_old = array()) { // si pas en mode cron force // ou si base inaccessible, laisser tomber. if (!defined('_DIRECT_CRON_FORCE') or !spip_connect()) { return false; } spip_log("cron !", 'jq' . _LOG_DEBUG); if (!is_array($taches)) { $taches = $taches_old; } // compat anciens appels if ($genie = charger_fonction('genie', 'inc', true)) { $genie($taches); return true; } return false; }
function base_trouver_table_dist($nom, $serveur=''){ static $nom_cache_desc_sql=array(); global $tables_principales, $tables_auxiliaires, $table_des_tables; if (!spip_connect($serveur) OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom)) return null; $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe // ce qui permet une auto invalidation en cas de modif manuelle du fichier // de connexion, et tout risque d'ambiguite if (!isset($nom_cache_desc_sql[$serveur])) $nom_cache_desc_sql[$serveur] = _DIR_CACHE . 'sql_desc_' . ($serveur ? "$serveur_":"") . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8) .'.txt'; // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions if (!$nom){ spip_unlink($nom_cache_desc_sql[$serveur]); $connexion['tables'] = array(); return null; } $nom_sql = $nom; if (preg_match('/\.(.*)$/', $nom, $s)) $nom_sql = $s[1]; else $nom_sql = $nom; $desc = ''; // base sous SPIP: gerer les abreviations explicites des noms de table if ($connexion['spip_connect_version']) { include_spip('public/interfaces'); if (isset($table_des_tables[$nom])) { $nom = $table_des_tables[$nom]; $nom_sql = 'spip_' . $nom; } } // si c'est la premiere table qu'on cherche // et si on est pas explicitement en recalcul // on essaye de recharger le cache des decriptions de ce serveur // dans le fichier cache if (!isset($connexion['tables'][$nom]) AND $GLOBALS['var_mode']!=='recalcul' AND (!isset($connexion['tables']) OR !$connexion['tables'])) { if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache) AND $desc_cache=unserialize($desc_cache)) $connexion['tables'] = $desc_cache; } if (!isset($connexion['tables'][$nom])) { include_spip('base/serial'); if (isset($tables_principales[$nom_sql])) $fdesc = $tables_principales[$nom_sql]; // meme si pas d'abreviation declaree, trouver la table spip_$nom // si c'est une table principale, // puisqu'on le fait aussi pour les tables auxiliaires elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){ $nom_sql = 'spip_' . $nom; $fdesc = &$tables_principales[$nom_sql]; } else { include_spip('base/auxiliaires'); if (isset($tables_auxiliaires['spip_' .$nom])) { $nom_sql = 'spip_' . $nom; $fdesc = &$tables_auxiliaires[$nom_sql]; } else { # table locale a cote de SPIP, comme non SPIP: $fdesc = array(); } } // faut il interpreter le prefixe 'spip_' ? $transposer_spip = ($nom_sql != $nom); // La *vraie* base a la priorite if (true /* !$bdesc OR !$bdesc['field'] */) { $desc = sql_showtable($nom_sql, $transposer_spip, $serveur); if (!$desc OR !$desc['field']) { if (!$fdesc) { spip_log("trouver_table: table inconnue '$serveur' '$nom'"); return null; } // on ne sait pas lire la structure de la table : // on retombe sur la description donnee dans les fichiers spip $desc = $fdesc; } } // S'il n'y a pas de key (cas d'une VIEW), // on va inventer une PRIMARY KEY en prenant le premier champ // de la table if (!$desc['key']){ $p = array_keys($desc['field']); $desc['key']['PRIMARY KEY'] = array_shift($p); } $desc['table']= $nom_sql; $desc['connexion']= $serveur; // objet_type peut provoquer un appel reentrant ici. // pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve $connexion['tables'][$nom] = $desc; $table = table_objet(objet_type($nom)); $desc['titre'] = isset($GLOBALS['table_titre'][$table]) ? $GLOBALS['table_titre'][$table] : (isset($desc['field']['titre']) ? 'titre' : ''); $connexion['tables'][$nom] = $desc; // une nouvelle table a ete decrite // mettons donc a jour le cache des descriptions de ce serveur if (is_writeable(_DIR_CACHE)) ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables'])); } $connexion['tables'][$nom]['id_table']=$nom; return $connexion['tables'][$nom]; }
function formulaires_signature_reponse_confirmation_dist($var_confirm = '') { static $confirm = null; // reponse mise en cache dans la session ? $code_message = 'signature_message_'.strval($var_confirm); if (isset($GLOBALS['visiteur_session'][$code_message])) return $GLOBALS['visiteur_session'][$code_message]; // reponse deja calculee depuis public/assembler.php if (isset($confirm)) return $confirm; if ($var_confirm == 'publie' OR $var_confirm == 'poubelle') return ''; if (!spip_connect()) { $confirm = _T('form_pet_probleme_technique'); return ''; } include_spip('inc/texte'); include_spip('inc/filtres'); // Suppression d'une signature par un moderateur ? // Cf. plugin notifications if (isset($_GET['refus'])) { // verifier validite de la cle de suppression // l'id_signature est dans var_confirm include_spip('inc/securiser_action'); if ($id_signature = intval($var_confirm) AND ( $_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere') OR $_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere_ancien') )) { sql_updateq("spip_signatures", array("statut" => 'poubelle'), "id_signature=$id_signature"); $confirm = _T('info_signature_supprimee'); } else $confirm = _T('info_signature_supprimee_erreur'); return ''; } $row = sql_fetsel('*', 'spip_signatures', "statut=" . sql_quote($var_confirm), '', "1"); if (!$row) { $confirm = _T('form_pet_aucune_signature'); return ''; } $id_signature = $row['id_signature']; $id_article = $row['id_article']; $adresse_email = $row['ad_email']; $url_site = $row['url_site']; $row = sql_fetsel('email_unique, site_unique', 'spip_petitions', "id_article=$id_article"); $email_unique = $row['email_unique'] == "oui"; $site_unique = $row['site_unique'] == "oui"; sql_updateq('spip_signatures', array('statut' => 'publie', 'date_time' => date('Y-m-d H:i:s')), "id_signature=$id_signature"); if ($email_unique) { $r = "id_article=$id_article AND ad_email=" . sql_quote($adresse_email); if (signature_entrop($r)) $confirm = _T('form_pet_deja_signe'); } if ($site_unique) { $r = "id_article=$id_article AND url_site=" . sql_quote($url_site); if (signature_entrop($r)) $confirm = _T('form_pet_site_deja_enregistre'); } include_spip('inc/session'); if (!$confirm) { $confirm = _T('form_pet_signature_validee'); // noter dans la session que l'email est valide // de facon a permettre de signer les prochaines // petitions sans refaire un tour d'email session_set('email_confirme', $adresse_email); // invalider les pages ayant des boucles signatures include_spip('inc/invalideur'); suivre_invalideur("id='varia/pet$id_article'"); } // Conserver la reponse dans la session du visiteur if ($confirm) session_set($code_message, $confirm); }