Pārlūkot izejas kodu

[svn r14997] Added LDAP functions from admin section

Yannick Warnier 17 gadi atpakaļ
vecāks
revīzija
2095210452
1 mainītis faili ar 256 papildinājumiem un 1 dzēšanām
  1. 256 1
      main/auth/ldap/authldap.php

+ 256 - 1
main/auth/ldap/authldap.php

@@ -1,4 +1,4 @@
-<?php // $Id: authldap.php 14968 2008-04-21 02:06:06Z yannoo $
+<?php // $Id: authldap.php 14997 2008-04-22 01:33:31Z yannoo $
 /*
 ==============================================================================
 	Dokeos - elearning and course management software
@@ -414,4 +414,259 @@ function ldap_handle_bind(&$ldap_handler,&$ldap_bind)
 		return true;
 	}
 }
+/**
+ * Get the total number of users on the platform
+ * @see SortableTable#get_total_number_of_items()
+ * @author	Mustapha Alouani
+ */
+function ldap_get_users()
+{
+
+	global $ldap_basedn, $ldap_host, $ldap_port, $ldap_rdn, $ldap_pass;
+	
+	$keyword_firstname = trim(Database::escape_string($_GET['keyword_firstname']));
+	$keyword_lastname = trim(Database::escape_string($_GET['keyword_lastname']));
+	$keyword_username = trim(Database::escape_string($_GET['keyword_username']));
+	$keyword_type = Database::escape_string($_GET['keyword_type']);
+	
+	$ldap_query=array();
+	
+	if ($keyword_username != "") {
+		$ldap_query[]="(uid=".$keyword_username."*)";
+	} else if ($keyword_lastname!=""){
+		$ldap_query[]="(sn=".$keyword_lastname."*)";
+		if ($keyword_firstname!="") {
+			$ldap_query[]="(givenName=".$keyword_firstname."*)";
+		}
+	}
+	if ($keyword_type !="" && $keyword_type !="all") {
+		$ldap_query[]="(employeeType=".$keyword_type.")";
+	}
+	
+	if (count($ldap_query)>1){
+		$str_query.="(& ";
+		foreach ($ldap_query as $query){
+			$str_query.=" $query";
+		}
+		$str_query.=" )"; 
+	} else {
+		$str_query=$ldap_query[0];
+	}
+
+	$ds = ldap_connect($ldap_host, $ldap_port);
+	ldap_set_version($ds);
+	if ($ds && count($ldap_query)>0) {
+		$r = false;
+		$res = ldap_handle_bind($ds, $r);
+		//$sr = ldap_search($ds, "ou=test-ou,$ldap_basedn", $str_query);
+		$sr = ldap_search($ds, $ldap_basedn, $str_query);
+		//echo "Le nombre de resultats est : ".ldap_count_entries($ds,$sr)."<p>";
+		$info = ldap_get_entries($ds, $sr);
+		return $info;
+
+	} else {
+		if (count($ldap_query)!=0)
+			Display :: display_error_message(get_lang('LDAPConnectionError'));
+		return array();
+	}
+}
+
+
+
+/**
+ * Get the total number of users on the platform
+ * @see SortableTable#get_total_number_of_items()
+ * @author	Mustapha Alouani
+ */
+function ldap_get_number_of_users()
+{
+		
+	$info = ldap_get_users();
+	if (count($info)>0)
+		return $info['count'];
+	else 
+		return 0;
+
+}
+
+/**
+ * Get the users to display on the current page.
+ * @see SortableTable#get_table_data($from)
+ * @author	Mustapha Alouani
+ */
+function ldap_get_user_data($from, $number_of_items, $column, $direction)
+{
+	$users = array();
+	if (isset($_GET['submit']))
+	{
+		$info = ldap_get_users();
+		if ($info['count']>0)
+		{
+			for ($key = 0; $key < $info["count"]; $key ++)
+			{
+				$user=array();
+				// Get uid from dn
+				//YW: this might be a variation between LDAP 2 and LDAP 3, but in LDAP 3, the uid is in
+				//the corresponding index of the array
+				//$dn_array=ldap_explode_dn($info[$key]["dn"],1);
+				//$user[] = $dn_array[0]; // uid is first key
+				//$user[] = $dn_array[0]; // uid is first key
+				$user[] = $info[$key]['uid'][0];
+				$user[] = $info[$key]['uid'][0];
+				$user[] = iconv('utf-8', api_get_setting('platform_charset'), $info[$key]['sn'][0]);
+				$user[] = iconv('utf-8', api_get_setting('platform_charset'), $info[$key]['givenname'][0]);
+				$user[] = $info[$key]['mail'][0];
+				$outab[] = $info[$key]['eduPersonPrimaryAffiliation'][0]; // Ici "student"
+				$users[] = $user;
+			}
+			
+		} 
+		else
+		{
+			Display :: display_error_message(get_lang('NoUser'));
+		}	
+	}
+	return $users;
+}
+
+/**
+ * Build the modify-column of the table
+ * @param int $user_id The user id
+ * @param string $url_params
+ * @return string Some HTML-code with modify-buttons
+ * @author	Mustapha Alouani
+ */
+function modify_filter($user_id,$url_params, $row)
+{
+	$url_params_id="id[]=".$row[0];
+	//$url_params_id="id=".$row[0];	
+	$result .= '<a href="ldap_users_list.php?action=add_user&amp;user_id='.$user_id.'&amp;id_session='.Security::remove_XSS($_GET['id_session']).'&amp;'.$url_params_id.'&amp;sec_token='.$_SESSION['sec_token'].'"  onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;"><img src="../img/add_user.gif" border="0" style="vertical-align: middle;" title="'.get_lang('AddUsers').'" alt="'.get_lang('AddUsers').'"/></a>';
+	return $result;
+}
+
+/**
+ * Adds a user to the Dokeos database or updates its data
+ * @param	string	username (and uid inside LDAP)
+ * @author	Mustapha Alouani
+ */
+function ldap_add_user($login)
+{
+	global $ldap_basedn, $ldap_host, $ldap_port, $ldap_rdn, $ldap_pass;
+	
+	$ds = ldap_connect($ldap_host, $ldap_port);
+	ldap_set_version($ds);
+	if ($ds)
+	{
+		$str_query="(uid=".$login.")";
+		$r = false;
+		$res = ldap_handle_bind($ds, $r);
+		$sr = ldap_search($ds, $ldap_basedn, $str_query);
+		//echo "Le nombre de resultats est : ".ldap_count_entries($ds,$sr)."<p>";
+		$info = ldap_get_entries($ds, $sr);
+
+		for ($key = 0; $key < $info['count']; $key ++)
+		{
+			$lastname = iconv('utf-8', api_get_setting('platform_charset'), $info[$key]['sn'][0]);
+			$firstname = iconv('utf-8', api_get_setting('platform_charset'), $info[$key]['givenname'][0]);
+			$email = $info[$key]['mail'][0];
+			// Get uid from dn
+			$dn_array=ldap_explode_dn($info[$key]['dn'],1);
+			$username = $dn_array[0]; // uid is first key
+			$outab[] = $info[$key]['edupersonprimaryaffiliation'][0]; // Ici "student"
+			//$val = ldap_get_values_len($ds, $entry, "userPassword");
+			//$val = ldap_get_values_len($ds, $info[$key], "userPassword");
+			//$password = $val[0];
+			// TODO the password, if encrypted at the source, will be encrypted twice, which makes it useless. Try to fix that.
+			$password = $info[$key]['userPassword'][0];
+			$structure=$info[$key]['edupersonprimaryorgunitdn'][0];
+			$array_structure=explode(",", $structure);
+			$array_val=explode("=", $array_structure[0]);
+			$etape=$array_val[1];
+			$array_val=explode("=", $array_structure[1]);
+			$annee=$array_val[1];
+			// Pour faciliter la gestion on ajoute le code "etape-annee"
+			$official_code=$etape."-".$annee;
+			$auth_source='ldap';
+			// Pas de date d'expiration d'etudiant (a recuperer par rapport au shadow expire LDAP)
+			$expiration_date='0000-00-00 00:00:00';
+			$active=1;
+			if(empty($status)){$status = 5;}
+			if(empty($phone)){$phone = '';}
+			if(empty($picture_uri)){$picture_uri = '';}
+			// Ajout de l'utilisateur
+			if (UserManager::is_username_available($username))
+			{
+				$user_id = UserManager::create_user($firstname,$lastname,$status,$email,$username,$password,$official_code,api_get_setting('platformLanguage'),$phone,$picture_uri,$auth_source,$expiration_date,$active);
+			}
+			else
+			{
+				$user = UserManager::get_user_info($username);
+				$user_id=$user['user_id'];
+				UserManager::update_user($user_id, $firstname, $lastname, $username, null, null, $email, $status, $official_code, $phone, $picture_uri, $expiration_date, $active);
+			}
+		}
+
+	} 
+	else 
+	{
+		Display :: display_error_message(get_lang('LDAPConnectionError'));
+	}
+	return $user_id;;
+}
+
+/**
+ * Adds a list of users to one session
+ * @param	array	Array of user ids
+ * @param	string	Course code
+ * @return	void
+ */
+function ldap_add_user_to_session($UserList, $id_session)
+{
+
+	// Database Table Definitions
+	$tbl_session						= Database::get_main_table(TABLE_MAIN_SESSION);
+	$tbl_session_rel_class				= Database::get_main_table(TABLE_MAIN_SESSION_CLASS);
+	$tbl_session_rel_course				= Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
+	$tbl_session_rel_course_rel_user	= Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
+	$tbl_course							= Database::get_main_table(TABLE_MAIN_COURSE);
+	$tbl_user							= Database::get_main_table(TABLE_MAIN_USER);
+	$tbl_session_rel_user				= Database::get_main_table(TABLE_MAIN_SESSION_USER);
+	$tbl_class							= Database::get_main_table(TABLE_MAIN_CLASS);
+	$tbl_class_user						= Database::get_main_table(TABLE_MAIN_CLASS_USER);
+
+	$id_session = (int) $id_session;
+	// Une fois les utilisateurs importer dans la base des utilisateurs, on peux les affecter a� la session
+	$result=api_sql_query("SELECT course_code FROM $tbl_session_rel_course " .
+			"WHERE id_session='$id_session'",__FILE__,__LINE__);
+	$CourseList=array();
+	while($row=Database::fetch_array($result))
+	{
+		$CourseList[]=$row['course_code'];
+	}
+	foreach($CourseList as $enreg_course)
+	{
+		foreach($UserList as $enreg_user)
+		{
+			$enreg_user = (int) $enreg_user;
+			api_sql_query("INSERT IGNORE INTO $tbl_session_rel_course_rel_user(id_session,course_code,id_user) VALUES('$id_session','$enreg_course','$enreg_user')",__FILE__,__LINE__);
+		}
+		$sql = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_course_rel_user " .
+				"WHERE id_session='$id_session' AND course_code='$enreg_course'";
+		$rs = api_sql_query($sql, __FILE__, __LINE__);
+		list($nbr_users) = Database::fetch_array($rs);
+		api_sql_query("UPDATE $tbl_session_rel_course  SET nbr_users=$nbr_users " .
+				"WHERE id_session='$id_session' AND course_code='$enreg_course'",__FILE__,__LINE__);
+	}
+	foreach($UserList as $enreg_user)
+	{
+		$enreg_user = (int) $enreg_user;
+		api_sql_query("INSERT IGNORE INTO $tbl_session_rel_user(id_session, id_user) " .
+				"VALUES('$id_session','$enreg_user')",__FILE__,__LINE__);
+	}
+	// On mets a jour le nombre d'utilisateurs dans la session
+	$sql = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_user WHERE id_session='$id_session'";
+	$rs = api_sql_query($sql, __FILE__, __LINE__);
+	list($nbr_users) = Database::fetch_array($rs);
+	api_sql_query("UPDATE $tbl_session SET nbr_users=$nbr_users WHERE id='$id_session'",__FILE__,__LINE__);
+}
 ?>