parent
76695e992e
commit
085e9c6414
@ -0,0 +1,96 @@ |
|||||||
|
<?php // External login module : LDAP
|
||||||
|
/** |
||||||
|
* Configuration file |
||||||
|
* Please edit this file to match with your LDAP settings |
||||||
|
**/ |
||||||
|
|
||||||
|
require_once(dirname(__FILE__).'/ldap.inc.php'); |
||||||
|
|
||||||
|
/** |
||||||
|
* Array of connection parameters |
||||||
|
**/ |
||||||
|
$extldap_config = array( |
||||||
|
//base dommain string |
||||||
|
'base_dn' => 'dc=cblue,dc=be', |
||||||
|
//admin distinguished name |
||||||
|
'admin_dn' => 'cn=admin,dc=cblue,dc=be', |
||||||
|
//admin password |
||||||
|
'admin_password' => 'Im2ocEGish', |
||||||
|
//ldap host |
||||||
|
'host' => '192.168.61.1', |
||||||
|
//'port' => , default on 389 |
||||||
|
//protocl version (2 or 3) |
||||||
|
'protocol_version' => 3, |
||||||
|
//String used to search the user in ldap. %username will ber replaced by the username. |
||||||
|
//See extldap_get_user_search_string() function below |
||||||
|
'user_search' => 'uid=%username%', |
||||||
|
//encoding used in ldap (most common are UTF-8 and ISO-8859-1 |
||||||
|
'encoding' => 'UTF-8', |
||||||
|
//Set to true if user info have to be update at each login |
||||||
|
'update_userinfo' => true |
||||||
|
); |
||||||
|
|
||||||
|
/** |
||||||
|
* return the string used to search a user in ldap |
||||||
|
* |
||||||
|
* @param string username |
||||||
|
* @return string the serach string |
||||||
|
* @author ndiechburg <noel@cblue.be> |
||||||
|
**/ |
||||||
|
function extldap_get_user_search_string($username) |
||||||
|
{ |
||||||
|
global $extldap_config; |
||||||
|
return str_replace('%username%',$username,$extldap_config['user_search']); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Correspondance array between chamilo user info and ldap user info |
||||||
|
* This array is of this form : |
||||||
|
* '<chamilo_field> => <ldap_field> |
||||||
|
* |
||||||
|
* If <ldap_field> is "func", then the value of <chamilo_field> will be the return value of the function |
||||||
|
* extldap_get_<chamilo_field>($ldap_array) |
||||||
|
* In this cas you will have to declare the extldap_get_<chamilo_field> function |
||||||
|
* |
||||||
|
* If <ldap_field> is a string beginning with "!", then the value will be this string without "!" |
||||||
|
* |
||||||
|
* If <ldap_field> is any other string then the value of <chamilo_field> will be |
||||||
|
* $ldap_array[<ldap_field>][0] |
||||||
|
* |
||||||
|
* If <ldap_field> is an array then its value will be an array of values with the same rules as above |
||||||
|
* |
||||||
|
**/ |
||||||
|
$extldap_user_correspondance = array( |
||||||
|
'firstname' => 'cn', |
||||||
|
'lastname' => 'sn', |
||||||
|
'status' => 'func', |
||||||
|
'admin' => 'func', |
||||||
|
'email' => 'mail', |
||||||
|
'auth_source' => '!extldap', |
||||||
|
//'username' => , |
||||||
|
'language' => '!english', |
||||||
|
'password' => '!PLACEHOLDER', |
||||||
|
'extra' => array( |
||||||
|
'phone' => 'phone') |
||||||
|
); |
||||||
|
/** |
||||||
|
* Please declare here all the function you use in extldap_user_correspondance |
||||||
|
* All these functions must have an $ldap_user parameter. This parameter is the |
||||||
|
* array returned by the ldap for the user |
||||||
|
**/ |
||||||
|
/** |
||||||
|
* example function for email |
||||||
|
**/ |
||||||
|
/* |
||||||
|
function extldap_get_email($ldap_user){ |
||||||
|
return $ldap_user['cn'].$ldap['sn'].'@gmail.com'; |
||||||
|
} |
||||||
|
*/ |
||||||
|
function extldap_get_status($ldap_user){ |
||||||
|
return STUDENT; |
||||||
|
} |
||||||
|
function extldap_get_admin($ldap_user){ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
||||||
@ -0,0 +1,165 @@ |
|||||||
|
<?php // External login module : LDAP
|
||||||
|
/** |
||||||
|
* This files is included by newUser.ldap.php and login.ldap.php |
||||||
|
* It implements the functions nedded by both files |
||||||
|
**/ |
||||||
|
|
||||||
|
//Includes the configuration file |
||||||
|
require_once(dirname(__FILE__).'/../../inc/global.inc.php'); |
||||||
|
require_once(dirname(__FILE__).'/ldap.conf.php'); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a transcoded and trimmed string |
||||||
|
* |
||||||
|
* @param string |
||||||
|
* @return string |
||||||
|
* @author ndiechburg <noel@cblue.be> |
||||||
|
**/ |
||||||
|
function extldap_purify_string($string) |
||||||
|
{ |
||||||
|
global $extldap_config; |
||||||
|
if(isset($extldap_config['encoding'])) { |
||||||
|
return trim(api_to_system_encoding($string, $extldap_config['encoding'])); |
||||||
|
} |
||||||
|
else { |
||||||
|
return trim($string); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Establishes a connection to the LDAP server and sets the protocol version |
||||||
|
* |
||||||
|
* @return resource ldap link identifier or false |
||||||
|
* @author ndiechburg <noel@cblue.be> |
||||||
|
**/ |
||||||
|
function extldap_connect() |
||||||
|
{ |
||||||
|
global $extldap_config; |
||||||
|
|
||||||
|
//Trying to connect |
||||||
|
if (isset($extldap_config['port'])) { |
||||||
|
$ds = ldap_connect($extldap_config['host'],$extldap_config['port']); |
||||||
|
} else { |
||||||
|
$ds = ldap_connect($extldap_config['host']); |
||||||
|
} |
||||||
|
if (!$ds) { |
||||||
|
$port = isset($extldap_config['port']) ? $ldap_config['port'] : 389; |
||||||
|
error_log('EXTLDAP ERROR : cannot connect to '.$extldap_config['host'].':'. $port); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
//Setting protocol version |
||||||
|
if (isset($extldap_config['protocol_version'])) { |
||||||
|
if ( ! ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $extldap_config['protocol_version'])) { |
||||||
|
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 2); |
||||||
|
} |
||||||
|
} |
||||||
|
return $ds; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Authenticate user on external ldap server and return user ldap entry if that succeeds |
||||||
|
* |
||||||
|
* @return mixed false if user cannot authenticate on ldap, user ldap entry if tha succeeds |
||||||
|
* @author ndiechburg <noel@cblue.be> |
||||||
|
**/ |
||||||
|
function extldap_authenticate($username, $password) |
||||||
|
{ |
||||||
|
global $extldap_config; |
||||||
|
|
||||||
|
if (empty($username) or empty($password)){ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
$ds = extldap_connect(); |
||||||
|
if (!$ds) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
//Connection as admin to search dn of user |
||||||
|
$ldapbind = @ldap_bind($ds, $extldap_config['admin_dn'], $extldap_config['admin_password']); |
||||||
|
if ($ldapbind === false){ |
||||||
|
error_log('EXTLDAP ERROR : cannot connect with admin login/password'); |
||||||
|
return false; |
||||||
|
} |
||||||
|
$user_search = extldap_get_user_search_string($username); |
||||||
|
//Search distinguish name of user |
||||||
|
$sr = ldap_search($ds, $extldap_config['base_dn'], $user_search); |
||||||
|
if ( !$sr ){ |
||||||
|
error_log('EXTLDAP ERROR : ldap_search(ds, '.$extldap_config['base_dn'].", $user_search) failed"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
$entries_count = ldap_count_entries($ds,$sr); |
||||||
|
|
||||||
|
if ($entries_count > 1) { |
||||||
|
error_log('EXTLDAP ERROR : more than one entry for that user ( ldap_search(ds, '.$extldap_config['base_dn'].", $user_search) )"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
if ($entries_count < 1) { |
||||||
|
error_log('EXTLDAP ERROR : No entry for that user ( ldap_search(ds, '.$extldap_config['base_dn'].", $user_search) )"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
$users = ldap_get_entries($ds,$sr); |
||||||
|
$user = $users[0]; |
||||||
|
|
||||||
|
//now we try to autenthicate the user in the ldap |
||||||
|
$ubind = @ldap_bind($ds, $user['dn'], $password); |
||||||
|
if($ubind !== false){ |
||||||
|
return $user; |
||||||
|
} |
||||||
|
else { |
||||||
|
error_log('EXTLDAP : Wrong password for '.$user['dn']); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return an array with userinfo compatible with chamilo using $extldap_user_correspondance |
||||||
|
* configuration array declared in ldap.conf.php file |
||||||
|
* |
||||||
|
* @param array ldap user |
||||||
|
* @param array correspondance array (if not set use extldap_user_correspondance declared |
||||||
|
* in ldap.conf.php |
||||||
|
* @return array userinfo array |
||||||
|
* @author ndiechburg <noel@cblue.be> |
||||||
|
**/ |
||||||
|
function extldap_get_chamilo_user($ldap_user, $cor = null) |
||||||
|
{ |
||||||
|
global $extldap_user_correspondance; |
||||||
|
if ( is_null($cor) ) { |
||||||
|
$cor = $extldap_user_correspondance; |
||||||
|
} |
||||||
|
|
||||||
|
$chamilo_user =array(); |
||||||
|
foreach ($cor as $chamilo_field => $ldap_field) { |
||||||
|
if (is_array($ldap_field)){ |
||||||
|
$chamilo_user[$chamilo_field] = extldap_get_chamilo_user($ldap_user, $ldap_field); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
switch ($ldap_field) { |
||||||
|
case 'func': |
||||||
|
$func = "extldap_get_$chamilo_field"; |
||||||
|
if (function_exists($func)) { |
||||||
|
$chamilo_user[$chamilo_field] = extldap_purify_string($func($ldap_user)); |
||||||
|
} else { |
||||||
|
error_log("EXTLDAP WARNING : You forgot to declare $func"); |
||||||
|
} |
||||||
|
break; |
||||||
|
default: |
||||||
|
//if string begins with "!", then this is a constant |
||||||
|
if($ldap_field[0] === '!' ){ |
||||||
|
$chamilo_user[$chamilo_field] = trim($ldap_field, "!\t\n\r\0"); |
||||||
|
break; |
||||||
|
} |
||||||
|
if ( isset($ldap_user[$ldap_field][0]) ) { |
||||||
|
$chamilo_user[$chamilo_field] = extldap_purify_string($ldap_user[$ldap_field][0]); |
||||||
|
} else { |
||||||
|
error_log('EXTLDAP WARNING : '.$ldap_field. '[0] field is not set in ldap array'); |
||||||
|
|
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return $chamilo_user; |
||||||
|
} |
||||||
|
?> |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
<?php // External login module : LDAP
|
||||||
|
/** |
||||||
|
* |
||||||
|
* This file is included in main/inc/local.inc.php at user login if the user have 'external_ldap' in |
||||||
|
* his auth_source field insted of platform |
||||||
|
* |
||||||
|
* Variables that can be used : |
||||||
|
* - $login : string containing the username posted by the user |
||||||
|
* - $password : string containing the password posted by the user |
||||||
|
* - $uData : associative array with those keys : |
||||||
|
* -username |
||||||
|
* -password |
||||||
|
* -auth_source |
||||||
|
* -active |
||||||
|
* -expiration_date |
||||||
|
* |
||||||
|
* If login succeeds, we have 2 choices : |
||||||
|
* 1. - set $loginFailed to false, |
||||||
|
* - set $_SESSION['_user']['user_id'] with the dokeos user_id |
||||||
|
* - set $uidReset to true |
||||||
|
* - upgrade user info in dokeos database if needeed |
||||||
|
* - let the script local.inc.php continue |
||||||
|
* |
||||||
|
* 2. - set $_SESSION['_user']['user_id'] with the dokeos user_id |
||||||
|
* - set $_SESSION['_user']['uidReset'] to true |
||||||
|
* - upgrade user info in dokeos database if needeed |
||||||
|
* - redirect to any page and let local.inc.php do the magic |
||||||
|
* |
||||||
|
* If login fails we have to redirect to index.php with the right message |
||||||
|
* Possible messages are : |
||||||
|
* - index.php?loginFailed=1&error=access_url_inactive |
||||||
|
* - index.php?loginFailed=1&error=account_expired |
||||||
|
* - index.php?loginFailed=1&error=account_inactive |
||||||
|
* - index.php?loginFailed=1&error=user_password_incorrect |
||||||
|
* - index.php?loginFailed=1&error=unrecognize_sso_origin'); |
||||||
|
* |
||||||
|
**/ |
||||||
|
require_once(dirname(__FILE__).'/ldap.conf.php'); |
||||||
|
require_once(dirname(__FILE__).'/functions.inc.php'); |
||||||
|
|
||||||
|
$ldap_user = extldap_authenticate($login,$password); |
||||||
|
if ($ldap_user !== false) { |
||||||
|
$chamilo_user = extldap_get_chamilo_user($ldap_user); |
||||||
|
//userid is not on the ldap, we have to use $uData variable from local.inc.php |
||||||
|
$chamilo_user['user_id'] = $uData['user_id']; |
||||||
|
|
||||||
|
//Update user info |
||||||
|
if(isset($extldap_config['update_userinfo']) && $extldap_config['update_userinfo']) |
||||||
|
{ |
||||||
|
external_update_user($chamilo_user); |
||||||
|
} |
||||||
|
|
||||||
|
$loginFailed = false; |
||||||
|
$_user['user_id'] = $chamilo_user['user_id']; |
||||||
|
$_user['uidReset'] = true; |
||||||
|
api_session_register('_user'); |
||||||
|
$uidReset=true; |
||||||
|
event_login(); |
||||||
|
|
||||||
|
} else { |
||||||
|
$loginFailed = true; |
||||||
|
$uidReset = false; |
||||||
|
unset($_user['user_id']); |
||||||
|
} |
||||||
|
?> |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
<?php // External login module : LDAP
|
||||||
|
/** |
||||||
|
* This file is included by main/inc/local.inc.php when extldap is activated, a user try to login |
||||||
|
* and chamilo does not find his user |
||||||
|
* Variables that can be used : |
||||||
|
* - $login : string containing the username posted by the user |
||||||
|
* - $password : string containing the password posted by the user |
||||||
|
* |
||||||
|
* Please configure the exldap module in main/auth/external_login/ldap.conf.php |
||||||
|
* |
||||||
|
* If login succeeds, we have to add the user in the chamilo database and then |
||||||
|
* we have 2 choices : |
||||||
|
* 1. - set $loginFailed to false, |
||||||
|
* - set $_SESSION['_user']['user_id'] with the dokeos user_id |
||||||
|
* - set $uidReset to true |
||||||
|
* - let the script local.inc.php continue |
||||||
|
* |
||||||
|
* 2. - set $_SESSION['_user']['user_id'] with the dokeos user_id |
||||||
|
* - set $_SESSION['_user']['uidReset'] to true |
||||||
|
* - upgrade user info in dokeos database if needeed |
||||||
|
* - redirect to any page and let local.inc.php do the magic |
||||||
|
* |
||||||
|
* If login fails we have also 2 choices : |
||||||
|
* 1. - unset $_user['user_id'] |
||||||
|
* - set $loginFailed=true |
||||||
|
* - set $uidReset = false |
||||||
|
* User wil then have the user password incorrect message |
||||||
|
* |
||||||
|
* 2. We redirect the user to index.php with appropriate message : |
||||||
|
* Possible messages are : |
||||||
|
* - index.php?loginFailed=1&error=access_url_inactive |
||||||
|
* - index.php?loginFailed=1&error=account_expired |
||||||
|
* - index.php?loginFailed=1&error=account_inactive |
||||||
|
* - index.php?loginFailed=1&error=user_password_incorrect |
||||||
|
* - index.php?loginFailed=1&error=unrecognize_sso_origin'); |
||||||
|
**/ |
||||||
|
|
||||||
|
require_once(dirname(__FILE__).'/ldap.conf.php'); |
||||||
|
require_once(dirname(__FILE__).'/functions.inc.php'); |
||||||
|
|
||||||
|
$ldap_user = extldap_authenticate($login,$password); |
||||||
|
if ($ldap_user !== false) { |
||||||
|
$chamilo_user = extldap_get_chamilo_user($ldap_user); |
||||||
|
//username is not on the ldap, we have to use $login variable |
||||||
|
$chamilo_user['username'] = $login; |
||||||
|
$chamilo_uid = external_add_user($chamilo_user); |
||||||
|
if ($chamilo_uid !==false) { |
||||||
|
$loginFailed = false; |
||||||
|
$_user['user_id'] = $chamilo_uid; |
||||||
|
$_user['uidReset'] = true; |
||||||
|
api_session_register('_user'); |
||||||
|
$uidReset=true; |
||||||
|
// Is user admin? |
||||||
|
if ($chamilo_user['admin']=== true){ |
||||||
|
$is_platformAdmin = true; |
||||||
|
Database::query("INSERT INTO admin values ('$chamilo_uid')"); |
||||||
|
} |
||||||
|
} |
||||||
|
event_login(); |
||||||
|
} else { |
||||||
|
$loginFailed = true; |
||||||
|
$uidReset = false; |
||||||
|
unset($_user['user_id']); |
||||||
|
} |
||||||
|
|
||||||
|
?> |
||||||
Loading…
Reference in new issue