<? /*

Main script for Intellect Board 2 Project

(C) 2004, XXXX Pro, United Open Project
Visit us online: http://iboard.xxxxpro.ru

*/

$IBOARD=1;

error_reporting(E_ERROR | E_WARNING | E_PARSE |E_CORE_ERROR | E_CORE_WARNING);
set_error_handler("err_handler");
$start_time = microtime();

require("xaphpi.php");
require("common.php");
require("database.php");
require("iboard.php");
require("db/$DBdriver.php");
require("addons.php");

$forum = htmlspecialchars(getvar("f"));
$topic = htmlspecialchars(getvar("t"));
$module = htmlspecialchars(getvar("m"));
$action = htmlspecialchars(getvar("a"));
if (!$forum) $forum=0;
if (!$topic) $topic=0;

if ($opt_gzip) ob_start("ob_gzhandler");

if (strpos($module,"/")!==false || strpos($module,"\\")!==false) global_error("Hack attempt! Module: ".$module);
if (!is_numeric($forum)) global_error("Hack attempt! Forum: ".$forum);
if (!is_numeric($topic)) global_error("Hack attempt! Topic: ".$topic);

if ($DBpersist) $link=db_pconnect($DBhost,$DBusername,$DBpassword);
else $link=db_connect($DBhost,$DBusername,$DBpassword);
db_select_db($DBname,$link);

$curtime=time();
session_name("IB2XP");
$mode=$_COOKIE['IB2XP_mode'];
if ($mode==1) session_set_cookie_params(date("r",time()+30*60));
session_start();
if ($mode==2) {
  setcookie("IB2XP_long",stripslashes($_COOKIE['IB2XP_long']),time()+180*24*60*60);
  $_SESSION=unserialize(stripslashes($_COOKIE['IB2XP_long']));
}
if ($GLOBALS['opt_secbrowser']) $useragent=$_SERVER['HTTP_USER_AGENT'];

$lang = getvar("lang");
if ($lang) {
  if (file_exists($GLOBALS['opt_dir']."/langs/$lang/main.php")) $_SESSION['lang']=$lang;
  else $lang="";
}
if (!$lang && $_SESSION['lang']) {
  if (file_exists($GLOBALS['opt_dir']."/langs/".$_SESSION['lang']."/main.php")) $lang=$_SESSION['lang'];
  else $lang="";
}
if (!$lang && !$_SESSION['uid'] && $langlist=$_SERVER['HTTP_ACCEPT_LANGUAGE']) {
  $langs=explode(",",$langlist);
  foreach ($langs as $curlang) {
    list($langname,$langprior)=explode(";",$curlang);
    if (!$langprior) $langprior=1;
    if (file_exists($GLOBALS['opt_dir']."/langs/$langname/main.php") && $curprior>$langprior) {
      $lang=$langname;
      $langprior=$curprior;
    }
  }
}
if ($lang) $sqldata = "ln.ln_file=\"".addslashes($lang)."\"";
else $sqldata="ln.ln_id=u.u_lnid";

$inusername = getvar("inusername");
$inpassword = getvar("inpassword");
$sqlbase="SELECT u.*, lv.*, ln.*, st.* ".
"FROM ".$GLOBALS['DBprefix']."User u, ".$GLOBALS['DBprefix']."Language ln, ".$GLOBALS['DBprefix']."StyleSet st ".
"LEFT JOIN ".$GLOBALS['DBprefix']."LastVisit lv ON (u.u_id=lv.uid AND lv.fid=\"$forum\") ".
"WHERE $sqldata AND st.st_id=u.u_stid ";

if ($inusername) {
  $sql=$sqlbase."AND u.u__name=\"$inusername\" GROUP BY u.u_id";
  $insalt = rand();
}
elseif ($_SESSION['uid'] && $_SESSION['uid']!=1) {
  $inuserid = addslashes($_SESSION['uid']);
  if (!$inuserid) $inuserid="1";
  $inpassword = addslashes($_SESSION['password']);
  $insalt = addslashes($_SESSION['salt']);
  $sql=$sqlbase."AND u_id=\"$inuserid\" GROUP BY u.u_id";
}
else $sql=$sqlbase."AND u_id=\"1\" GROUP BY u.u_id";

$res = db_query($sql,$link);

if (db_num_rows($res)==0) {
  db_free_result($res);
  $sql = $sqlbase." AND u_id=1 GROUP BY u.u_id";
  $res = db_query($sql,$link);
  $inuserid = 1;
  $_SESSION['uid']=1;
  $_SESSION['password']="";
  $_SESSION['salt']=0;
}

if (substr($action,0,3)!="do_" || getvar("preview") || getvar("more")) $do_mode=1;
else $do_mode=0;

$inuser = db_fetch_array($res);
$inuserid = $inuser['u_id'];
db_free_result($res);

if ($inuserid>3) {
  $sql = "SELECT COUNT(pm_id) AS pmcount, MAX(pm__senddate) AS pmlast ".
       "FROM ".$GLOBALS['DBprefix']."PersonalMessage pm ".
       "WHERE pm__owner=$inuserid AND pm.pm__box=0 AND pm.pm__readdate=0";
  $res = db_query($sql,$link);
  $tmp=db_fetch_row($res);
  db_free_result($res);
  $inuser['pmcount']=$tmp[0];
  $inuser['pmlast']=$tmp[1];

  $sql = "SELECT SUM(uw_value) AS uw_count FROM ".$GLOBALS['DBprefix']."UserWarning uw ".
  "WHERE uw.uw_uid=$inuserid AND (uw.uw_validtill IS NULL OR uw.uw_validtill>$curtime) ";
  $res = db_query($sql,$link);
  $tmp=db_fetch_row($res);
  db_free_result($res);
  $inuser['uw_count']=$tmp[0];
}

load_lang("main.php");
if (!$do_mode) load_style("message.php");
load_lang("format.php");
if ($do_mode) load_style("main.php");
//setlocale(LC_ALL,$inuser['ln_locale']);

if ($inuserid>3 && intval($_COOKIE['IB2XP_mode'])==1 && getip()!=$_SESSION['ip']) {
  $_SESSION['uid']=1;
  $_SESSION['password']="";
  $_SESSION['salt']=0;
  error(MSG_e_u_ipchanged);
}

if ($inuser['u__active']!=1) {
  $_SESSION['uid']=1;
  $_SESSION['password']="";
  $_SESSION['salt']=0;
  error(MSG_e_u_inactive);
}

if ($inuser['u_id']!=1) {
  if (!$inusername) {
    if (!$inuser['u_encrypted']) { $rightpass = crypt($inuser['u__key'].$useragent.md5($inuser['u__password']),$insalt); }
    else $rightpass = crypt($inuser['u__key'].$useragent.$inuser['u__password'],$insalt);
  }
  else {
    $rightpass=$inuser['u__password'];
    if ($inuser['u_encrypted']) $inpassword = md5($inpassword);
  }
  if ($inpassword!=$rightpass) {
    $_SESSION['uid']=1;
    $_SESSION['password']="";
    $_SESSION['salt']=0;
    error(MSG_e_badpassword);
   }
}

if ($inusername && $_SESSION['uid']<=3) {
  $_SESSION['uid'] = $inuser['u_id'];
  if (!$inuser['u_encrypted']) $inpassword = md5($inpassword);
  $_SESSION['password'] = crypt($inuser['u__key'].$useragent.$inpassword,$insalt);
  $_SESSION['salt'] = $insalt;
}

$inuserbasic = $inuser['u__level'];
if ($GLOBALS['opt_warnstoban'] && intval($inuser['uw_count'])<=-intval($GLOBALS['opt_warnstoban'])) $inuserbasic=-1;

if ($GLOBALS['inuserbasic']==1024) { header("Location: ".$GLOBALS['opt_url']."/admin/index.php"); exit(); }
if ($GLOBALS['opt_status'] && $module!="profile" && $action!="do_login" &&
    $action!="login" && $inuserlevel<1000) error($GLOBALS['opt_closetext']);

if (!$action && !$module && !$forum && !$topic && $GLOBALS['opt_mainpage']) $forum=$GLOBALS['opt_mainpage'];

if ($topic) {
  $sql = "SELECT t.*, pl.*, ua_level, AVG(tr.tr_value) AS trating, COUNT(bm.tid) AS bmk, COUNT(sb.tid) AS subscr, ".
  "COUNT(v.pvid) AS voted, COUNT(tv.tid) AS visited, MAX(p.p__time) AS lasttime, COUNT(p.p_id) AS pcount ".
  " FROM ".$GLOBALS['DBprefix']."Topic t, ".$GLOBALS['DBprefix']."Post p, ".
  $GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."ForumType tp, ".$GLOBALS['DBprefix']."Category ct ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."UserAccess ua ON (ua.uid=".$GLOBALS['inuserid']." AND ua.fid=t.t_fid) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."Bookmark bm ON (bm.uid=$inuserid AND bm.tid=t.t_id) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."Subscription sb ON (t.t_id=sb.tid AND sb.uid=$inuserid) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."TopicView tv ON (tv.tid=t.t_id AND tv.uid=".$GLOBALS['inuserid'].") ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."TopicRate tr ON (t.t_id=tr.tid) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."Poll pl ON (pl.pl_tid=t.t_id) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."PollVariant pv ON (pv.pv_plid=pl.pl_id) ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."Vote v ON (v.pvid=pv.pv_id AND v.uid=$inuserid) ".
  "WHERE t_id=\"$topic\" AND t.t_fid=f.f_id AND (f.f_lview<=\"$inuserbasic\" OR f.f_lview<=ua.ua_level) ".
  "AND f.f_tpid=tp.tp_id AND f.f_ctid=ct.ct_id AND t.t_id=p.p_tid AND p__premoderate=0 GROUP BY t.t_id";
//  db_explain($sql);
  $res = db_query($sql,$link);
  if (db_num_rows($res)==0) error(MSG_e_t_notexists);
  $intopic = db_fetch_array($res);
  db_free_result($res,$link);
  $forum = $intopic['t_fid'];
}

if ($forum>0) {
  $sql = "SELECT f.*, ct.*, tp.*,ua_level FROM ".$GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."ForumType tp, ".$GLOBALS['DBprefix']."Category ct ".
        "LEFT JOIN ".$GLOBALS['DBprefix']."UserAccess ua ON (ua.uid=".$GLOBALS['inuserid']." AND ua.fid=\"$forum\") ".
         "WHERE f.f_tpid=tp.tp_id AND f.f_ctid=ct.ct_id AND ".
         "((ua_level IS NULL AND f_lview<=\"$inuserbasic\") OR (ua_level IS NOT NULL AND f_lview<=ua.ua_level)) AND f.f_id=\"$forum\"";
  $res = db_query($sql,$link);
  if (db_num_rows($res)==0) error(MSG_e_f_notexists);
  $inforum = db_fetch_array($res);
  db_free_result($res,$link);

  if ($inforum['ua_level']>$inuserbasic && $inuserbasic!=-1) $inuserlevel=$inforum['ua_level'];
  else $inuserlevel=$inuserbasic;
  if (!$module || $module==$inforum['tp_library']) {
    $module = $inforum['tp_library'];
  }
  $flevel=$inforum['f_lmoderate'];
  build_mod_list($forum,$flevel);
}
else $inuserlevel=$inuserbasic;

if (!$module) $module = "main";

if ($inuserid>3) {
  $userlast1=$inuser['lv_time1'];
  $userlast2=$inuser['lv_time2'];
  if ($userlast1<$curtime-$opt_heretime*60) $userlast2=$userlast1;
  $userlast1=$curtime;
  if (!$userlast2) $userlast2=0;
  $sql = "REPLACE ".$GLOBALS['DBprefix']."LastVisit SET lv_time1=$userlast1, lv_time2=$userlast2, uid=$inuserid, fid=$forum";
  $res = db_query($sql,$link);
}

