예제 #1
0
파일: dump.php 프로젝트: genma/spip_ynh
/**
 * 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;
}
예제 #2
0
파일: converser.php 프로젝트: rhertzog/lcs
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);
}
예제 #3
0
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;
}
예제 #4
0
파일: maintenance.php 프로젝트: JLuc/SPIP
/**
 * 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;
}
예제 #5
0
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>");
	}
}
예제 #6
0
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));
    }
}
예제 #7
0
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);
}
예제 #8
0
파일: dump.php 프로젝트: loorenzooo/aslfc
/**
 * 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;
}
예제 #9
0
파일: ldap.php 프로젝트: rhertzog/lcs
/**
 * 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'];
}
예제 #10
0
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;
    }
}
예제 #11
0
파일: base_repair.php 프로젝트: nursit/SPIP
/**
 * 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>");
    }
}
예제 #12
0
/**
 * 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);
    }
}
예제 #13
0
/**
 * 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;
}
예제 #14
0
파일: plugin.php 프로젝트: rhertzog/lcs
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;
}
예제 #15
0
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);
}
예제 #16
0
파일: auth.php 프로젝트: loorenzooo/aslfc
/**
 * 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;
}
예제 #17
0
파일: cacher.php 프로젝트: rhertzog/lcs
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;
}
예제 #18
0
/**
 * 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;
}
예제 #19
0
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;
}
예제 #20
0
/**
 * 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;
}
예제 #21
0
#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';
예제 #22
0
/**
 * 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));
}
예제 #23
0
/**
 * 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;
}
예제 #24
0
파일: plugin.php 프로젝트: spip/SPIP
/**
 * 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;
}
예제 #25
0
/**
 * 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;
}
예제 #26
0
파일: lang.php 프로젝트: JLuc/SPIP
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'");
}
예제 #27
0
파일: plugin.php 프로젝트: nursit/SPIP
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;
}
예제 #28
0
파일: utils.php 프로젝트: nursit/SPIP
/**
 * 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;
}
예제 #29
0
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];
}
예제 #30
0
파일: signature.php 프로젝트: rhertzog/lcs
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);
}