[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> session.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2007                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  if (!defined("_ECRIRE_INC_VERSION")) return;
  14  
  15  include_spip('inc/meta');
  16  
  17  /*
  18   * Gestion de l'authentification par sessions
  19   * a utiliser pour valider l'acces (bloquant)
  20   * ou pour reconnaitre un utilisateur (non bloquant)
  21   *
  22   */
  23  
  24  $GLOBALS['auteur_session'] = ''; # gloable decrivant l'auteur
  25  $GLOBALS['rejoue_session'] = ''; # globale pour insertion de JS en fin de page
  26  
  27  //
  28  // 3 actions sur les sessions, selon le type de l'argument:
  29  //
  30  // - numerique: efface toutes les sessions de l'auteur (retour quelconque)
  31  // - tableau: cree une session pour l'auteur decrit et retourne l'identifiant
  32  // - autre: predicat de validite de la session indiquee par le cookie
  33  
  34  // http://doc.spip.org/@inc_session_dist
  35  function inc_session_dist($auteur=false)
  36  {
  37      if (is_numeric($auteur))
  38          return supprimer_sessions($auteur);
  39      else if (is_array($auteur))
  40          return ajouter_session($auteur);
  41      else return verifier_session($auteur);
  42  }
  43  
  44  //
  45  // Ajoute une session pour l'auteur decrit par un tableau issu d'un SELECT-SQL
  46  //
  47  
  48  // http://doc.spip.org/@ajouter_session
  49  function ajouter_session($auteur) {
  50  
  51      global $spip_session;
  52  
  53      if (!$spip_session) 
  54          $spip_session = $auteur['id_auteur'].'_'.md5(uniqid(rand(),true));
  55  
  56      $fichier_session = fichier_session($spip_session, $GLOBALS['meta']['alea_ephemere']);
  57  
  58      if (!isset($auteur['hash_env'])) $auteur['hash_env'] = hash_env();
  59  
  60      $texte = "<"."?php\n";
  61      foreach (array('id_auteur', 'nom', 'login', 'email', 'statut', 'lang', 'ip_change', 'hash_env') AS $var) {
  62          $code = addslashes($auteur[$var]);
  63          $texte .= "\$GLOBALS['auteur_session']['$var'] = '$code';\n";
  64      }
  65      $texte .= "?".">\n";
  66  
  67      if (!ecrire_fichier($fichier_session, $texte)) {
  68          include_spip('inc/headers');
  69          redirige_par_entete(generer_url_action('test_dirs','test_dir=' . _DIR_SESSIONS,true));
  70      } else return $spip_session;
  71  }
  72  
  73  //
  74  // Cette fonction efface toutes les sessions appartenant a l'auteur
  75  // On en profite pour effacer toutes les sessions creees il y a plus de 48 h
  76  //
  77  
  78  // http://doc.spip.org/@supprimer_sessions
  79  function supprimer_sessions($id_auteur) {
  80  
  81      $dir = opendir(_DIR_SESSIONS);
  82      $t = time()  - (48 * 3600);
  83      while(($f = readdir($dir)) !== false) {
  84          if (ereg("^session_([0-9]+)_[a-z0-9]+\.php[3]?$", $f, $regs)){
  85              $f = _DIR_SESSIONS . $f;
  86              if (($regs[1] == $id_auteur) OR ($t > filemtime($f)))
  87                  @unlink($f);
  88          }
  89      }
  90  }
  91  
  92  //
  93  // Verifie si le cookie spip_session indique une session valide.
  94  // Si oui, la decrit dans le tableau $auteur_session et retourne id_auteur
  95  // La rejoue si IP change puis accepte le changement si $change=true
  96  //
  97  
  98  // http://doc.spip.org/@verifier_session
  99  function verifier_session($change=false) {
 100  
 101      global $auteur_session, $spip_session; 
 102  
 103      // si pas de cookie, c'est fichu
 104      if (!$spip_session) return false;
 105  
 106      // Tester avec alea courant
 107      $fichier_session = fichier_session($spip_session, $GLOBALS['meta']['alea_ephemere']);
 108      if (@file_exists($fichier_session)) {
 109          include($fichier_session);
 110      } else {
 111          // Sinon, tester avec alea precedent
 112          $fichier_session = fichier_session($spip_session, $GLOBALS['meta']['alea_ephemere_ancien']);
 113          if (!@file_exists($fichier_session)) return false;
 114  
 115          // Renouveler la session avec l'alea courant
 116          include($fichier_session);
 117          @unlink($fichier_session);
 118          ajouter_session($GLOBALS['auteur_session']);
 119      }
 120  
 121      // Si l'adresse IP change, inc/presentation mettra une balise image
 122      // avec un URL de rappel demandant a changer le nom de la session.
 123      // Seul celui qui a l'IP d'origine est rejoue
 124      // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
 125      // sa victime, mais se ferait deconnecter par elle.
 126  
 127      if (hash_env() != $GLOBALS['auteur_session']['hash_env']) {
 128          if (!$GLOBALS['auteur_session']['ip_change']) {
 129          $GLOBALS['rejoue_session'] = rejouer_session();
 130          $GLOBALS['auteur_session']['ip_change'] = true;
 131          ajouter_session($GLOBALS['auteur_session']);
 132          } else if ($change)
 133            spip_log("session non rejouee, vol de cookie ?");
 134      } else { if ($change) {
 135          spip_log("rejoue session $fichier_session $spip_session");
 136          @unlink($fichier_session);
 137          $auteur_session['ip_change'] = false;
 138          unset($spip_session);
 139          $cookie= ajouter_session($auteur_session);
 140          spip_setcookie('spip_session', $cookie);
 141        }
 142      }
 143      return     $auteur_session['id_auteur'];
 144  }
 145  
 146  // Code a inserer par inc/presentation pour rejouer la session
 147  // Voir action/cookie qui sera appele.
 148  
 149  // http://doc.spip.org/@rejouer_session
 150  function rejouer_session()
 151  {
 152      include_spip('inc/minipres');
 153      return      http_img_pack('rien.gif', " ", "id='img_session' width='0' height='0'") .
 154            http_script("\ndocument.img_session.src='" . generer_url_action('cookie','change_session=oui', true) .  "'");
 155  }
 156  
 157  //
 158  // Calcule le nom du fichier session
 159  //
 160  // http://doc.spip.org/@fichier_session
 161  function fichier_session($id_session, $alea) {
 162      if (ereg("^([0-9]+_)", $id_session, $regs))
 163          $id_auteur = $regs[1];
 164          
 165      $repertoire = _DIR_SESSIONS;
 166      if(!@file_exists($repertoire)) {
 167          $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
 168          $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
 169      }
 170      return $repertoire . 'session_'.$id_auteur.md5($id_session.' '.$alea). '.php';
 171  }
 172  
 173  //
 174  // On verifie l'IP et le nom du navigateur
 175  //
 176  
 177  // http://doc.spip.org/@hash_env
 178  function hash_env() {
 179    static $res ='';
 180    if ($res) return $res;
 181    return $res = md5($GLOBALS['ip'] . $_SERVER['HTTP_USER_AGENT']);
 182  }
 183  
 184  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics