Example #1
0
/**
 * Supprimer toutes les vieilles sessions d'un auteur
 *
 * Cette fonction efface toutes les sessions appartenant a l'auteur
 * On en profite pour effacer toutes les sessions
 * creees il y a plus de 4*_RENOUVELLE_ALEA
 * Tenir compte de l'ancien format ou les noms commencaient par "session_"
 * et du meme coup des repertoires plats
 * Attention : id_auteur peut etre negatif (cas des auteurs temporaires pendant le dump)
 *
 * http://code.spip.net/@supprimer_sessions
 *
 * @param int $id_auteur
 * 		Identifiant d'auteur dont on veut supprimer les sessions
 * @param bool $toutes
 * 		Supprimer aussi les vieilles sessions des autres auteurs ?
 * @param bool $actives
 * 		false pour ne pas supprimer les sessions valides de $id_auteur.
 * 		false revient donc a uniquement supprimer les vieilles sessions !
 */
function supprimer_sessions($id_auteur, $toutes = true, $actives = true)
{
    spip_log("supprimer sessions auteur {$id_auteur}", "session");
    if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
        if ($dir = opendir(_DIR_SESSIONS)) {
            $t = time() - 4 * _RENOUVELLE_ALEA;
            while (($f = readdir($dir)) !== false) {
                if (preg_match(",^[^\\d-]*(-?\\d+)_\\w{32}\\.php[3]?\$,", $f, $regs)) {
                    $f = _DIR_SESSIONS . $f;
                    if ($actives and $regs[1] == $id_auteur or $t > filemtime($f)) {
                        spip_unlink($f);
                    }
                }
            }
        }
    } else {
        verifier_session();
        spip_unlink(fichier_session('alea_ephemere', true));
    }
    // forcer le recalcul de la session courante
    spip_session(true);
}
Example #2
0
function auth()
{
    global $INSECURE, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS, $REMOTE_USER, $PHP_AUTH_USER, $PHP_AUTH_PW;
    global $auth_can_disconnect;
    global $connect_id_auteur, $connect_nom, $connect_bio, $connect_email;
    global $connect_nom_site, $connect_url_site, $connect_login, $connect_pass;
    global $connect_activer_imessage, $connect_activer_messagerie;
    global $connect_status;
    global $author_session, $prefs;
    global $clean_link;
    // This reloads $GLOBALS['db_ok'], just in case
    include_config('inc_connect');
    // If there is not SQL connection, quit.
    if (!$GLOBALS['db_ok']) {
        include_lcm('inc_presentation');
        lcm_html_start("Technical problem", "install");
        // annoy sql_errno()
        echo "\n<!-- \n";
        echo "\t* Flag connect: " . $GLOBALS['flag_connect'] . "\n\t";
        lcm_query("SELECT count(*) from lcm_meta");
        echo "\n-->\n\n";
        echo "<div align='left' style='width: 600px;' class='box_error'>\n";
        echo "\t<h3>" . _T('title_technical_problem') . "</h3>\n";
        echo "\t<p>" . _T('info_technical_problem_database') . "</p>\n";
        if (lcm_sql_errno()) {
            echo "\t<p><tt>" . lcm_sql_errno() . " " . lcm_sql_error() . "</tt></p>\n";
        } else {
            echo "\t<p><tt>No error diagnostic was provided.</tt></p>\n";
        }
        echo "</div>\n";
        lcm_html_end();
        return false;
    }
    // Initialise variables (avoid URL hacks)
    $auth_login = "";
    $auth_pass = "";
    $auth_pass_ok = false;
    $auth_can_disconnect = false;
    // Fetch identification data from authentication session
    if (isset($_COOKIE['lcm_session'])) {
        if (verifier_session($_COOKIE['lcm_session'])) {
            if ($author_session['status'] == 'admin' or $author_session['status'] == 'normal') {
                $auth_login = $author_session['username'];
                $auth_pass_ok = true;
                $auth_can_disconnect = true;
            }
        }
    } else {
        if ($_REQUEST['privet'] == 'yes') {
            // Failed login attempt: cookie failed
            $link = new Link("lcm_cookie.php?cookie_test_failed=yes");
            $clean_link->delVar('privet');
            $url = str_replace('/./', '/', $clean_link->getUrl());
            $link->addVar('var_url', $url);
            @header("Location: " . $link->getUrl());
            exit;
        }
    }
    // If not authenticated, ask for login / password
    if (!$auth_login) {
        $url = $clean_link->getUrl();
        @header("Location: lcm_login.php?var_url=" . urlencode($url));
        exit;
    }
    //
    // Search for the login in the authors' table
    //
    $auth_login = addslashes($auth_login);
    $query = "SELECT * FROM lcm_author WHERE username='******' AND status !='external' AND status !='6forum'";
    $result = @lcm_query($query);
    if ($row = lcm_fetch_array($result)) {
        $connect_id_auteur = $row['id_author'];
        $connect_nom = $row['name_first'];
        $connect_login = $row['username'];
        $connect_pass = $row['password'];
        $connect_status = $row['status'];
        $connect_activer_messagerie = "non";
        //$row["messagerie"];
        $connect_activer_imessage = "non ";
        //$row["imessage"];
        // Set the users' preferences
        $prefs = unserialize(get_magic_quotes_runtime() ? stripslashes($row['prefs']) : $row['prefs']);
        //
        // Default values for some possibly unset preferences
        //
        if (!isset($prefs['page_rows']) || intval($prefs['page_rows']) < 1) {
            $prefs['page_rows'] = 15;
        }
        if (!isset($prefs['theme']) || !$prefs['theme']) {
            $prefs['theme'] = 'green';
        }
        if (!isset($prefs['screen']) || !$prefs['screen']) {
            $prefs['screen'] = 'wide';
        }
        if (!isset($prefs['font_size']) || !$prefs['font_size']) {
            $prefs['font_size'] = 'medium_font';
        }
        if (!isset($prefs['case_owner']) || !$prefs['case_owner']) {
            $prefs['case_owner'] = 'my';
        }
        if (!isset($prefs['case_period']) || !$prefs['case_period']) {
            $prefs['case_period'] = '91';
        }
        if (!isset($prefs['mode']) || !$prefs['mode']) {
            $prefs['mode'] = 'simple';
        }
        if (!isset($prefs['time_intervals']) || !$prefs['time_intervals']) {
            $prefs['time_intervals'] = 'relative';
            $prefs['time_intervals_notation'] = 'hours_only';
        }
    } else {
        // This case is a strange possibility: the author is authentified
        // OK, but he does not exist in the authors table. Possible cause:
        // the database was restaured and the author does not exist (and
        // the user was authentified by another source, such as LDAP).
        // Note: we use to show a strange error message which would advice
        // to logout, but since it occurs only after db upgrade, just logout
        // brutally (with cookie_admin=no to forget the username).
        lcm_header('Location: lcm_cookie.php?cookie_admin=no&logout=' . $auth_login);
        exit;
    }
    if (!$auth_pass_ok) {
        @header("Location: lcm_login.php?var_erreur=pass");
        exit;
    }
    // [ML] Again, not sure how this is used, but we can ignore it for now
    // TODO (note: nouveau == new)
    if ($connect_status == 'nouveau') {
        $query = "UPDATE lcm_author SET status = 'normal' WHERE id_author = {$connect_id_auteur}";
        $result = lcm_query($query);
        $connect_status = 'normal';
    }
    // PHP sessions are started here, and stopped at logout
    session_start();
    return true;
}
function formulaires_vacarme_inscription_client_traiter_dist($retour = '', $url = '')
{
    // Si redirection demandée, on refuse le traitement en ajax
    if ($retour) {
        refuser_traiter_formulaire_ajax();
    }
    // Le pseudo SPIP est construit
    set_request('nom_inscription', trim(_request('prenom') . ' ' . _request('nom')));
    // On active le traitement du formulaire d'inscription classique, donc on crée un nouvel utilisateur
    if (!($id_auteur = verifier_session())) {
        $mode = tester_config(0);
        $inscription_dist = charger_fonction('traiter', 'formulaires/inscription');
        $retours = $inscription_dist($mode, '');
        $id_auteur = sql_getfetsel('id_auteur', 'spip_auteurs', 'email = ' . sql_quote(_request('mail_inscription')));
    }
    // On récupère l'auteur qu'on vient de créer avec l'email du form
    if ($id_auteur) {
        // On ajoute des infos au contexte
        set_request('objet', 'auteur');
        set_request('id_objet', $id_auteur);
        set_request('type', 'principale');
        // On crée un contact pour cet utilisateur
        $editer_contact = charger_fonction('editer_contact', 'action/');
        list($id_contact, $err) = $editer_contact('nouveau');
        // on ajoute les infos propres au plugin vacarme_commande : organisation, service, type_client
        $type_client = _request('type_client');
        if ($type_client == 'organisation') {
            $organisation = _request('organisation');
            $service = _request('service');
            sql_updateq('spip_contacts', array('type_client' => $type_client, 'organisation' => $organisation, 'service' => $service), "id_contact=" . intval($id_contact));
        } else {
            sql_updateq('spip_contacts', array('type_client' => $type_client), "id_contact=" . intval($id_contact));
        }
        //On lie le contact à l'auteur
        sql_insertq('spip_contacts_liens', array('id_objet' => $id_auteur, 'objet' => 'auteur', "id_contact" => $id_contact));
        //assurer la compatibilite
        sql_updateq('spip_contacts', array('id_auteur' => $id_auteur), "id_contact=" . intval($id_contact));
        // On crée l'adresse
        $editer_adresse = charger_fonction('editer_adresse', 'action/');
        $editer_adresse('oui');
        // On crée le numero de tel
        set_request('type', 'principal');
        $editer_numero = charger_fonction('editer_numero', 'action/');
        $editer_numero('oui');
        // On crée le portable
        if (_request('portable')) {
            // on stocke cette donnee
            $numero = _request('numero');
            set_request('numero', _request('portable'));
            set_request('type', 'portable');
            set_request('titre', 'Portable');
            $editer_portable = charger_fonction('editer_numero', 'action/');
            $editer_portable('oui');
        }
        // On crée le fax
        if (_request('fax')) {
            // on stocke cette donnee si elle ne l'est pas deja
            $numero ? '' : ($numero = _request('numero'));
            set_request('numero', _request('fax'));
            set_request('type', 'fax');
            set_request('titre', 'Fax');
            $editer_fax = charger_fonction('editer_numero', 'action/');
            $editer_fax('oui');
        }
    }
    // si necessaire on replace la bonne donnee dans l'environnement
    $numero ? set_request('numero', $numero) : '';
    // Comme conseillé dans la documentation on informe de l'id auteur inscrit
    $retours['id_auteur'] = $id_auteur;
    if ($retours['message_ok']) {
        $lien = generer_url_public("compte", "c=identification");
        if ($url) {
            $lien = parametre_url($lien, 'retour', $url);
            $retours['message_ok'] = _T('vacarme_commande:formulaire_inscription_message_ok', array(url => $lien));
        } else {
            $retours['message_ok'] = _T('vacarme_commande:formulaire_inscription_message_ok', array(url => $lien));
        }
    }
    if ($retour) {
        $retours['redirect'] = $retour;
    }
    return $retours;
}
Example #4
0
function supprimer_sessions($id_auteur) {

	$i = 0;
	$t = (time()  - (_RENOUVELLE_ALEA << 2));
	$dir = opendir(_DIR_SESSIONS);
	while(($e = readdir($dir)) !== false) {
		if (!preg_match(",^\D*(\d+)_\w{32}\.php[3]?$,", $e, $r))
			continue;
		$f = _DIR_SESSIONS . $e;
		if (file_exists($f) AND (($id_auteur AND ($r[1] == $id_auteur))
		OR ($t > filemtime($f)))) {
			spip_unlink($f);
			$i++;
		}
	}
	// pour un anonyme, se fonder sur le cookie pour trouver le fichier
	if (!$id_auteur) {
		verifier_session();
		spip_unlink(fichier_session('alea_ephemere', true));
	}
	if ($i) spip_log("destruction des $i fichiers de session de $id_auteur et 0");
	// forcer le recalcul de la session courante
	spip_session(true);
}
Example #5
0
    $cible = new Link(_request('url'));
    if (_request('referer')) {
        // see config_author.php
        $cible->addVar('referer', _request('referer'));
    }
} else {
    if (_request('logout')) {
        $cible = new Link("index.php");
    } else {
        $cible = new Link();
    }
    // [ML] XXX uses current page, but this can create strange bugs..
}
// Replay the cookie to renew lcm_session
if (_request('change_session') == 'yes' || _request('change_session') == 'oui') {
    if (verifier_session($_COOKIE['lcm_session'])) {
        // Warning: only the user with the correct IP has the right to replay
        // the cookie, therefore a cookie theft cannot disconnect the vitim
        // but be disconnected by her.
        if ($author_session['hash_env'] == hash_env()) {
            $author_session['ip_change'] = false;
            $cookie = creer_cookie_session($author_session);
            delete_session($_COOKIE['lcm_session']);
            lcm_setcookie('lcm_session', $cookie);
        }
        @header('Content-Type: image/gif');
        @header('Expires: 0');
        @header("Cache-Control: no-store, no-cache, must-revalidate");
        @header('Pragma: no-cache');
        @header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        @readfile('ecrire/img_pack/rien.gif');
Example #6
0
/**
 * Mettre a jour les sessions existantes pour un auteur
 * Quand on modifie une fiche auteur on appelle cette fonction qui va
 * mettre a jour les fichiers de session de l'auteur en question.
 * (auteurs identifies seulement)
 *
 * http://doc.spip.org/@actualiser_sessions
 *
 * @param array $auteur
 */
function actualiser_sessions($auteur)
{
    if (!($id_auteur = intval($auteur['id_auteur']))) {
        return;
    }
    // memoriser l'auteur courant (celui qui modifie la fiche)
    $sauve = $GLOBALS['visiteur_session'];
    // .. mettre a jour les sessions de l'auteur cible
    // attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire
    // cree par une ecriture concurente d'une session (fichier atomique temporaire)
    $sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\\.php$');
    foreach ($sessions as $session) {
        $GLOBALS['visiteur_session'] = array();
        // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence)
        if (@file_exists($session)) {
            include $session;
            # $GLOBALS['visiteur_session'] est alors l'auteur cible
            $auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
            ecrire_fichier_session($session, $auteur);
        }
    }
    // restaurer l'auteur courant
    $GLOBALS['visiteur_session'] = $sauve;
    // si c'est le meme, rafraichir les valeurs
    if (isset($sauve['id_auteur']) and $auteur['id_auteur'] == $sauve['id_auteur']) {
        verifier_session();
    }
}
Example #7
0
function verifier_visiteur()
{
    if (isset($_COOKIE['lcm_session'])) {
        if (verifier_session($_COOKIE['lcm_session'])) {
            return true;
        }
    }
    return false;
}
Example #8
0
/**
 * Mettre a jour les sessions existantes pour un auteur
 * Quand on modifie une fiche auteur on appelle cette fonction qui va
 * mettre a jour les fichiers de session de l'auteur en question.
 * (auteurs identifies seulement)
 *
 * http://doc.spip.org/@actualiser_sessions
 *
 * @param array $auteur
 */
function actualiser_sessions($auteur)
{
    if (!($id_auteur = intval($auteur['id_auteur']))) {
        return;
    }
    // memoriser l'auteur courant (celui qui modifie la fiche)
    $sauve = $GLOBALS['visiteur_session'];
    // .. mettre a jour les sessions de l'auteur cible
    foreach (preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\\.php') as $session) {
        $GLOBALS['visiteur_session'] = array();
        include $session;
        # $GLOBALS['visiteur_session'] est alors l'auteur cible
        $auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
        ecrire_fichier_session($session, $auteur);
    }
    // restaurer l'auteur courant
    $GLOBALS['visiteur_session'] = $sauve;
    // si c'est le meme, rafraichir les valeurs
    if (isset($sauve['id_auteur']) and $auteur['id_auteur'] == $sauve['id_auteur']) {
        verifier_session();
    }
}