<?php

/*************************************************************************/
/* DOCEBO LCMS - Learning Content Managment System                       */
/* ======================================================================*/
/* Docebo is the new name of SpaghettiLearning Project                   */
/*                                                                       */
/* Copyright (c) 2005 by Emanuele Sandri (esandri@tiscali.it)            */
/*                                                                       */
/* This program is free software. You can redistribute it and/or modify  */
/* it under the terms of the GNU General Public License as published by  */
/* the Free Software Foundation; either version 2 of the License.        */
/*************************************************************************/

if(!defined('IN_DOCEBO')) die('You cannot access this file directly');

require_once( dirname(__FILE__) .'/lib.aclmanager.php' );

/**
 * Acl common tasks class
 * This class is only for check permissions
 * To manage ACLs we must use DoceboACLManager
 *
 * NOTE: ST means Security Token
 * 
 * @package admin-core
 * @subpackage user
 * @category ACL
 * @author   Emanuele Sandri <esandri @ tiscali . it>
 * @version  $Id: lib.acl.php 852 2006-12-16 14:04:44Z giovanni $
 */
class DoceboACL {
	/** Instance of DoceboACLManager */
	var $aclManager = NULL;

	/**
	 * constructor
	 * @param mixed $dbconn the connection to database or FALSE to use default connection
	 * @param mixed $prefix the prefix of the database or FLASE to use default prefix
	 */
	function DoceboACL( $dbconn = FALSE, $prefix = FALSE ) {
		$this->aclManager = new DoceboACLManager($dbconn, $prefix );
	}

	function &getACLManager() {
		return $this->aclManager;
	}

	/* NOTE: functions for retrieve single security token */
	/**
	 * get security token of an user
	 * @param string $userid id of the user
	 * @return mixed security token associated to user or FALSE
	 **/
	function getUserST( $userid ) {
		$arr = $this->aclManager->getUser( FALSE, $userid );
		if( $arr === FALSE )
			return FALSE;
		return $arr[ACL_INFO_IDST];
	}

	/**
	 * get security token of a group
	 * @param string $groupid id of the group
	 * @return mixed security token associated to groups or FALSE
	 **/
	function getGroupST( $groupid ) {
		$arr = $this->aclManager->getGroup( FALSE, $groupid );
		if( $arr === FALSE )
			return FALSE;

		return $arr[ACL_INFO_IDST];
	}

	/**
	 * get security token of a role
	 * @param string $roleid id of the role
	 * @return mixed security token associated to role or FALSE
	 **/
	function getRoleST( $roleid ) {
		$arr = $this->aclManager->getRole( FALSE, $roleid );
		if( $arr === FALSE )
			return FALSE;
		return $arr[ACL_INFO_IDST];
	}

