<?
////////////////////////////////////////////////////////////////////////////
//
//	Business & Control 2004-2008.
//
//	osztly neve: class_auth.php
//  clja: autentikcis osztly
//	osztlyvltozk:
//
//	session_id 					=> generlt, usert bngsznknt azonost ID
//  session_timeout[notlogged]	=> lejrati id ha nincs belpett user
//  session_timeout[user]		=> lejrati id USER belpsre
//  session_timeout[admin]		=> lejrati id USER ADMIN (superadmin) belpsre
//  session_timeout[extended]	=> lejrati id "emlkezzen rm" belejlse esetn
//  cookie_timeout				=> session_id trol cookie lejrati ideje
//  remote_id					=> USER IP-je
//	uid							=> user ID
//	user_data					=> belpett user adatai (nv, email, csoport ID, uid)
//
//
//////////////////////////////////////////////////////////////////////////

class auth extends user{

	var $session_id;

	var $uid;
	var $user_data;

	function auth(){

		$this->remote_ip = $_SERVER[REMOTE_ADDR];
		$this->session_timeout = array(
			notlogged => 3600,
			user => 3600,
			admin => 3600,
			extended => 86400*30,
		);
		$this->cookie_timeout = 86400;

		$this->delSession();

		// ha van emlkez
		if($_COOKIE['session_extended']) {
			$this->session_extended=true;
			$this->session_id=$_COOKIE['session_id'];
			//session, cookie s emlkez meghosszabbtsa
			$time_extended=time()+$this->session_timeout[extended];
			setcookie('session_id',$this->session_id,$time_extended,'',$_SERVER[HTTP_HOST]);
			setcookie('session_extended',1,$time_extended,'',$_SERVER[HTTP_HOST]);
		}
		// ha nincs session ID, akkor feltltjk COOKIE-bl, vagy generlunk egyet
		elseif(!($this->session_id=$_COOKIE['session_id'])) $this->generateSession();

		// ha be van lpve, akkor feltltjk user adatokkal az auth-ot
		if($this->isLogged()){
			$this->setAuthUserData();
		}else{
			$this->uid=0;
		}

		// ha ltezik a session, akkor frisstjk, klnben j belps, s felvesszk
		if($this->checkSession($uid)) $this->updateSession($uid);
		else {
			$this->saveSession($uid);
		}

	}

	/**
	 * get main user data from users table
	 * set user_data array
	 *
	 * @return NULL
	 * @todo getUserTypeData miért? ott a left join
	 */
	function setAuthUserData(){

		global $dbi;

		if(!$uid=$this->uid) return false;
		$sql="select id,user_type,company,login,title,firstname as fname,lastname as lname,phone,email,last_login_date,country_code from users where id=$uid";
		$res=sql_query($sql,$dbi);
		if($a=sql_fetch_assoc($res,$dbi)){
			extract($a);
			$type_name=$this->getUserTypeData($user_type);
			$user_data=array(name=>$fname ? $fname." ".$lname : $login,login=>$login,type=>$user_type,type_name=>$type_name[name],country_code=>$country_code,phone=>$phone,email=>$email);
		}

		if($this->uid=$uid){
			$this->user_type_id=$user_type;
		}else{
			$this->user_type_id=0;
		}
		$this->user_data=$user_data;

	}

	/**
	 * login into system
	 *
	 * @param string $login users.login
	 * @param string $pass users.password
	 * @param boolean $md5[optional] if is coded in md5
	 * @return
	 */
	function login($login,$pass,$md5=false){

		global $dbi;

		if(!($login && $pass)) {$this->error=1; return false;}

		if(!$md5) $pass=md5($pass);

		$sql="select id,inactive from users where login='$login' and password='$pass'";
		$res=sql_query($sql,$dbi);
		if(sql_num_rows($res,$dbi)){
			list($uid,$inactive)=sql_fetch_array($res,$dbi);
			if($inactive) {$this->error=2; return false;}

			// session-be user_id
			$sql="update session set user_id=$uid where session_id='$this->session_id'";
			sql_query($sql,$dbi);

			$sql="update users set last_login_date=now() where id=$uid";
			sql_query($sql,$dbi);
		}

		if(!$uid) $this->error=1;

		if($_POST[remember]) {
			setcookie('session_extended',1,time()+$this->session_timeout[extended],'',$_SERVER[HTTP_HOST]);
		}

		return $uid;

	}

