PageRenderTime 54ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/auth/ldap.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 184 lines | 109 code | 31 blank | 44 comment | 25 complexity | f48be937d63e4b318d21e36dc748ca7c MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. // Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok
  13. // Attributs LDAP correspondants a ceux de SPIP, notamment pour le login
  14. $GLOBALS['ldap_attributes'] = array(
  15. 'login' => array('sAMAccountName', 'uid', 'login', 'userid', 'cn','sn'),
  16. 'nom' => "cn",
  17. 'email' => "mail",
  18. 'bio' => "description");
  19. // http://doc.spip.org/@inc_auth_ldap_dist
  20. function auth_ldap_dist ($login, $pass, $serveur='') {
  21. #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
  22. // Utilisateur connu ?
  23. // si http auth, inutile de reauthentifier: cela
  24. // ne marchera pas avec auth http autre que basic.
  25. $checkpass = isset($_SERVER["REMOTE_USER"])?false:true;
  26. if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) return array();
  27. // Si l'utilisateur figure deja dans la base, y recuperer les infos
  28. $r = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login) . " AND source='ldap'",'','','','',$serveur);
  29. if ($r) return $r;
  30. // sinon importer les infos depuis LDAP,
  31. if ($GLOBALS['meta']["ldap_statut_import"]
  32. AND $desc = auth_ldap_retrouver($dn, array(), $serveur)) {
  33. // rajouter le statut indique a l'install
  34. $desc['statut'] = $GLOBALS['meta']["ldap_statut_import"];
  35. $desc['login'] = $login;
  36. $desc['source'] = 'ldap';
  37. $desc['pass'] = '';
  38. $r = sql_insertq('spip_auteurs', $desc,'',$serveur);
  39. }
  40. if ($r)
  41. return sql_fetsel("*", "spip_auteurs", "id_auteur=".intval($r),'','','','',$serveur);
  42. // sinon echec
  43. spip_log("Creation de l'auteur '$login' impossible");
  44. return array();
  45. }
  46. /**
  47. * Connexion a l'annuaire LDAP
  48. * Il faut passer par spip_connect() pour avoir les info
  49. * donc potentiellement indiquer un serveur
  50. * meme si dans les fait cet argument est toujours vide
  51. *
  52. * @param string $serveur
  53. * @return string
  54. */
  55. function auth_ldap_connect($serveur='') {
  56. include_spip('base/connect_sql');
  57. static $connexions_ldap = array();
  58. if (isset($connexions_ldap[$serveur])) return $connexions_ldap[$serveur];
  59. $connexion = spip_connect($serveur);
  60. if (!is_array($connexion['ldap'])) {
  61. if ($connexion['authentification']['ldap']) {
  62. $f = _DIR_CONNECT . $connexion['authentification']['ldap'];
  63. unset($GLOBALS['ldap_link']);
  64. if (is_readable($f)) include_once($f);
  65. if (isset($GLOBALS['ldap_link']))
  66. $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'],
  67. 'base' => $GLOBALS['ldap_base']);
  68. else spip_log("connection LDAP $serveur mal definie dans $f");
  69. if (isset($GLOBALS['ldap_champs']))
  70. $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
  71. } else spip_log("connection LDAP $serveur inconnue");
  72. }
  73. return $connexions_ldap[$serveur]=$connexion['ldap'];
  74. }
  75. /**
  76. * Retrouver un login, et verifier son pass si demande par $checkpass
  77. *
  78. * @param string $login
  79. * @param sring $pass
  80. * @param bool $checkpass
  81. * @return string
  82. * le login trouve ou chaine vide si non trouve
  83. */
  84. function auth_ldap_search($login, $pass, $checkpass=true, $serveur=''){
  85. // Securite anti-injection et contre un serveur LDAP laxiste
  86. $login_search = preg_replace("/[^-@._\s\d\w]/", "", $login);
  87. if (!strlen($login_search) OR ($checkpass AND !strlen($pass)) )
  88. return '';
  89. // verifier la connexion
  90. if (!$ldap = auth_ldap_connect($serveur))
  91. return '';
  92. $ldap_link = $ldap['link'];
  93. $ldap_base = $ldap['base'];
  94. $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ;
  95. $logins = is_array($desc['login']) ? $desc['login'] : array($desc['login']);
  96. // Tenter une recherche pour essayer de retrouver le DN
  97. foreach($logins as $att) {
  98. $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", array("dn"));
  99. $info = @ldap_get_entries($ldap_link, $result);
  100. // Ne pas accepter les resultats si plus d'une entree
  101. // (on veut un attribut unique)
  102. if (is_array($info) AND $info['count'] == 1) {
  103. $dn = $info[0]['dn'];
  104. if (!$checkpass) return $dn;
  105. if (@ldap_bind($ldap_link, $dn, $pass)) return $dn;
  106. }
  107. }
  108. if ($checkpass AND !isset($dn)) {
  109. // Si echec, essayer de deviner le DN
  110. foreach($logins as $att) {
  111. $dn = "$att=$login_search, $ldap_base";
  112. if (@ldap_bind($ldap_link, $dn, $pass))
  113. return "$att=$login_search, $ldap_base";
  114. }
  115. }
  116. return '';
  117. }
  118. function auth_ldap_retrouver($dn, $desc=array(), $serveur='')
  119. {
  120. // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
  121. if (!$ldap = spip_connect_ldap($serveur)) {
  122. spip_log("ldap $serveur injoignable");
  123. return array();
  124. }
  125. $ldap_link = $ldap['link'];
  126. if (!$desc) {
  127. $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ;
  128. unset($desc['login']);
  129. }
  130. $result = @ldap_read($ldap_link, $dn, "objectClass=*", array_values($desc));
  131. if (!$result) return array();
  132. // Recuperer les donnees du premier (unique?) compte de l'auteur
  133. $val = @ldap_get_entries($ldap_link, $result);
  134. if (!is_array($val) OR !is_array($val[0])) return array();
  135. $val = $val[0];
  136. // Convertir depuis UTF-8 (jeu de caracteres par defaut)
  137. include_spip('inc/charsets');
  138. foreach ($desc as $k => $v)
  139. $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
  140. return $desc;
  141. }
  142. /**
  143. * Retrouver le login de quelqu'un qui cherche a se loger
  144. *
  145. * @param string $login
  146. * @return string
  147. */
  148. function auth_ldap_retrouver_login($login, $serveur='')
  149. {
  150. return auth_ldap_search($login, '', false, $serveur) ? $login : '';
  151. }
  152. ?>