'LDAP Server',
'basedn' => 'Base DN',
'servertype' => 'LDAP Server Type',
'domain' => 'LDAP Server Domain',
'searchuser' => 'LDAP Search User',
'searchpassword' => 'LDAP Search Password',
);
function saveConfig(&$oSource, $aRequest) {
return true;
}
function configFields($oSource) {
return array();
}
function showSource($oSource) {
$aConfig = unserialize($oSource->getConfig());
if (empty($aConfig)) {
$aConfig = array();
}
$sRet = "
\n";
foreach ($this->aConfigMap as $sSettingName => $sName) {
$sRet .= " - $sName
\n";
$sValue = KTUtil::arrayGet($aConfig, $sSettingName, "Unset");
$sRet .= " - " . $sValue . "
\n";
}
$sRet .= "
\n";
return $sRet;
}
function showUserSource($oUser, $oSource) {
return 'Edit LDAP info';
}
function do_editUserSource() {
$submit = KTUtil::arrayGet($_REQUEST, 'submit');
if (KTUtil::arrayGet($submit, 'save')) {
return $this->_do_saveUserSource();
}
$user_id = KTUtil::arrayGet($_REQUEST, 'user_id');
$oUser =& $this->oValidator->validateUser($user_id);
$this->oPage->setBreadcrumbDetails("editing LDAP details");
$oTemplate = $this->oValidator->validateTemplate('ktstandard/authentication/ldapedituser');
$oAuthenticationSource = KTAuthenticationSource::getForUser($oUser);
$aDetails = unserialize($oUser->getAuthenticationDetails());
$dn = KTUtil::arrayGet($aDetails, 'dn', "");
$fields = array();
$fields[] = new KTStringWidget('Distinguished name', 'The location of this user in the LDAP tree', 'dn', $dn, $this->oPage, true);
$aTemplateData = array(
'context' => &$this,
'fields' => $fields,
'user' => $oUser,
);
return $oTemplate->render($aTemplateData);
}
function _do_saveUserSource() {
$user_id = KTUtil::arrayGet($_REQUEST, 'user_id');
$oUser =& $this->oValidator->validateUser($user_id);
$aDetails['dn'] = KTUtil::arrayGet($_REQUEST, 'dn', "");
$oUser->setAuthenticationDetails(serialize($aDetails));
$oUser->update();
$this->successRedirectTo("editUser", "Details updated",
sprintf('user_id=%d', $oUser->getId()));
}
function do_editSourceProvider() {
require_once(KT_LIB_DIR . '/widgets/fieldWidgets.php');
$this->oPage->setBreadcrumbDetails("editing LDAP settings");
$oTemplate = $this->oValidator->validateTemplate('ktstandard/authentication/ldapeditsource');
$iSourceId = KTUtil::arrayGet($_REQUEST, 'source_id');
$oSource = KTAuthenticationSource::get($iSourceId);
$fields = array();
$fields[] = new KTStringWidget('Server name', 'The host name or IP address of the LDAP server', 'servername', '', $this->oPage, true);
$fields[] = new KTStringWidget('Base DN', 'FIXME', 'basedn', '', $this->oPage, true);
$fields[] = new KTStringWidget('Server Type', 'FIXME', 'servertype', '', $this->oPage, true);
$fields[] = new KTStringWidget('Domain', 'FIXME', 'domain', '', $this->oPage, true);
$fields[] = new KTStringWidget('Search User', 'FIXME', 'searchuser', '', $this->oPage, true);
$fields[] = new KTStringWidget('Search Password', 'FIXME', 'searchpassword', '', $this->oPage, true);
$aTemplateData = array(
'context' => &$this,
'fields' => $fields,
'source' => $oSource,
);
return $oTemplate->render($aTemplateData);
}
function do_performEditSourceProvider() {
$iSourceId = KTUtil::arrayGet($_REQUEST, 'source_id');
$oSource = KTAuthenticationSource::get($iSourceId);
$aConfig = array();
foreach ($this->aConfigMap as $k => $v) {
$sValue = KTUtil::arrayGet($_REQUEST, $k);
if ($sValue) {
$aConfig[$k] = $sValue;
}
}
$oSource->setConfig(serialize($aConfig));
$oSource->update();
$this->successRedirectTo('viewsource', "Configuration updated", 'source_id=' . $oSource->getId());
}
function &getAuthenticator($oSource) {
return new LDAPAuthenticator($oSource);
}
}
class LDAPAuthenticator extends Authenticator {
/**
* The LDAP server to connect to
*/
var $sLdapServer;
/**
* The base LDAP DN to perform authentication against
*/
var $sBaseDN;
/**
* The LDAP accessor class
*/
var $oLdap;
/**
* Creates a new instance of the LDAPAuthenticator
*
* @param string the LDAP server to connect to for validation (optional)
* @param string the dn branch to perform the authentication against (optional)
* @param string the ldap server type (optional)
*/
function LDAPAuthenticator($oSource) {
$this->oSource =& $oSource;
$aConfig = unserialize($oSource->getConfig());
$this->sLdapServer = $aConfig['servername'];
$this->sBaseDN = $aConfig['basedn'];
$this->sServerType = $aConfig['servertype'];
$this->sLdapDomain = $aConfig['domain'];
$this->sSearchUser = $aConfig['searchuser'];
$this->sSearchPassword = $aConfig['searchpassword'];
// initialise and setup ldap class
$this->oLdap = new AuthLdap($this->sLdapServer, $this->sBaseDN, $this->sServerType, $this->sLdapDomain, $this->sSearchUser, $this->sSearchPassword);
}
/**
* Checks the user's password against the LDAP directory
*
* @param string the name of the user to check
* @param string the password to check
* @return boolean true if the password is correct, else false
*/
function checkPassword($oUser, $sPassword) {
$aDetails = unserialize($oUser->getAuthenticationDetails());
if ($this->oLdap->connect()) {
// lookup dn from username - must exist in db
$sBindDn = $aDetails['dn'];
if ($this->oLdap->authBind($sBindDn, $sPassword)) {
return true;
} else {
return PEAR::raiseError("LDAP error: (" . $this->oLdap->ldapErrorCode . ") " . $this->oLdap->ldapErrorText);
}
} else {
return PEAR::raiseError('LDAP server unreachable');
}
}
/**
* Searched the directory for a specific user
*
* @param string the username to search for
* @param array the attributes to return from the search
* @return array containing the users found
*/
function getUser($sUserName, $aAttributes) {
global $default;
// connect and search
if ( $this->oLdap->connect() ) {
// search for the users
// append and prepend wildcards
$aUserResults = $this->oLdap->getUsers($sUserName, $aAttributes);
if ($aUserResults) {
// return the array
return $aUserResults;
} else {
// the search failed, return empty array
return array();
}
} else {
$_SESSION["errorMessage"] = "LDAP error: (" . $this->oLdap->ldapErrorCode . ") " . $this->oLdap->ldapErrorText;
return false;
}
}
/**
* Searches the LDAP directory for users matching the supplied search string.
*
* @param string the username to search for
* @param array the attributes to return from the search
* @return array containing the users found
*/
function searchUsers($sUserNameSearch, $aAttributes) {
global $default;
// connect and search
if ( $this->oLdap->connect() ) {
// search for the users
// append and prepend wildcards
$aUserResults = $this->oLdap->getUsers("*" . $sUserNameSearch . "*", $aAttributes);
if ($aUserResults) {
// return the array
return $aUserResults;
} else {
// the search failed, return empty array
return array();
}
} else {
$default->log->error("LDAPAuthentication::searchUsers LDAP error: (" . $this->oLdap->ldapErrorCode . ") " . $this->oLdap->ldapErrorText);
return false;
}
}
}