1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
<?php
/**
* Active Directory authentication backend for DokuWiki
*
* This makes authentication with a Active Directory server much easier
* than when using the normal LDAP backend by utilizing the adLDAP library
*
* Usage:
* Set DokuWiki's local.protected.php auth setting to read
*
* $conf['useacl'] = 1;
* $conf['disableactions'] = 'register';
* $conf['autopasswd'] = 0;
* $conf['authtype'] = 'ad';
* $conf['passcrypt'] = 'ssha';
*
* $conf['auth']['ad']['account_suffix'] = '@my.domain.org';
* $conf['auth']['ad']['base_dn'] = 'DC=my,DC=domain,DC=org';
* $conf['auth']['ad']['domain_controllers'] = 'srv1.domain.org,srv2.domain.org';
*
* //optional:
* $conf['auth']['ad']['sso'] = 1;
* $conf['auth']['ad']['ad_username'] = 'root';
* $conf['auth']['ad']['ad_password'] = 'pass';
* $conf['auth']['ad']['real_primarygroup'] = 1;
* $conf['auth']['ad']['use_ssl'] = 1;
* $conf['auth']['ad']['debug'] = 1;
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author James Van Lommel <jamesvl@gmail.com>
* @link http://www.nosq.com/blog/2005/08/ldap-activedirectory-and-dokuwiki/
* @author Andreas Gohr <andi@splitbrain.org>
*/
require_once(DOKU_INC.'inc/adLDAP.php');
class auth_ad extends auth_basic {
var $cnf = null;
var $opts = null;
var $adldap = null;
/**
* Constructor
*/
function auth_ad() {
global $conf;
$this->cnf = $conf['auth']['ad'];
// ldap extension is needed
if (!function_exists('ldap_connect')) {
if ($this->cnf['debug'])
msg("LDAP err: PHP LDAP extension not found.",-1);
$this->success = false;
return;
}
// Prepare SSO
if($_SERVER['REMOTE_USER'] && $this->cnf['sso']){
// remove possible NTLM domain
list($dom,$usr) = explode('\\',$_SERVER['REMOTE_USER'],2);
if(!$usr) $usr = $dom;
// remove possible Kerberos domain
list($usr,$dom) = explode('@',$usr);
$dom = strtolower($dom);
$_SERVER['REMOTE_USER'] = $usr;
// we need to simulate a login
if(empty($_COOKIE[DOKU_COOKIE])){
$_REQUEST['u'] = $_SERVER['REMOTE_USER'];
$_REQUEST['p'] = 'sso_only';
}
}
// prepare adLDAP standard configuration
$this->opts = $this->cnf;
// add possible domain specific configuration
if($dom && is_array($this->cnf[$dom])) foreach($this->cnf[$dom] as $key => $val){
$this->opts[$key] = $val;
}
// handle multiple AD servers
$this->opts['domain_controllers'] = explode(',',$this->opts['domain_controllers']);
$this->opts['domain_controllers'] = array_map('trim',$this->opts['domain_controllers']);
$this->opts['domain_controllers'] = array_filter($this->opts['domain_controllers']);
// we currently just handle authentication, so no capabilities are set
}
/**
* Check user+password [required auth function]
*
* Checks if the given user exists and the given
* plaintext password is correct by trying to bind
* to the LDAP server
*
* @author James Van Lommel <james@nosq.com>
* @return bool
*/
function checkPass($user, $pass){
if($_SERVER['REMOTE_USER'] &&
$_SERVER['REMOTE_USER'] == $user &&
$this->cnf['sso']) return true;
if(!$this->_init()) return false;
return $this->adldap->authenticate($user, $pass);
}
/**
* Return user info [required auth function]
*
* Returns info about the given user needs to contain
* at least these fields:
*
* name string full name of the user
* mail string email addres of the user
* grps array list of groups the user is in
*
* This LDAP specific function returns the following
* addional fields:
*
* dn string distinguished name (DN)
* uid string Posix User ID
*
* @author James Van Lommel <james@nosq.com>
*/
function getUserData($user){
global $conf;
if(!$this->_init()) return false;
//get info for given user
$result = $this->adldap->user_info($user);
//general user info
$info['name'] = $result[0]['displayname'][0];
$info['mail'] = $result[0]['mail'][0];
$info['uid'] = $result[0]['samaccountname'][0];
$info['dn'] = $result[0]['dn'];
// handle ActiveDirectory memberOf
$info['grps'] = $this->adldap->user_groups($user,(bool) $this->opts['recursive_groups']);
if (is_array($info['grps'])) {
foreach ($info['grps'] as $ndx => $group) {
$info['grps'][$ndx] = $this->cleanGroup($group);
}
}
// always add the default group to the list of groups
if(!is_array($info['grps']) || !in_array($conf['defaultgroup'],$info['grps'])){
$info['grps'][] = $conf['defaultgroup'];
}
return $info;
}
/**
* Make AD group names usable by DokuWiki.
*
* Removes backslashes ('\'), pound signs ('#'), and converts spaces to underscores.
*
* @author James Van Lommel (jamesvl@gmail.com)
*/
function cleanGroup($name) {
$sName = str_replace('\\', '', $name);
$sName = str_replace('#', '', $sName);
$sName = preg_replace('[\s]', '_', $sName);
return $sName;
}
/**
* Sanitize user names
*/
function cleanUser($name) {
return $this->cleanGroup($name);
}
/**
* Most values in LDAP are case-insensitive
*/
function isCaseSensitive(){
return false;
}
/**
* Initialize the AdLDAP library and connect to the server
*/
function _init(){
if(!is_null($this->adldap)) return true;
// connect
try {
$this->adldap = new adLDAP($this->opts);
return true;
} catch (adLDAPException $e) {
$this->success = false;
$this->adldap = null;
}
return false;
}
}
//Setup VIM: ex: et ts=4 enc=utf-8 :
|