	/* NOTE: functions for retrieve all security token */
	/**
	 * get all security token of a user
	 * @param string $userid id of the user
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of security tokens associated to the user or FALSE
	 **/
	function getUserAllST( $userid, $filter = '', $user_idst=FALSE ) {

		if($user_idst == FALSE) $user_idst = $this->getUserST( $userid );

		$arrST = array($user_idst);
		$arrRoles = array();
		$new_st = array($user_idst);
		$loop_check = 0;
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getGroupsAllContainer( $new_st, $filter );
        	
        	if(!empty($new_st)) $arrST = array_merge( $arrST, array_diff($new_st, $arrST ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		$new_st = $arrST;
        $loop_check = 0;
        
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getRolesAllContainer( $new_st );
        	
        	if(!empty($new_st)) $arrRoles = array_merge( $arrRoles, array_diff($new_st, $arrRoles ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		$arrST = array_merge( $arrST, $arrRoles);
		
		return $arrST;
	}

	/**
	 * get all security token of a group
	 * @param string $groupid id of the group
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of security tokens associated to the group or FALSE
	 **/
	function getGroupAllST( $groupid, $filter = '' ) {
		$group_idst = $this->getGroupST( $groupid );
		
		$arrST = array($group_idst);
		$arrRoles = array();
		$new_st = array($group_idst);
		$loop_check = 0;
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getGroupsAllContainer( $new_st, $filter );
        	
        	if(!empty($new_st)) $arrST = array_merge( $arrST, array_diff($new_st, $arrST ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		$new_st = $arrST;
        $loop_check = 0;
        
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getRolesAllContainer( $new_st );
        	
        	if(!empty($new_st)) $arrRoles = array_merge( $arrRoles, array_diff($new_st, $arrRoles ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		$arrST = array_merge( $arrST, $arrRoles);
		
		return $arrST;
	}

	/* NOTE: functions for retrieve groups */
	/**
	 * get all groups of a idst
	 * @param int $idst idst
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of groups of the user or FALSE
	 **/
	function getSTGroupsST( $idst, $filter = '') {
		$arrST = $this->aclManager->getGroupsContainer( $idst, $filter );
		// search in groups
		$count = 0;
		while( $count < count( $arrST ) ) {
			$idST = $arrST[$count];
			$arrResult = $this->aclManager->getGroupsContainer( $idST, $filter );
			$arrST = array_merge( $arrST, array_diff($arrResult, $arrST ));
			$count++;
		}
		return $arrST;
	}

	/**
	 * get all groups of an array of idst
	 * @param int $arr_idst idst
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of groups of the user or FALSE
	 **/
	function getArrSTGroupsST( $arr_idst, $filter = '' ) {
		$arrST = array_values($arr_idst);
		// search in groups
		$count = 0;
		while( $count < count( $arrST ) ) {
			$idST = $arrST[$count];
			$arrResult = $this->aclManager->getGroupsContainer( $idST, $filter );
			$arrST = array_values(array_unique(array_merge( $arrST, array_diff($arrResult, $arrST ))));
			$count++;
		}
		return $arrST;
	}

	/**
	 * get all groups of a idst_user
	 * @param int $idst_user idst
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of groups of the user or FALSE
	 **/
	function getUserGroupsST( $idst_user, $filter = '' ) {
		return $this->getSTGroupsST( $idst_user, $filter );
	}

	/**
	 * get all groups of a idst_group
	 * @param int $idst_group idst
	 * @param string $filter (Optional). Filter to applay.
	 * @return mixed array of groups of the user or FALSE
	 **/
	function getGroupGroupsST( $idst_group, $filter = '' ) {
		return $this->getSTGroupsST( $idst_group, $filter );
	}

	/**
	 * get all groups of a group
	 * @param int $idst idst of the group
	 * @return mixed array of groups of the group or FALSE
	 **/
	function getGroupGDescendants( $idst ) {
		return $this->aclManager->getGroupGDescendants( $idst );
	}

	/**
	 * get all descendant users of a group
	 * @param int $idst idst of the group
	 * @return mixed array of users of the group or FALSE
	 **/
	function getGroupUDescendants( $idst ) {
		return $this->aclManager->getGroupUDescendants( $idst );
	}

	/* NOTE: functions for retrieve roles */
	/**
	 * get all roles of a user
	 * @param string $userid id of the user
	 * @return mixed array of roles of the user or FALSE
	 **/
	function getUserRoles( $userid ) {
	}

	/**
	 * get all roles of a group
	 * @param string $groupid id of the group
	 * @return mixed array of roles of the group or FALSE
	 **/
	function getGroupRoles( $groupid ) {
	}

	/* NOTE: functions to test match with single security token */
	function _searchMatch( $idst, $idstMatch ) {
		
		if( in_array($idst,$idstMatch ) )
			return TRUE;
			
		$arrST = array($idst);
		$arrRoles = array();
		$new_st = array($idst);
		$loop_check = 0;
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getGroupsAllContainer( $new_st, '' );
        	if( count(array_intersect($idstMatch, $new_st)) > 0 )
				return TRUE;
        	
        	if(!empty($new_st)) $arrST = array_merge( $arrST, array_diff($new_st, $arrST ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		$new_st = $arrST;
        $loop_check = 0;
        
		do {
			$loop_check++;
        	$new_st = $this->aclManager->getRolesAllContainer( $new_st );
        	if( count(array_intersect($idstMatch, $new_st)) > 0 )
				return TRUE;
        	
        	if(!empty($new_st)) $arrRoles = array_merge( $arrRoles, array_diff($new_st, $arrRoles ));
		} while(!empty($new_st) && ($loop_check < 50));
		
		return false;
	}

	/**
	 * match a user with a security token
	 * @param string $userid id of the user
	 * @param int $st security token to match
	 * @return bool TRUE if match, FALSE otherwise
	 **/
	function matchUserST( $userid, $st ) {
		$idst = $this->getUserST( $userid );
		return $this->_searchMatch( $idst, array($st) );
	}

	/**
	 * match a group with a security token
	 * @param string $groupid id of the group
	 * @param int $st security token to match
	 * @return bool TRUE if match, FALSE otherwise
	 **/
	function matchGroupST( $groupid, $st ) {
		$idst = $this->getGroupST( $groupid );
		return $this->_searchMatch( $idst, array($st) );
	}

	/* NOTE: functions to test match with multiple security token */
	/**
	 * match a user with an array of security token
	 * @param string $userid id of the user
	 * @param array $st array of security token to match
	 * @return bool TRUE if match, FALSE otherwise
	 **/
	function matchUserSTArray( $userid, $st ) {
		$idst = $this->getUserST( $userid );
		return $this->_searchMatch( $idst, $st );
	}

	/**
	 * match a group with an array of security token
	 * @param string $groupid id of the group
	 * @param int $st array of security token to match
	 * @return bool TRUE if match, FALSE otherwise
	 **/
	function matchGroupSTArray( $groupid, $st ) {
		$idst = $this->getGroupST( $groupid );
		return $this->_searchMatch( $idst, $st );
	}
}

?>