if (!$action && !$forum) $action = "view";
elseif (!$action && $forum) $action = $inforum['tp_template']."_view";
if ($action=="link_view") header("Location: ".$inforum['f_url']);

if ($module!="main" || $_GET['ct'] || $_GET['f']) $locations=array("<a href=\"index.php\">$opt_title</a>");

if (!is_file($opt_dir."/".$module.".php")) global_error(MSG_e_nomodule." ".$module.".php");

load_style("$module.php");
require ($opt_dir."/".$module.".php");

if ($module==$inforum['tp_template']) $locations=call_user_func($module."_locations",$locations);
else $locations=locations($locations);

if ($topic) $lasttime=$topic['lasttime'];
if (!$topic && $forum) {
  $sql = "SELECT MAX(p__time) FROM ".$GLOBALS['DBprefix']."Post p, ".$GLOBALS['DBprefix']."Topic t".
         " WHERE p_tid=t_id AND t_fid=\"$forum\"";
  $res = db_query($sql,$link);
  list($lasttime)=db_fetch_row($res);
  db_free_result($res);
}
if (!$topic && !$forum) $lasttime=$GLOBALS['curtime'];
if ($GLOBALS['inuserid']>3 && $inuser['pmlast']>$lasttime) $lasttime=$inuser['pmlast'];

header("Content-type: text/html; charset=".$GLOBALS['inuser']['ln_charset']);
if ($GLOBALS['inuserid']<3) header("Cache-Control: public");
else header("Cache-Control: private");
header("Last-Modified: ",date("r",$lasttime));
header("Expires: ",date("r",$GLOBALS['curtime']+365*24*60*60));

if ($do_mode) require($opt_dir."/tmplate1.php");
else require($opt_dir."/tmplate2.php");

if ($opt_log==2 || ($opt_log==1 && $inuserid>3)) {
  if ($inuserid==1) $mode=0;
  elseif ($inuserid>3 && $inuser['u_hidden']) $mode=2;
  else $mode=1;
  $sql="INSERT INTO ".$GLOBALS['DBprefix']."Log VALUES(\"".addslashes(session_id())."\",\"$curtime\",\"$inuserid\",\"$topic\",".
  "\"$forum\",\"$action\",\"".addslashes($_SERVER['HTTP_USER_AGENT'])."\",\"".addslashes(iptonum(getip())).
  "\",\"$mode\",\"".addslashes($_SERVER['HTTP_REFERER'])."\",\"$module\")"; ///*! DELAYED */
  $res = db_query($sql,$GLOBALS['link']);

  $sql = "DELETE FROM ".$GLOBALS['DBprefix']."Log WHERE uo_time<".intval($GLOBALS['curtime']-$GLOBALS['opt_keeplogs']*24*60*60-$GLOBALS['opt_heretime']*15);
  $res=db_query($sql,$GLOBALS['link']);
}

$lasttime = $GLOBALS['curtime']-$opt_heretime*60;
$sql = "SELECT COUNT(DISTINCT sid), COUNT(DISTINCT uid) FROM ".$GLOBALS['DBprefix']."Log WHERE uo_time>$lasttime";
$res = db_query($sql,$link);
list($sids,$uids)=db_fetch_row($res);
$guests=$sids-$uids+1;
if ($sids>$GLOBALS['opt_record_count']) {
  $GLOBALS['opt_record_count']=$sids;
  $GLOBALS['opt_record_guests']=$guests;
  $GLOBALS['opt_record_date']=$GLOBALS['curtime'];
  $fh = fopen($GLOBALS['opt_dir']."/iboard.php","w") or global_error("Не удается создать файл iboard.php");
  fputs($fh,"<? if (!\$IBOARD) die(\"Hack attempt!\");\n");
  $keys = preg_grep("/opt_/",array_keys($GLOBALS));
  foreach ($keys as $curkey) {
    fputs($fh,"\$$curkey=\"".addslashes($GLOBALS[$curkey])."\";\n");
  }
  fclose($fh);
}

