<?php
#-----------------------------------------------------------------------------------------------
# @package VulpineMobile
# @author Tom Rush for Vulpine Mobile
# @copyright Vulpine Mobile
# @licence
# @class main
# @function Entery point for Vulpine Mobile
# @description Check type of device and log history and page access
#-----------------------------------------------------------------------------------------------

ini_set('arg_separator.output','&amp;'); /* Accept ampersands*/
ini_set('arg_separator.input','&amp;');   /* Accept ampersands*/

//ignore_user_abort(true);

include_once("/home/vulpine/sec/globalDefine.php");

if (defined("VUL_SEC_ADMIN")||
stristr($_SERVER["HTTP_USER_AGENT"],"K-Meleon")) 
 ini_set('display_errors',true);
else ini_set('display_errors',false);

include_once("/home/vulpine/adm/vulpineAdmin.php");

session_cache_limiter('private_no_expire, must-revalidate');

chdir(VUL_DIR_BASE);

include_once (VUL_GBL_BIN."tw.php");             // Singleton
include_once (VUL_GBL_BIN."log.php");            // Singleton 
include_once (VUL_LOC_BIN."uri_parse.php");
include_once (VUL_GBL_BIN."sqlConnect.php");     // Singleton 
include_once (VUL_GBL_BIN."errorHandler.php");
include_once (VUL_GBL_BIN."pageLog.php");        // Singleton

define('VUL_WEB_ENVOKED',true);

$myError = new myError();
$old_error_handler = set_error_handler(array($myError, "errorHandler")); 

$GLOBALS["startTime"]=tw::get()->timestamp();
$sysData = getrusage();
$GLOBALS["utime"]=$sysData["ru_utime.tv_sec"]*1e6+$sysData["ru_utime.tv_usec"];
$GLOBALS["stime"]=$sysData["ru_stime.tv_sec"]*1e6+$sysData["ru_stime.tv_usec"];

$mm=new mainMobile();
$mm->mainStart();

class mainMobile{

  public $oMobile=null;
  private $oPass=null;

  function __construct(){}

  function __destruct(){}

  #-------------------------------------------------------------------------------------------
  #     Start mobile application
  #-------------------------------------------------------------------------------------------
  public function mainStart(){

    $this->startSession();

    $this->startHistory();

    $this->startUri();

    if(defined("VUL_OFFLINE")&&VUL_OFFLINE==true){
      include_once(VUL_GBL_BIN."parseErrorDisplay.php");
      $this->oMobile->statusCode=503;
      $this->oMobile->offline=true;
      $emsg=new parseErrorDisplay();
      $retval=$emsg->errorDisplay($this->oMobile);
      exit();
    }
/*
    if(defined("VUL_SEC_ADMIN")&&VUL_SEC_ADMIN==true){
      foreach(get_object_vars($this->oMobile) as $key=>$val) {
         echo $key."=".$val."<br />";
      }
      //foreach(get_object_vars($this->oMobile) as $key=>$val) {
      //   echo $key."=".$val."<br />";
      //}
      die();
    }

*/
    //include_once(VUL_GBL_BIN."device.php");
    //device::get()->deviceInit($oMobile);

    $this->startDisplay();

    exit();

  }

  #-----------------------------------------------------
  #     Start display
  #-----------------------------------------------------
  private function startDisplay(){

      if(strstr($_SERVER["HTTP_USER_AGENT"],"[EX]")){
            log::write()->logWrite('debug2',"ERR","mobile at URI entry point sees [EX] again...",0,8);
      }

    switch(intval($this->oMobile->m1)){
      case 1:           # wml-wap1
        //if(session_id()!="") $_SESSION["isWML"]=true;
        //include_once(VUL_LOC_BIN."mobWml.php");
        //$mw=new mobWml($this->oMobile);  
        include_once(VUL_GBL_BIN."parseErrorDisplay.php");
        $this->oMobile->statusCode=410;
        //$this->oMobile->offline=true;
        $emsg=new parseErrorDisplay();
        $retval=$emsg->errorDisplay($this->oMobile);
      exit();
        break;
      case 2:           # xhtml-wap2
      case 32:
      default:
        if (session_id()!="") $_SESSION["isWML"]=false;
        include_once(VUL_LOC_BIN."mobXhtml.php");
        $mx=new mobXhtml($this->oMobile);
    }

  }

  #-----------------------------------------------------
  #     Start Uri
  #-----------------------------------------------------
  private function startUri(){
    $this->oPass=new uri_parse($this->oMobile);
    $this->oMobile=$this->oPass->checkUri($this->oMobile,$prev_uri=false);
    if(isset($this->oMobile->retVal)&&$this->oMobile->retVal===false) {
      $this->uri_error();
    }
  }

  #-----------------------------------------------------
  #     Start History
  #-----------------------------------------------------
  public function startHistory(){

    if(session_id()!=""){ 
      # Client side devices or browsers.

      if(!isset($_SESSION["isAuthenticated"])||!$_SESSION["isAuthenticated"]){
        include_once(VUL_LOC_BIN."returnSession.php");
        $retSess=new returnSession();
        $this->oMobile = $retSess->history($this->oMobile);
      }
      else{
        include_once(VUL_LOC_BIN."sessReload.php");
        $sessRet=new SessReload();
        $this->oMobile = $sessRet->sessBuild($this->oMobile);
      }
    }
    else{
      # Crawlers and other bad things.
      include_once(VUL_GBL_BIN."historyMobi.php");
      $hm = new historyMobi();
      $this->oMobile = $hm->log($this->oMobile);
    }
  }

  #-----------------------------------------------------
  #     Start session
  #-----------------------------------------------------
  private function startSession(){
    if (isset($_COOKIE[session_name()])){
      include_once(VUL_GBL_BIN."dbSession.php");
      session_start(); 
      if (!isset($_SESSION["isAuthenticated"])||!$_SESSION["isAuthenticated"]){    
        log::write()->logWrite('session','AUT','[1]Deleted Session: '.session_id()
          ."\r\n\tUser-Agent: ".$_SERVER["HTTP_USER_AGENT"]
          .((isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']))?
          "\r\n\tOpera Mini: ".$_SERVER['HTTP_X_OPERAMINI_PHONE_UA']:"")
          .((isset($_SERVER['HTTP_X_DEVICE_USER_AGENT']))?
          "\r\n\tX-Device: ".$_SERVER['HTTP_X_DEVICE_USER_AGENT']:"")
          ."\r\n\tName: ".session_name()." not authenticated, now rebuilding.",0,0);
        $retval=$this->buildCheck();
        $this->oMobile->isSession=true;
        $this->unsafeSession();	
      }
    }
    else {
      # First time visit or returning crawler ?
      $retval=$this->buildCheck();	
      if(!$this->oMobile->isCrawler){$this->unsafeSession();}
    }
    return true;
  }

  #-----------------------------------------------------
  #     U R I   e r r o r   p a g e  
  #-----------------------------------------------------
  private function uri_error() {
    include_once (VUL_GBL_BIN."parseBanned.php");
    $mb = new parseBanned();
    if($this->oMobile->statusCode=$this->oPass->getStatusCode()){}
    else $this->oMobile->statusCode=404;
    if (isset($this->oMobile->isBanned)&&$this->oMobile->isBanned===true) {
      $this->oMobile->statusErr=(($this->oPass->getStatusCode())?
            $this->oPass->getStatusCode():'URI');
      $this->oMobile->status = "uri_parse detected mis-formed uri"; 
      $retval = $mb->log($this->oMobile);     
    }
    $retval = $mb->display($this->oMobile);

    die();

  }	

  #-----------------------------------------------------
  #     Build incoming device
  #-----------------------------------------------------
  private function buildCheck(){
    include_once(VUL_GBL_BIN."buildDB.php");
    $mbd=new buildCheck();	
    $this->oMobile=$mbd->build();
    return true;
  }

  #-----------------------------------------------------
  #     Controlled Sessions  
  #-----------------------------------------------------
  private function unsafeSession(){
    include_once (VUL_GBL_BIN."dbSessionCtrl.php"); // create unsafe session
    $sCtrl = new dbSessionCtrl($this->oMobile);
    $retval= $sCtrl->load_session(session_name()); 
      //if(defined("VUL_APP_ADMIN")){
      //  echo ("Return Model: ".$this->oMobile->model
      //          .' Session: '.session_id().'<br />');
      //}
    return true;
  }
}
?>