File: 0.01.1a/core/ContextManager.php (View as HTML)

  1: <?php 
  2: /* -------------------------------------------------------------
  3: This file is part of FreeDESK
  4: 
  5: FreeDESK is (C) Copyright 2012 David Cutting
  6: 
  7: FreeDESK is free software: you can redistribute it and/or modify
  8: it under the terms of the GNU General Public License as published by
  9: the Free Software Foundation, either version 3 of the License, or
 10: (at your option) any later version.
 11: 
 12: FreeDESK is distributed in the hope that it will be useful,
 13: but WITHOUT ANY WARRANTY; without even the implied warranty of
 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15: GNU General Public License for more details.
 16: 
 17: You should have received a copy of the GNU General Public License
 18: along with FreeDESK.  If not, see www.gnu.org/licenses
 19: 
 20: For more information see www.purplepixie.org/freedesk/
 21: -------------------------------------------------------------- */
 22: 
 23: /**
 24:  * Context Connection Types
 25: **/
 26: abstract class ContextType
 27: {
 28: 	/**
 29: 	 * None
 30: 	**/
 31: 	const None = -1;
 32: 	/**
 33: 	 * System
 34: 	**/
 35: 	const System = 0;
 36: 	/**
 37: 	 * User
 38: 	**/
 39: 	const User = 1;
 40: 	/**
 41: 	 * Customer
 42: 	**/
 43: 	const Customer = 2;
 44: }
 45: 
 46: /**
 47:  * Menu Items
 48: **/
 49: class MenuItem
 50: {
 51: 	/**
 52: 	 * Tag Name
 53: 	**/
 54: 	var $tag = "";
 55: 	/**
 56: 	 * Display Name
 57: 	**/
 58: 	var $display = "";
 59: 	/**
 60: 	 * Link
 61: 	**/
 62: 	var $link = "#";
 63: 	/**
 64: 	 * Onclick event
 65: 	**/
 66: 	var $onclick = "";
 67: 	/**
 68: 	 * Sub-Menu
 69: 	**/
 70: 	var $submenu = array();
 71: }
 72: 
 73: /**
 74:  * Context Manager for FreeDESK - handle connections to the system
 75: **/
 76: class ContextManager
 77: {
 78: 	/**
 79: 	 * FreeDESK instance
 80: 	**/
 81: 	private $DESK = null;
 82: 	
 83: 	/**
 84: 	 * Open Context Flag
 85: 	**/
 86: 	private $open = false;
 87: 	
 88: 	/**
 89: 	 * Context Type
 90: 	**/
 91: 	private $type = ContextType::None;
 92: 	
 93: 	/**
 94: 	 * Current Session
 95: 	**/
 96: 	var $Session = null;
 97: 	
 98: 	/**
 99: 	 * Menu Items
100: 	**/
101: 	var $MenuItems = array();
102: 	
103: 	/**
104: 	 * Session Manager
105: 	**/
106: 	private $SessionManager = null;
107: 	
108: 	/**
109: 	 * Constructor
110: 	 * @param mixed $freeDESK FreeDESK instance
111: 	**/
112: 	function ContextManager(&$freeDESK)
113: 	{
114: 		$this->DESK = &$freeDESK;
115: 		$this->DESK->PluginManager->Register(new Plugin(
116: 			"Context Manager", "0.01", "Core" ));
117: 		// Load the SessionManager
118: 		$this->SessionManager = $this->DESK->Include->IncludeInstance("core/SessionManager.php","SessionManager");
119: 		
120: 		// Our permissions
121: 		$this->DESK->PermissionManager->Register("user_admin",false);
122: 		$this->DESK->PermissionManager->Register("sysadmin_advanced",false);
123: 	}
124: 	
125: 	/**
126: 	 * Check if context is open
127: 	 * @return bool open flag
128: 	**/
129: 	function IsOpen()
130: 	{
131: 		return $this->open;
132: 	}
133: 	
134: 	/**
135: 	 * Get the current type of open context
136: 	**/
137: 	function GetType()
138: 	{
139: 		if (!$this->open)
140: 			return ContextType::None;	// should be that if closed but to be safe
141: 		return $this->type;
142: 	}
143: 	
144: 	/**
145: 	 * Check if has permission
146: 	 * @param string $perm Permission type requested
147: 	 * @return bool flag indicating if context has permission
148: 	**/
149: 	function Permission($perm)
150: 	{
151: 		if (!$this->open)
152: 			return false; // no open context
153: 		else if ($this->type == ContextType::None)
154: 			return false; // no context type
155: 		else if ($this->type == ContextType::System)
156: 			return true; // system context - all permissions
157: 		else if ($this->type == ContextType::User)
158: 		{
159: 			return $this->DESK->PermissionManager->UserPermission($perm, $this->Session->username);
160: 		}
161: 		else if ($this->type == ContextType::Customer)
162: 			return true; // TO BE IMPLEMENTED WITH PermissionManager
163: 		else
164: 			return false; // default - refused
165: 	}
166: 	
167: 	/**
168: 	 * Open a context
169: 	 * @param mixed $type Context type (from ContextType consts)
170: 	 * @param string $sid Session ID if existing session (optional)
171: 	 * @param string $username Username (optional)
172: 	 * @param string $password Password (optional)
173: 	 * @return bool returns true if successful or false on failure
174: 	**/
175: 	function Open($type, $sid="", $username="", $password="")
176: 	{
177: 		if ($type == ContextType::System)
178: 		{
179: 			$this->type = $type;
180: 			$this->open = true;
181: 			return true;
182: 		}
183: 		else if ($type == ContextType::User)
184: 		{
185: 			if ($sid=="")
186: 			{
187: 				$session=$this->SessionManager->Create($type, $username, $password);
188: 				if (!$session) // session creation failed
189: 				{
190: 					$this->DESK->LoggingEngine->Log("Session Creation Failed for User ".$username, "Context", "Fail", 4);
191: 					return false;
192: 				}
193: 				else
194: 				{
195: 					$this->DESK->LoggingEngine->Log("Session Created for User ".$username, "Context", "Open", 9);
196: 					$this->type = $type;
197: 					$this->open = true;
198: 					$this->Session=$session;
199: 					$this->BuildMenuItems();
200: 					return true;
201: 				}
202: 			}
203: 			else // pre-existing session
204: 			{
205: 				$session=$this->SessionManager->Check($sid);
206: 				if (!$session)
207: 				{
208: 					$this->DESK->LoggingEngine->Log("Session Check Failed for SID ".$sid, "Context", "Fail", 9);
209: 					return false;
210: 				}
211: 				else
212: 				{
213: 					$this->DESK->LoggingEngine->Log("Session Check for User ".$session->username, "Context", "Check", 9);
214: 					$this->type = $type;
215: 					$this->open = true;
216: 					$this->Session=$session;
217: 					$this->BuildMenuItems();
218: 					return true;
219: 				}
220: 			}
221: 		}
222: 		else if ($type == ContextType::Customer)
223: 		{
224: 			if ($sid=="")
225: 			{
226: 				$session=$this->SessionManager->Create($type, $username, $password);
227: 				if (!$session) // session creation failed
228: 				{
229: 					$this->DESK->LoggingEngine->Log("Session Creation Failed for Customer ".$username, "Context", "Fail", 4);
230: 					return false;
231: 				}
232: 				else
233: 				{
234: 					$this->DESK->LoggingEngine->Log("Session Created for Customer ".$username, "Context", "Open", 9);
235: 					$this->type = $type;
236: 					$this->open = true;
237: 					$this->Session=$session;
238: 					$this->BuildMenuItems();
239: 					return true;
240: 				}
241: 			}
242: 			else // pre-existing session
243: 			{
244: 				$session=$this->SessionManager->Check($sid);
245: 				if (!$session)
246: 				{
247: 					$this->DESK->LoggingEngine->Log("Session Check Failed for SID ".$sid, "Context", "Fail", 9);
248: 					return false;
249: 				}
250: 				else
251: 				{
252: 					$this->DESK->LoggingEngine->Log("Session Check for Customer ".$session->username, "Context", "Check", 9);
253: 					$this->type = $type;
254: 					$this->open = true;
255: 					$this->Session=$session;
256: 					$this->BuildMenuItems();
257: 					return true;
258: 				}
259: 			}
260: 		}
261: 		return false;
262: 	}
263: 	
264: 	/**
265: 	 * Close the open context
266: 	**/
267: 	function Close()
268: 	{
269: 		$this->Session = null;
270: 		$this->type = ContextType::None;
271: 		$this->open = false;
272: 	}
273: 	
274: 	/**
275: 	 * Destroy the context (logout action)
276: 	**/
277: 	function Destroy()
278: 	{
279: 		if (!$this->open)
280: 			return false;
281: 		$this->SessionManager->Destroy($this->Session->sid);
282: 	}
283: 	
284: 	/**
285: 	 * Get menu items for current context
286: 	 * @return mixed menu item description array or bool false for no menu
287: 	**/
288: 	function MenuItems()
289: 	{
290: 		if (!$this->open)
291: 			return false;
292: 	
293: 		return $this->MenuItems;
294: 	}
295: 	
296: 	
297: 	/**
298: 	 * Add a menu item (if tag exists will append otherwise will create as new)
299: 	**/
300: 	function AddMenuItem($tag, $item)
301: 	{
302: 		if (isset($this->MenuItems[$tag]))
303: 			$this->MenuItems[$tag]->submenu[] = $item;
304: 		else
305: 			$this->MenuItems[$tag] = $item;
306: 	}
307: 	
308: 	/**
309: 	 * Build menu items list
310: 	**/
311: 	function BuildMenuItems()
312: 	{
313: 		
314: 		$home = new MenuItem();
315: 		$home->tag="home";
316: 		$home->onclick="DESK.displayMain(true);";
317: 		$home->display="Home";
318: 		
319: 		$myreq = new MenuItem();
320: 		$myreg->tag="myreq";
321: 		$myreq->onclick="DESK.displayMain(true); DESK.mainPane(0, '".$this->Session->username."');";
322: 		$myreq->display="My Requests";
323: 		$home->submenu[]=$myreq;
324: 		
325: 		$this->AddMenuItem("home", $home);
326: 		
327: 		$user = new MenuItem();
328: 		$user->tag="request";
329: 		$user->display="Requests";
330: 		
331: 		$classes = $this->DESK->RequestManager->GetRequestClasses();
332: 		
333: 		foreach($classes as $id => $class)
334: 		{
335: 			$req = new MenuItem();
336: 			$req->tag="newrequest_".$id;
337: 			$req->display="New ".$class['classname'];
338: 			$req->onclick="DESK.createRequest(".$id.");";
339: 			$user->submenu[]=$req;
340: 		}
341: 		
342: 		$this->AddMenuItem("request", $user);
343: 		
344: 		$entity = new MenuItem();
345: 		$entity->tag="entity";
346: 		$entity->display="Entity";
347: 		
348: 		foreach($this->DESK->DataDictionary->Tables as $table)
349: 		{
350: 			if ($table->editable && $this->DESK->ContextManager->Permission("entity_".$table->entity))
351: 			{
352: 				$add = new MenuItem();
353: 				$add->tag=$table->entity."_create";
354: 				$name = $table->name == "" ? $table->entity : $table->name;
355: 				$add->display="Add ".$name;
356: 				$add->onclick="DESK.entityCreate('".$table->entity."');";
357: 				$entity->submenu[]=$add;
358: 				
359: 				$search = new MenuItem();
360: 				$search->tag=$table->entity."_search";
361: 				$search->display="Search ".$name;
362: 				$search->onclick="DESK.entitySearch('".$table->entity."');";
363: 				$entity->submenu[]=$search;
364: 			}
365: 		}
366: 		
367: 		$this->AddMenuItem("entity", $entity);
368: 		
369: 		$sys = new MenuItem();
370: 		$sys->tag="system";
371: 		$sys->display="System";
372: 		
373: 		if ($this->DESK->ContextManager->Permission("page.sysadmin"))
374: 		{
375: 			$i = new MenuItem();
376: 			$i->tag="sysadmin";
377: 			$i->display="System Settings";
378: 			$i->onclick="DESK.loadSubpage('sysadmin');";
379: 			$sys->submenu[]=$i;
380: 		}
381: 		
382: 		$relogin = new MenuItem();
383: 		$relogin->tag="relogin";
384: 		$relogin->display="Relogin";
385: 		$relogin->onclick="DESK.relogin();";
386: 		$sys->submenu[]=$relogin;
387: 		
388: 		$mobile = new MenuItem();
389: 		$mobile->tag="mobile";
390: 		$mobile->display="Mobile Interface";
391: 		$mobile->onclick="DESK.goMobile();";
392: 		$sys->submenu[]=$mobile;
393: 		
394: 		$logout = new MenuItem();
395: 		$logout->tag="logout";
396: 		$logout->display="Logout";
397: 		$logout->onclick="DESK.logout_click();";
398: 		$sys->submenu[]=$logout;
399: 		
400: 		$this->AddMenuItem("system", $sys);
401: 				
402: 		$pages = new MenuItem();
403: 		$pages->tag="pages";
404: 		$pages->display="Pages";
405: 		
406: 		$debug = new MenuItem();
407: 		$debug->tag="debug";
408: 		$debug->display="Debug";
409: 		$debug->onclick="DESK.loadSubpage('debug');";
410: 		$pages->submenu[]=$debug;
411: 		
412: 		$this->AddMenuItem("pages", $pages);
413: 				
414: 		$this->DESK->PluginManager->BuildMenu();
415: 	}
416: 	
417: }
418: ?>
419: