summaryrefslogblamecommitdiffstats
path: root/application/modules/user/controllers/PoolController.php
blob: ec71096307b9a0c99c2c4fb4df6e93ec317ed3f1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
     









                                                                           


                                                        
                            
                        
 

                              





                                                                                             
 


                                                                                                     


                                                                    
                                                                
         
 

                                     

                                                                 
                                          
                        
                                                                    













                                                                                           









                                                                                           
 
                                                
                                                                 
                                                                                                       
                                         




                                                           

                         

                                                              
                                                                                    
                                  

                                                                         
                 
                                                                  
 
                             
                                                   



                                                                                                                                          

                                                        
                                                                    
                                                                                

                                                             
 
                                                  
                                                                     
                                                                                                                
 
                                           



                                                                                  
                 
                

                                                                                   
                                                                                                          





                                                                                                                                                        
                                     
                                                   


                                                                                                             

                                                        
         

                                       

                                                                               


                                          

                                                       

                                          
                                           


                                                                                                                
                                                              
                       
                                                                
                                                                                                              
                                                                                                                        
                                                            




                                                                                           
                                                                                          

                                                                                           
                                                                                             
                                 
                         
                                                            
                 
         
 


                                                              
 

                                                       
                                          
                        







                                                                                   
                                                                                                          

                             
                                                                                                                 

                         
                                                                                             
         
 

                                        

                                                     

                                          
                                           
                                                                      

                                                                         


                                                                                   
                                                                     
                                                                                                            
                                                                                                        



                                                                  
                                                                                                                 
                         
                       
                                                                 
                                                                                                            
                                                                                                               
                                                             
                                    
                                                                                         



                                                                                                        
                                                                                                     
                                                                                           

                                                                                                       
                                                                         
                                                                                                                          
                                         
                                             
                                                                                                                                 


                                                                                           
                                                                                                                     
                                 


                                                              
         
 


                                                                  
                                                              
 

                                                               

                                          

                                                                             
                                                                                                                



                                                                                          
                         
                                                                                         
 



                                                                                                                              
                                                              
                       


                                                                                                                               






                                                                                     

                                                                         
                                                                                                                                                               
                                                                                                       



                                                                                               
                                         
                                                                             
                                                                                                                

                                     
                                                                                                                       


                                                                                   
                                                                                                           

                                                              
                 
         
 


                                                                            
                        

                                                                   
                                          
                        





                                                                                       
 

                                                                         
 

                                                                               

 
                                                                                                                                               



                                                                                                     
                                                                                                          

                             
                                                                                                                 


                         
                                                                                                     
                 





                                                                               









                                                                       


 









 
<?php
/*
 * Copyright (c) 2011 - OpenSLX GmbH, RZ Uni Freiburg
 * This program is free software distributed under the GPL version 2.
 * See http://gpl.openslx.org/
 *
 * If you have any feedback please consult http://feedback.openslx.org/ and
 * send your suggestions, praise, or complaints to feedback@openslx.org
 *
 * General information about OpenSLX can be found at http://openslx.org/
 */

class User_PoolController extends Zend_Controller_Action
{
	private $membership;
	protected $page;

	public function init()
	{
		if (Zend_Auth::getInstance()->hasIdentity()) {
			$userIDsNamespace = Zend_Session::namespaceGet('userIDs');
			if($userIDsNamespace['membershipID'] ==''){
				$pbsNotifier = new Pbs_Notifier();
				echo $pbsNotifier->notify('No membershipID set','forbidden');
			}

			$membershipMapper = new Application_Model_MembershipMapper();
			$this->membership = new Application_Model_Membership();
			$membershipMapper->find($userIDsNamespace['membershipID'],$this->membership);
		} else {
			$this->_helper->redirector('login', 'auth');
		}
		$this->page = $this->_request->getParam('page');
	}

