/** * 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); }
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; }
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); }
$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');
/** * 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(); } }
function verifier_visiteur() { if (isset($_COOKIE['lcm_session'])) { if (verifier_session($_COOKIE['lcm_session'])) { return true; } } return false; }
/** * 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(); } }