	/**
	 * logout and update session
	 *
	 * @return NULL
	 */
	function logout(){

		global $dbi;

		$sql="update session set user_id=0 where session_id='$this->session_id'";
		sql_query($sql,$dbi);

		if($this->session_extended) {
			setcookie('session_id',$this->session_id,time()+$this->cookie_timeout,'',$_SERVER[HTTP_HOST]);
			setcookie('session_extended','',time(),'',$_SERVER[HTTP_HOST]);
		}
	}

	/**
	 * delete the session
	 *
	 * @return NULL
	 */
	function delSession(){

		global $dbi;

		$sql="delete from session where expire < now()";
		sql_query($sql,$dbi);

	}

	/**
	 * check if is valid session
	 *
	 * @return integer
	 */
	function checkSession(){

		global $dbi;

		$sql="select session_id from session where session_id='".$this->session_id."'";
		$res=sql_query($sql,$dbi);
		$num=sql_num_rows($res,$dbi);
		return $num;
	}

	/**
	 * check if the user is logged in
	 *
	 * @return integer|NULL
	 */
	function isLogged(){

		global $dbi;

		$sql="select user_id from session where session_id='$this->session_id'";
		$res=sql_query($sql,$dbi);
		list($uid)=sql_fetch_array($res,$dbi);

		$this->uid=$uid;

		return $uid;
	}

	/**
	 * update session
	 *
	 * @param object $uid[optional] ???
	 * @return NULL
	 * @todo $uid minek?
	 */
	function updateSession($uid=""){
		global $dbi;

		if($this->session_extended) $mode='extended';
		elseif($this->user_type_id==1) $mode='admin';
		elseif($this->user_type_id) $mode='user';
		else $mode='notlogged';

		$expire=date("Y-m-d H:i:s",time()+$this->session_timeout[$mode]);

		$sql="update session set expire='$expire' where session_id='$this->session_id' and remote_ip='$this->remote_ip'";
		sql_query($sql,$dbi);
	}

	/**
	 * save new session
	 *
	 * @param integer $uid[optional] user_id
	 * @return NULL
	 */
	function saveSession($uid=""){

		global $dbi,$header;

		if($uid){
			$sql_uid_name="user_id,";
			$sql_uid_value="$uid,";
			$mode='user';
		}else{
			$mode='notlogged';
		}
		$expire=date("Y-m-d H:i:s",time()+$this->session_timeout[$mode]);

		$sql="insert into session (session_id, $sql_uid_name remote_ip, expire) values ('$this->session_id',$sql_uid_value '$this->remote_ip','$expire');";
		sql_query($sql,$dbi);

	}

	/**
	 * set cookie, and session_id
	 *
	 * @return NULL
	 */
	function generateSession(){
		$this->session_id=md5($_SERVER[REMOTE_ADDR].$_SERVER[HTTP_USER_AGENT].rand(0,100));
		setcookie('session_id',$this->session_id,time()+$this->cookie_timeout,'',$_SERVER[HTTP_HOST]);
	}

	function sessionData($params=NULL){

		global $dbi;

		if($params[clear]==1){
			$sql="update session set params=NULL where session_id='$this->session_id'";
			sql_query($sql,$dbi);
			unset($params);
		}

		if(is_array($params)){

			$sql="select params from session where session_id='$this->session_id'";
			$res=sql_query($sql,$dbi);
			list($sql_insert2)=sql_fetch_array($res,$dbi);
			$sql_insert2=str_replace(array('{','}'),'',$sql_insert2);
			$tmp2=$this->arraySessionData($sql_insert2);
			if(sizeof($tmp2)<1){
				$tmp=$params;
			}else{
				$tmp=array_merge($tmp2,$params);
			}

			foreach($tmp as $k => $v){
				if($k) $sql_ins[]="$k:$v";
			}
			$newparams="{".implode(';',$sql_ins)."}";

			$sql="update session set params = '$newparams' where session_id='$this->session_id' ";
			sql_query($sql,$dbi);
		}

		$sql="select params from session where session_id='$this->session_id'";
		$res=sql_query($sql,$dbi);
		list($param)=sql_fetch_array($res,$dbi);

		if($param){
			$param=str_replace(array('{','}'),'',$param);
			$this->params=$this->arraySessionData($param);
		}

		return $this->params;
	}

	function arraySessionData($str){

		$p=array();

		$str=preg_split('/;/',$str);
		foreach($str as $s){
			list($k,$v)=preg_split('/:/',$s);
			$p[$k]=$v;
		}

		return $p;
	}

} // end class

?>