<?php

/**
 *
 * @author Peter Csubak (chuby)
 * @copyright Peter Csubak (chuby)
 */

class ProtectFrom extends Annotation{
	public $value; //"csoport név" | {"csort név1", "csoport név2"...}
}

class GrantTo extends Annotation{
	public $value; //"csoport név" | {"csoport név1", "csoport név2"...}
}

class SecureSession {
	

	private static $Instance = null;

	/**
	 * Szabályos singleton példánykérő metódus. Tehát egy példányt ad vissza, ha már létezik egy példány,
	 * akkor mindig ugyan azt. Ha nem akkor, létrehoz egyet. Gyakorlatilag ez a metódus szolgál a 
	 * példányosító utasítás helyett.
	 * 
	 * @return SecureSession A kért példány.
	 */
	public static function getInstance(){
		if (self::$Instance == null){
			self::$Instance = new SecureSession();
		}
		return self::$Instance;
	}

	/**
	 * A singleton miatt kell, hogy privát metódus legyen a konstruktor.
	 */
	private function __construct(){
	}
	
	/**
	 * Hozzáad egy felhasználót a belépettek listájához. TODO ezt folytatni
	 */
	public function setLoggedInUser($user){
		if ($user instanceof SecurityGroup){
			SessionPeaHandler::getInstance()->setLoggedInUser($user);
		}else{
			throw new SecurityException("A megadott objektum nem ír le biztonsági csoportot,". 
			"így nem lehet beállítani mint bejelentkezett felhasználó.", null, 800);
		}
	}
	
	public function getUser(){
		return SessionPeaHandler::getInstance()->getLoggedInUser();
	}
	
	/**
	 * 
	 * @param PeaMethod $method
	 * @return boolean
	 */
	public function checkIfInvokable($method){
		$usr = $this->getUser();
		$user = (($usr != null) && ($usr instanceof SecurityGroup)) ? $usr->getGroupName() : "anonim";
		//Logger::log("PEA", Logger::DEBUG, $user." usr ".(($usr == null) ? "NULL" : get_class($usr)));
		$annot = new ReflectionAnnotatedMethod(get_class($method->object), $method->name);
		if ($annot->hasAnnotation("GrantTo")){
			$grant = $annot->getAnnotation("GrantTo");
			if (is_array($grant->value)){
				$res = false;
				foreach ($grant->value as $val){
					$res = (($user == $val) || $res);
				}
				return $res;
			}else{
				return ($user == $grant->value);
			}
		}elseif ($annot->hasAnnotation("ProtectFrom")){
			$prot = $annot->getAnnotation("ProtectFrom");
			if (is_array($prot->value)){
				$res = true;
				foreach ($prot->value as $val){
					$res = (($user != $val) && $res);
				}
				return $res;
			}else{
				return ($user != $prot->value);
			}
		}else{
			return true;
		}
	}
	
}
?>