list_checks();

exit();

function main_action() {
  call_user_func($GLOBALS['action']);
}

function time_diff() {
  $curtime = microtime();
  $tdif = gettimedif($GLOBALS['start_time'],$curtime);
  main_time_diff(sprintf("%.4f",$tdif),$GLOBALS['query_count'],sprintf("%.4f",$GLOBALS['query_time']));
}

function menu() {
  $link = $GLOBALS['link'];
  if ($GLOBALS['opt_submenu']) $menusql="AND tp_menu=1";
  else $menusql="AND f_parent=0";
  $sql = "SELECT ct.ct_name,ct.ct_id,f.f_title,f.f_id FROM ".$GLOBALS['DBprefix']."Category ct, ".$GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."ForumType tp ".
  "LEFT JOIN ".$GLOBALS['DBprefix']."UserAccess ua ON (ua.uid=".$GLOBALS['inuserid']." AND ua.fid=f.f_id) ".
  "WHERE f.f_ctid=ct.ct_id AND f_tpid=tp_id $menusql AND ".
  "((ua.ua_level IS NULL AND f.f_lview<=".$GLOBALS['inuserbasic'].") OR (ua.ua_level IS NOT NULL AND f.f_lview<=ua.ua_level)) ".
  "ORDER BY ct_sortfield,f_sortfield";
  $res = db_query($sql,$link);
  menu_start();
  while ($fdata=db_fetch_array($res)) {
    if ($fdata['ct_name']!=$oldcat) {
      if ($oldcat) menu_cat_end();
      menu_cat_entry($fdata);
      $oldcat=$fdata['ct_name'];
    }
    menu_entry($fdata);
  }
  menu_cat_end();
  menu_end();
}

function announce() {
  if ($GLOBALS['opt_announce']==2 || ($GLOBALS['opt_announce']==1 && $GLOBALS['module']=="main" && $GLOBALS['action']=="view")) {
    announce_form();
  }
}

function err_handler($errno, $errstr, $errfile, $errline) {
  if ($errno & (E_ALL ^ E_NOTICE)) {
    $errfile = substr($errfile,strrpos($errfile,"/")+1);
    global_error("$errfile (line $errline)"." - ".$errstr);
  }
}

function global_error($errtext) {
  $fh=fopen("error.log","a");
  $errtext=str_replace("\n","<br>",$errtext);
  $errtext=str_replace("\r","",$errtext);
  $str=time()."|".$_SERVER['REMOTE_ADDR']."|".$_SERVER['HTTP_X_FORWARDED_FOR']."|".$GLOBALS['inuserid']."|".htmlspecialchars($GLOBALS['inuser']['u__name'])."|".htmlspecialchars($errtext)."\n";
  fputs($fh,$str);
  fclose($fh); ?>
<html><head><title><?=$opt_title;?></title>
<link rel="stylesheet" href="styles/abstract/abstract.css" type="text/css">
</head>
<body bgcolor="#DCDCDC">
<table border="0" cellspacing="1" class="innertable" align=center border=1 width=90%><tr>
<td class="tablehead">GLOBAL FORUM ERROR: <?=htmlspecialchars($errtext);?></td>
</tr><tr>
<td class="basictable"><ul><li><a href="<?=$_SERVER['HTTP_REFERER'];?>">Goto previous page</a>
<li><a href="index.php">Goto main page</a></li></td>
</tr></table></body></html>
<? exit();
}

function check_point($name) {
  $GLOBALS['checkpoints'][$name]=sprintf("%.4f",gettimedif($GLOBALS['start_time'],microtime()));
}

function list_checks() {
  if (is_array($GLOBALS['checkpoints'])) {
    foreach ($GLOBALS['checkpoints'] as $name=>$value) echo "$name - $value<br>";
  }
}

function gettimedif($start,$stop) {
    list($startusec,$startsec) = explode(" ",$start);
    list($stopusec,$stopsec) = explode(" ",$stop);
    return ($stopsec-$startsec)+($stopusec-$startusec);
}
