[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ecrire/ -> inc_session.php3 (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2005                                                *
   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  //
  14  // Ce fichier ne sera execute qu'une fois
  15  if (defined("_ECRIRE_INC_SESSION")) return;
  16  define("_ECRIRE_INC_SESSION", "1");
  17  
  18  
  19  /*
  20   * Gestion de l'authentification par sessions
  21   * a utiliser pour valider l'acces (bloquant)
  22   * ou pour reconnaitre un utilisateur (non bloquant)
  23   *
  24   */
  25  
  26  $GLOBALS['auteur_session'] = '';
  27  
  28  
  29  //
  30  // On verifie l'IP et le nom du navigateur
  31  //
  32  function hash_env() {
  33      global $_SERVER;
  34      return md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']);
  35  }
  36  
  37  
  38  //
  39  // Calcule le nom du fichier session
  40  //
  41  function fichier_session($id_session, $alea) {
  42      if (ereg("^([0-9]+_)", $id_session, $regs))
  43          $id_auteur = $regs[1];
  44      return _DIR_SESSIONS . 'session_'.$id_auteur.md5($id_session.' '.$alea).'.php3';
  45  
  46  }
  47  
  48  //
  49  // Ajouter une session pour l'auteur specifie
  50  //
  51  function ajouter_session($auteur, $id_session) {
  52      $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
  53      $vars = array('id_auteur', 'nom', 'login', 'email', 'statut', 'lang', 'ip_change', 'hash_env');
  54  
  55      $texte = "<"."?php\n";
  56      reset($vars);
  57      while (list(, $var) = each($vars)) {
  58          $texte .= "\$GLOBALS['auteur_session']['$var'] = '".addslashes($auteur[$var])."';\n";
  59      }
  60      $texte .= "?".">\n";
  61  
  62      if ($f = @fopen($fichier_session, "wb")) {
  63          fputs($f, $texte);
  64           fclose($f);
  65      } else {
  66          redirige_par_entete(lire_meta("adresse_site") .
  67                      "/spip_test_dirs.php3");
  68      }
  69  }
  70  
  71  //
  72  // Verifier et inclure une session
  73  //
  74  function verifier_session($id_session) {
  75  
  76      // Tester avec alea courant
  77      $ok = false;
  78      if ($id_session) {
  79          $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
  80          if (@file_exists($fichier_session)) {
  81              include($fichier_session);
  82              $ok = true;
  83          }
  84          else {
  85              // Sinon, tester avec alea precedent
  86              $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien'));
  87              if (@file_exists($fichier_session)) {
  88                  // Renouveler la session (avec l'alea courant)
  89                  include($fichier_session);
  90                  supprimer_session($id_session);
  91                  ajouter_session($GLOBALS['auteur_session'], $id_session);
  92                  $ok = true;
  93              }
  94          }
  95      }
  96  
  97      // marquer la session comme "ip-change" si le cas se presente
  98      if ($ok AND (hash_env() != $GLOBALS['auteur_session']['hash_env']) AND !$GLOBALS['auteur_session']['ip_change']) {
  99          $GLOBALS['auteur_session']['ip_change'] = true;
 100          ajouter_session($GLOBALS['auteur_session'], $id_session);
 101      }
 102  
 103      return $ok;
 104  }
 105  
 106  //
 107  // Supprimer une session
 108  //
 109  function supprimer_session($id_session) {
 110      $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
 111      if (@file_exists($fichier_session)) {
 112          @unlink($fichier_session);
 113      }
 114      $fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien'));
 115      if (@file_exists($fichier_session)) {
 116          @unlink($fichier_session);
 117      }
 118  }
 119  
 120  //
 121  // Creer une session et retourne le cookie correspondant (a poser)
 122  //
 123  function creer_cookie_session($auteur) {
 124      if ($id_auteur = $auteur['id_auteur']) {
 125          $id_session = $id_auteur.'_'.md5(creer_uniqid());
 126          $auteur['hash_env'] = hash_env();
 127          ajouter_session($auteur, $id_session);
 128          return $id_session;
 129      }
 130  }
 131  
 132  //
 133  // Creer un identifiant aleatoire
 134  //
 135  function creer_uniqid() {
 136      static $seeded;
 137  
 138      if (!$seeded) {
 139          $seed = (double) (microtime() + 1) * time();
 140          mt_srand($seed);
 141          srand($seed);
 142          $seeded = true;
 143      }
 144  
 145      $s = mt_rand();
 146      if (!$s) $s = rand();
 147      return uniqid($s, 1);
 148  }
 149  
 150  
 151  //
 152  // Cette fonction efface toutes les sessions appartenant a l'auteur
 153  // On en profite pour effacer toutes les sessions creees il y a plus de 48 h
 154  //
 155  function zap_sessions ($id_auteur, $zap) {
 156  
 157      // ne pas se zapper soi-meme
 158      if ($s = $GLOBALS['spip_session'])
 159          $fichier_session = fichier_session($s, lire_meta('alea_ephemere'));
 160  
 161      $dir = opendir(_DIR_SESSIONS);
 162      $t = time();
 163      while(($item = readdir($dir)) != '') {
 164          $chemin = _DIR_SESSIONS . $item;
 165          if (ereg("^session_([0-9]+_)?([a-z0-9]+)\.php3$", $item, $regs)) {
 166  
 167              // Si c'est une vieille session, on jette
 168              if (($t - filemtime($chemin)) > 48 * 3600)
 169                  @unlink($chemin);
 170  
 171              // sinon voir si c'est une session du meme auteur
 172              else if ($regs[1] == $id_auteur.'_') {
 173                  $zap_num ++;
 174                  if ($zap)
 175                      @unlink($chemin);
 176              }
 177  
 178          }
 179      }
 180  
 181      return $zap_num;
 182  }
 183  
 184  //
 185  // reconnaitre un utilisateur authentifie en php_auth
 186  //
 187  function verifier_php_auth() {
 188      global $_SERVER, $ignore_auth_http;
 189      if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']
 190      && !$ignore_auth_http) {
 191          $login = addslashes($_SERVER['PHP_AUTH_USER']);
 192          $result = spip_query("SELECT * FROM spip_auteurs WHERE login='$login'");
 193          $row = spip_fetch_array($result);
 194          $auth_mdpass = md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW']);
 195          if ($auth_mdpass != $row['pass']) {
 196              return false;
 197          } else {
 198              $GLOBALS['auteur_session']['id_auteur'] = $row['id_auteur'];
 199              $GLOBALS['auteur_session']['nom'] = $row['nom'];
 200              $GLOBALS['auteur_session']['login'] = $row['login'];
 201              $GLOBALS['auteur_session']['email'] = $row['email'];
 202              $GLOBALS['auteur_session']['statut'] = $row['statut'];
 203              $GLOBALS['auteur_session']['lang'] = $row['lang'];
 204              $GLOBALS['auteur_session']['hash_env'] = hash_env();
 205              return true;
 206          }
 207      }
 208  }
 209  
 210  //
 211  // entete php_auth
 212  //
 213  function ask_php_auth($pb, $raison, $retour, $url='', $re='', $lien='') {
 214      @Header("WWW-Authenticate: Basic realm=\"espace prive\"");
 215      @Header("HTTP/1.0 401 Unauthorized");
 216      echo "<b>$pb</b><p>$raison</p>[<a href='./'>$retour</a>] ",
 217        (!$url ? '' :
 218         "[<a href='spip_cookie.php3?essai_auth_http=oui&amp;$url'>$re</a>]"),
 219        (!$lien ? '' : " [<a href='" . _DIR_RESTREINT_ABS . "'>"._T('login_espace_prive')."</a>]");
 220      exit;
 221  }
 222  
 223  //
 224  // verifie si on a un cookie de session ou un auth_php correct
 225  // et charge ses valeurs dans $GLOBALS['auteur_session']
 226  //
 227  function verifier_visiteur() {
 228      if (verifier_session($GLOBALS['_COOKIE']['spip_session']))
 229          return true;
 230      if (verifier_php_auth())
 231          return true;
 232      return false;
 233  }
 234  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7