[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> auth.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  
  16  //
  17  // Fonctions de gestion de l'acces restreint aux rubriques
  18  //
  19  
  20  // http://doc.spip.org/@acces_restreint_rubrique
  21  function acces_restreint_rubrique($id_rubrique) {
  22      global $connect_id_rubrique;
  23      global $connect_statut;
  24  
  25      return (isset($connect_id_rubrique[$id_rubrique]));
  26  }
  27  
  28  // http://doc.spip.org/@auteurs_article
  29  function auteurs_article($id_article, $cond='')
  30  {
  31      return spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article". ($cond ? " AND $cond" : ''));
  32  }
  33  
  34  // Retourne les droits de publication d'un auteur selon le codage suivant:
  35  // - le tableau de ses rubriques si c'est un admin restreint
  36  // - 0 si c'est un admin de plein droit
  37  // - la chaine indiquant son statut s'il n'est pas admin
  38  
  39  // http://doc.spip.org/@auth_rubrique
  40  function auth_rubrique($id_auteur, $statut)
  41  {
  42      if ($statut != '0minirezo') return $statut;
  43  
  44      $result = spip_query("SELECT id_rubrique FROM spip_auteurs_rubriques WHERE id_auteur=$id_auteur AND id_rubrique!='0'");
  45  
  46      if (!spip_num_rows($result)) {
  47          $GLOBALS['connect_toutes_rubriques'] = true;
  48          return 0;
  49      }
  50  
  51      $rubriques = array();
  52      for (;;) {
  53          $r = array();
  54          while ($row = spip_fetch_array($result)) {
  55              $id_rubrique = $row['id_rubrique'];
  56              $r[]= $rubriques[$id_rubrique] = $id_rubrique;
  57          }
  58          if (!$r) return $rubriques;
  59          $r = join(',', $r);
  60  
  61          $result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($r) AND id_rubrique NOT IN ($r)");
  62      }
  63  }
  64  
  65  // Un nouvel inscrit prend son statut definitif a la 1ere connexion
  66  // Le statut a ete memorise dans bio (cf formulaire_inscription)
  67  // Si vide se rabattre sur le mode d'inscription 
  68  // (compatibilite vieille version ou redac/forum etait mutuellement exclusif)
  69  
  70  // http://doc.spip.org/@acces_statut
  71  function acces_statut($id_auteur, $statut, $bio)
  72  {
  73      if ($statut == 'nouveau') {
  74          $statut = ($bio ? ($bio == 'redac' ? '1comite' : '6forum'):
  75                 (($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ? '1comite' : '6forum'));
  76          spip_query("UPDATE spip_auteurs SET bio='', statut='$statut'    WHERE id_auteur=$id_auteur");
  77      }
  78      return $statut;
  79  }
  80  
  81  // Fonction d'authentification
  82  // retourne -1 si authentification impossible a cause du serveur SQL 
  83  // retourne une chaine vide si authentification reussie
  84  // retourne une chaine non vide expliquant l'echec sinon:
  85  //    "rien" ==> nouvel arrivant, envoyer le formulaire
  86  //    autre  ==> statut incompatible
  87  
  88  // http://doc.spip.org/@inc_auth_dist
  89  function inc_auth_dist() {
  90      global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user;
  91      global $connect_id_auteur, $connect_login, $connect_quand;
  92      global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique;
  93      //
  94      // Initialiser variables (eviter hacks par URL)
  95      //
  96  
  97      $connect_login = '';
  98      $connect_id_auteur = NULL;
  99      $auth_can_disconnect = false;
 100  
 101      //
 102      // Recuperer les donnees d'identification
 103      //
 104      
 105      // Session valide en cours ?
 106      if (isset($_COOKIE['spip_session'])) {
 107          $session = charger_fonction('session', 'inc');
 108          if ($connect_id_auteur = $session()) {
 109              $auth_can_disconnect = true;
 110          } else unset($_COOKIE['spip_session']);
 111      }
 112  
 113      // Essayer auth http si significatif
 114      // (ignorer les login d'intranet independants de spip)
 115      if (!$ignore_auth_http AND !$connect_id_auteur) {
 116          if (isset($_SERVER['PHP_AUTH_USER'])
 117          AND isset($_SERVER['PHP_AUTH_PW'])) {
 118              include_spip('inc/actions');
 119              if (verifier_php_auth()) {
 120                  $connect_login = $GLOBALS['auteur_session']['login'];
 121                  $_SERVER['PHP_AUTH_PW'] = '';
 122                  $auth_can_disconnect = true;
 123              }
 124          } else if (isset($_SERVER['REMOTE_USER']))
 125  
 126      // Authentification .htaccess old style, car .htaccess semble
 127      // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
 128  
 129              $connect_login = $_SERVER['REMOTE_USER'];
 130      }    
 131  
 132      $where = (is_numeric($connect_id_auteur)) ?
 133        "id_auteur=$connect_id_auteur" :
 134        (!$connect_login ? '' : "login=" . _q($connect_login));
 135  
 136      // pas authentifie par cookie ni http_auth:
 137  
 138      if (!$where) return "inconnu";
 139  
 140      // Trouver les autres infos dans la table auteurs.
 141  
 142      $result = @spip_query("SELECT *, UNIX_TIMESTAMP(en_ligne) AS quand FROM spip_auteurs WHERE $where AND statut!='5poubelle'");
 143  
 144      if (!$row = spip_fetch_array($result)) {
 145  
 146        // il n'est PLUS connu. c'est SQL qui est desyncrho
 147          auth_areconnecter($connect_login);
 148          return -1;
 149      }
 150  
 151      // connu. Mais avec quels droits ?
 152      $connect_quand = $row['quand'];
 153      $connect_id_auteur = $row['id_auteur'];
 154      $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
 155      $droits = auth_rubrique($connect_id_auteur, $connect_statut);
 156  
 157      // rajouter les sessions meme en mode auth_http
 158      // pour permettre les connexions multiples et identifier les visiteurs
 159      if (!$_COOKIE['spip_session']) {
 160          $session = charger_fonction('session', 'inc');
 161          if ($spip_session = $session($row)) {
 162              preg_match(',^[^/]*//[^/]*(.*)/$,',
 163                     url_de_base(),
 164                     $r);
 165              include_spip('inc/cookie');
 166              spip_setcookie('spip_session', $spip_session, time() + 3600 * 24 * 14, $r[1]);
 167          }
 168      }
 169  
 170      // Indiquer la connexion. A la minute pres ca suffit.
 171      if ((time() -     $connect_quand)  >= 60) {
 172          @spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");
 173      }
 174  
 175      // Le tableau global auteur_session contient toutes les infos pertinentes
 176      // et a jour (tandis que $auteur_session peut avoir des valeurs un peu datees
 177      // s'il est pris dans le fichier de session)
 178      // Les plus utiles sont aussi dans les variables simples ci-dessus
 179      $GLOBALS['auteur_session'] = array_merge($GLOBALS['auteur_session'], $row);
 180      // au cas ou : ne pas memoriser les champs sensibles
 181      unset($GLOBALS['auteur_session']['pass']);
 182      unset($GLOBALS['auteur_session']['htpass']);
 183      unset($GLOBALS['auteur_session']['alea_actuel']);
 184      unset($GLOBALS['auteur_session']['alea_futur']);
 185  
 186      if (is_string($droits)) {
 187        // ordres mineurs: redac, visiteur ou indefini
 188          if ($droits != '1comite') return $droits;
 189      } elseif (is_array($droits))
 190          $connect_id_rubrique = $droits;
 191      else $connect_toutes_rubriques = true;
 192  
 193      $connect_login = $row['login'];
 194      // vide = pas de message d'erreur (cf exit(0) Unix)
 195      return "";
 196  }
 197  
 198  // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
 199  // C'est soit parce que le serveur MySQL ne repond pas,
 200  // soit parce que la table des auteurs a changee (restauration etc)
 201  // Pas la peine d'insister.  Envoyer un message clair au client.
 202  
 203  // http://doc.spip.org/@auth_areconnecter
 204  function auth_areconnecter($auth_login)
 205  {
 206      include_spip('inc/minipres');
 207      if (!spip_connect()) {
 208          spip_log("Erreur base de donnees");
 209  
 210          echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>");
 211      } else {
 212          echo minipres(_T('avis_erreur_connexion'), "<br /><br /><p>" . _T('texte_inc_auth_1', array('auth_login' => $auth_login)). " <a href='".  generer_url_action('logout', "logout=prive"). "'>". _T('texte_inc_auth_2'). "</a>"._T('texte_inc_auth_3'));
 213      }
 214  }
 215  ?>


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