	public function indexAction()
	{
		// ACL: is he allowed to see the pools of a group
		if(!Pbs_Acl::checkRight('poo'))
		$this->_redirect('/user');
			
		$result = $this->_request->getParam('deleteresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('delete',$result);
		}
		$result = $this->_request->getParam('modifyresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('modify',$result);
		}
		$result = $this->_request->getParam('addresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('create',$result);
		}
		$result = $this->_request->getParam('linkresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('link',$result);
		}
		$result = $this->_request->getParam('unlinkresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('unlink',$result);
		}

		// get all pools from this group
		$poolMapper = new Application_Model_PoolMapper();
		$pools = $poolMapper->findBy(array('groupID' => $this->membership->getGroupID()),true);
		foreach($pools as $pool){
			$ff = new Application_Model_Pool();
			$ff->setOptions($pool);
			$ff->setID($pool['poolID']);
			$yourpools[] = $ff;
		}
		 
		// Search
		$search = $this->_request->getParam('search');
		$mySearch = new Pbs_Search();
		$mySearch->setSearchTerm($search)		->setModule('pool');
		if($search != ''){
			$this->view->search = $mySearch->getSearchTerm();
			$yourpools = $mySearch->search($yourpools);
		}
		$this->view->searchform = $mySearch->searchForm();

		// Pagination
		$pagination = new Pbs_Pagination();
		$pagination->setPerPage(10)
					->setElement($yourpools)
					->setRequestPage($this->_request->getParam('page'))
					->setPageUrl('/user/pool/index'.((isset($this->view->search))?'/search/'.$this->view->search:''));
		$yourpools = $pagination->getElements();

		$this->view->pagination = $pagination->pagination();
		$this->view->page 		= $pagination->getRequestPage();
		$this->view->pools		= $yourpools;


		// Get all Clients from this group
		$clientmapper = new Application_Model_ClientMapper();
		$clientsArray = $clientmapper->findBy(array('groupID' => $this->membership->getGroupID()),true);

		// Get all assigned Clients
		$assignedclientmapper = new Application_Model_PoolEntriesMapper();
		$assignedclients = $assignedclientmapper->fetchAll();
		foreach($assignedclients as $c){
			$assignedclientsArray[] = $c->toArray();
		}
		
		$db = Zend_Db_Table::getDefaultAdapter();        
		// extract the un-assigned clients from the clientlist of the group
		$stmt = $db->query("SELECT c.clientID, c.groupID, macadress,hardwarehash,ip, ip6, created 
							FROM pbs_poolentries pe RIGHT OUTER JOIN pbs_client c ON
								c.clientID = pe.clientID
								WHERE poolentriesID IS NULL
								AND c.groupID = '".$this->membership->getGroupID()."'");				
	
		$freeclients  = $stmt->fetchAll();
		// Format Time-String
		foreach($freeclients as $k=>$cig){-
			$freeclients[$k]['created'] = date(Zend_Registry::get('dateformat'),$cig['created']);
		}
		
		if(Pbs_Acl::checkRight('posuc'))
		$this->view->freeclients = $freeclients;
	}

	public function searchAction(){
		$this->_redirect('/user/pool/index/search/'.($_GET['search']));
	}

	public function createpoolAction()
	{
		// ACL: is he allowed to create a pool?
		if(!Pbs_Acl::checkRight('poc'))
		$this->_redirect('/user');

		if (!isset($_POST["add"])){
			$addfilterform = new user_Form_Pool(array(
										'buttontext' => 'Create Pool',
										'page' => $this->page));	
			$this->view->addpool = $addfilterform;
		}else {
			$addpoolform = new user_Form_Pool(array(
										'buttontext' => 'Create Pool',
										'page' => $this->page),$_POST);		
			if ($addpoolform->isValid($_POST)) {
				try{
					$pool = new Application_Model_Pool($_POST);
					$pool->setGroupID($this->membership->getGroupID());
					$poolmapper = new Application_Model_PoolMapper();
					$poolmapper->save($pool);
					$this->_redirect('/user/pool/index/addresult/ok');
				}catch (Zend_Exception $e) {
					echo "Error message 2: " . $e->getMessage() . "\n";
					$this->_redirect('/user/pool/index/addresult/error');
				}
			}
			$this->view->addpool = $addpoolform;
		}
	}

	public function deletepoolAction()
	{
		$poolID = $this->_request->getParam('poolID');

		// ACL: is he allowed to delete a pool?
		if(!Pbs_Acl::checkRight('pod'))
		$this->_redirect('/user');
			
		if(is_numeric($poolID)){
			$poolmapper = new Application_Model_PoolMapper();
			$pool = new Application_Model_Pool();
			$poolmapper->find($poolID,$pool);
			if($this->membership->getGroupID() == $pool->getGroupID()){
				$deletepool = new Application_Model_Pool();
				$deletepool->setID($poolID);
				$poolmapper->delete($deletepool);
				$this->_redirect('/user/pool/index/page/'.$this->page.'/deleteresult/ok');
			}
			else{
				$this->_redirect('/user/pool/index/page/'.$this->page.'/deleteresult/forbidden');
			}
		}
		$this->_redirect('/user/pool/index/page/'.$this->page.'/deleteresult/error');
	}

	public function editpoolAction()
	{
		// ACL: is he allowed to edit a pool?
		if(!Pbs_Acl::checkRight('poe'))
		$this->_redirect('/user');

		if (!isset($_POST["add"])){
			$poolID = $this->_request->getParam('poolID');
			$pool = new Application_Model_Pool();
			$poolmapper = new Application_Model_PoolMapper();
			$poolmapper->find($poolID,$pool);
			if($pool->getGroupID() == $this->membership->getGroupID()){
				$poolArray = $pool->toArray();
				$editpool = new user_Form_Pool(array(
										'buttontext' => 'Edit Pool',
										'page' => $this->page));
				$editpool->populate($poolArray);
				$this->view->editpool = $editpool;
			}
			else{
				$this->_redirect('/user/pool/index/page/'.$this->page.'/modifyresult/forbidden');
			}
		}else {
			$editpoolform = new user_Form_Pool(array(
										'buttontext' => 'Edit Pool',
										'page' => $this->page),$_POST);
			if ($editpoolform->isValid($_POST)) {
				try{
					$poolmapper = new Application_Model_PoolMapper();
					$poolID = $this->_request->getParam('poolID');
					$pooldb = new Application_Model_Pool();
					$poolmapper->find($poolID,$pooldb);
					print_a($pooldb->getGroupID(), $this->membership->getGroupID());
					if($pooldb->getGroupID() == $this->membership->getGroupID()){
						$pool = new Application_Model_Pool($_POST);
						$pool->setID($poolID)
	 						 ->setGroupID($this->membership->getGroupID());
						$poolmapper->save($pool);
						$this->_redirect('/user/pool/index/page/'.$this->page.'/modifyresult/ok');
					}
					else{
						$this->_redirect('/user/pool/index/page/'.$this->page.'/modifyresult/forbidden');
					}
				}catch (Zend_Exception $e) {
					echo "Error message 2: " . $e->getMessage() . "\n";
					$this->_redirect('/user/pool/index/page/'.$this->page.'/modifyresult/error');
				}
			}
			$this->view->editpool = $editpoolform;
		}
	}

	public function linkclientAction()
	{
		$clientID = $this->_request->getParam('clientID');
		$poolID = $this->_request->getParam('poolID');

		// ACL: Is he allowed to link clients to pools?
		if(!Pbs_Acl::checkRight('polc'))
		$this->_redirect('/user');

		if(!isset($_POST['clientID']) && ($clientID == '')){
			$clientmapper = new Application_Model_ClientMapper();
			$clients = $clientmapper->findBy(array('groupID',$this->membership->getGroupID()),true);
			$assignedclientmapper = new Application_Model_PoolEntriesMapper();
			$assignedclients = $assignedclientmapper->fetchAll();
			foreach($assignedclients as $c){
				$assignedclientsArray[] = $c->toArray();
			}
			$freeclients  = $this->arrayDiff($clients,$assignedclientsArray);

			$poolclient = new user_Form_PoolClient(array(
												'buttontext' => 'Link Client',
												'clients'=> $freeclients,
												'page' => $this->page));
			$this->view->poolclient = $poolclient;
		}else {
			$poolclient = new user_Form_PoolClient(array(
												'buttontext' => 'Link Client',
												'page' => $this->page),$_POST);
			try{
				$poolID = $this->_request->getParam('poolID');
				$poolmapper = new Application_Model_PoolMapper();
				$pooldb = new Application_Model_Pool();
				$poolmapper->find($poolID,$pooldb);
				$clientmapper = new Application_Model_ClientMapper();
				$clientdb = new Application_Model_Client();
				$clientmapper->find($clientID,$clientdb);
					
				if($pooldb->getGroupID() == $this->membership->getGroupID()	&& $clientdb->getGroupID() == $this->membership->getGroupID()){
					$poolentriesmapper = new Application_Model_PoolEntriesMapper();
					$poolentry = new Application_Model_PoolEntries($_POST);
					$poolentry->setPoolID($poolID);
					if($poolentry->getClientID() == ''){
						$poolentry->setClientID($clientID);
					}
					$poolentriesmapper->save($poolentry);
					$this->_redirect('/user/pool/index/page/'.$this->page.'/linkresult/ok');
				}
				else{
					$this->_redirect('/user/pool/index/page/'.$this->page.'/linkresult/forbidden');
				}
			}catch (Zend_Exception $e) {
				echo "Error message 2: " . $e->getMessage() . "\n";
				$this->_redirect('/user/pool/index/page/'.$this->page.'/linkresult/error');
			}
			$this->view->poolclient = $poolclient;
		}
	}

	public function unlinkclientAction()
	{
		$poolentriesID = $this->_request->getParam('poolentriesID');
			
		// ACL: Is he allowed to unlink clients from pools?
		if(!Pbs_Acl::checkRight('pouc'))
		$this->_redirect('/user');
			
		if(is_numeric($poolentriesID)){
			$poolentriesMapper = new Application_Model_PoolEntriesMapper();
			$poolentry = new Application_Model_PoolEntries();
			$poolentriesMapper->find($poolentriesID,$poolentry);
			$clientMapper = new Application_Model_ClientMapper();
			$client = new Application_Model_Client();

			$poolMapper = new Application_Model_PoolMapper();
			$pool = new Application_Model_Pool();

			$clientMapper->find($poolentry->getClientID(),$client);
			$poolMapper->find($poolentry->getPoolID(),$pool);


			if($pool->getGroupID() == $this->membership->getGroupID() && $client->getGroupID() == $this->membership->getGroupID()){
				$deletepoolentries = new Application_Model_PoolEntries();
				$deletepoolentries->setID($poolentriesID);
				$deletepoolentriesmapper = new Application_Model_PoolEntriesMapper();
				$deletepoolentriesmapper->delete($deletepoolentries);
				$this->_redirect('/user/pool/index/page/'.$this->page.'/unlinkresult/ok');
			}
			else{
				$this->_redirect('/user/pool/index/page/'.$this->page.'/unlinkresult/forbidden');
			}
		}
		else{
			$this->_redirect('/user/pool/index/page/'.$this->page.'/unlinkresult/error');
		}
	}

	// creates an array of two arrays
	// first parameter is the list of all clients
	// second parameter is the list of clients which are already in a group
	// return value is a list of all clients, which are in no group
	private function arrayDiff($a, $b){
		foreach($a as $k1 => $i1){
			foreach($b as $k2 => $i2){
				if($i1['clientID'] == $i2['clientID']){
					unset($a[$k1]);
				}
			}
		}
		return $a;
	}

}