private static function _check($u = "", $p = "") { //procession the session $dt = time(); $dtS = date("Y-m-d H:i:s", $dt); if (self::$user["id"]) { if ($dt - (0 + self::$config["session-timeout"]) > self::$user["dlast"]) { self::$user["id"] = 0; db::q("UPDATE " . db::tnm(self::$class) . " SET `ses`='' WHERE `dlast`<('" . $dtS . "'-DATE_SUB('" . $dtS . "', INTERVAL " . self::$config["session-timeout"] . " SECOND))", false); } } //processing the cookies if (isset($_COOKIE[self::$class . "-user"])) { $cookie = $_COOKIE[self::$class . "-user"]; } else { $cookie = ""; } if ($cookie) { if (!self::$user["id"]) { //trying to restore previous user session $r = db::q("SELECT `id`,`stat`,`rights`,`dlog`,`dlast`,`dreg`,`name`,`email`,`display` FROM " . db::tnm(self::$class) . " WHERE `stat`=1 AND `ses`='" . db::esc($cookie) . "'", true); $rows = db::rows($r); if ($rows) { if ($rows > 1) { //system integrity error(!): deleting all sessions db::q("UPDATE " . db::tnm(self::$class) . " SET `ses`='' WHERE `ses`='" . db::esc($cookie) . "'", false); $cookie = ""; } else { self::$user = db::fetch($r); self::$user["admn"] = @substr(self::$user["rights"], 0, 1) === "1"; self::$user["id"] = 0 + self::$user["id"]; self::$user["dlast"] = 0 + self::$user["dlast"]; self::$user["dlog"] = 0 + self::$user["dlog"]; self::$user["dreg"] = 0 + self::$user["dreg"]; self::$user["stat"] = 0 + self::$user["stat"]; } } else { $cookie = ""; } } else { //de-authorizing the session on cookies not match if ($cookie != self::$user["cookie"]) { self::$user["id"] = 0; } } } //trying to start new user session $log = false; if ($u || $p) { if (self::$user["id"]) { msgr::add(_t("Ошибка: вход уже выполнен."), MSGR_TYPE_ERR); } else { $r = db::q("SELECT `id`,`stat`,`rights`,`dreg`,`dlog`,`dlast`,`name`,`email`,`display` FROM " . db::tnm(self::$class) . " WHERE `stat`=1 AND `name`='" . db::esc($name) . "' AND `pass`='" . @md5($name . $pass) . "'", true); $row = db::fetch($r); if (!$row) { msgr::add(_t("Неверное имя пользователя или пароль") . "!", MSGR_TYPE_ERR); $cookie = ""; } else { $log = true; self::$user = db::fetch($r); self::$user["id"] = 0 + self::$user["id"]; self::$user["stat"] = 0 + self::$user["stat"]; self::$user["dreg"] = 0 + self::$user["dreg"]; self::$user["dlog"] = 0 + self::$user["dlog"]; self::$user["dlast"] = 0 + self::$user["dlast"]; self::$user["admn"] = @substr(self::$user["rights"], 0, 1) === "1"; $cookie = session_id(); } } } //trying to connect to external user session $srvs = self::$c->services(self::$class, self::$srvFuncs["user"]); if (count($srvs)) { //checking state of each external authorization system //and searching for first which is authorized $euser = false; foreach ($srvs as $mod => $method) { $user = @call_user_func_array(array(__NAMESPACE__ . "\\" . $mod, $method), array(self::$user["id"])); if (!$euser && $user) { $euser = $user; } if (self::$user["id"] && $user && $user["feid"] != self::$user["id"]) { @call_user_func(array(__NAMESPACE__ . "\\" . $mod, self::$srvFuncs["logout"])); if ($euser && $user["id"] == $euser["id"]) { $euser = false; } } } //performing authorization, creating new user record if allowed if ($euser) { if (!self::$user["id"]) { if (!$euser["feid"]) { if (self::$config["external-autoreg"]) { if (self::_insert($euser)) { $id = 0 + db::iid(); if (!@call_user_func(array(__NAMESPACE__ . "\\" . $mod, self::$srvFuncs["register"]), $id)) { self::_delete($id); msgr::errorLog("Can't automatically register external user.", true, self::$class, "_check", __LINE__); } else { $euser["feid"] = $id; } } else { msgr::errorLog("Can't automatically register the user: Error while creating the new record.", true, self::$class, "_check", __LINE__); } } } if ($euser["feid"]) { $r = db::q("SELECT `id`,`stat`,`rights`,`dreg`,`dlog`,`dlast`,`name`,`email`,`display` FROM " . db::tnm(self::$class) . " WHERE `stat`=1 AND `id`='" . $euser["feid"], true); $row = db::fetch($r); if (!$row) { $cookie = ""; } $log = true; self::$user = db::fetch($r); self::$user["id"] = 0 + self::$user["id"]; self::$user["stat"] = 0 + self::$user["stat"]; self::$user["dreg"] = 0 + self::$user["dreg"]; self::$user["dlog"] = 0 + self::$user["dlog"]; self::$user["dlast"] = 0 + self::$user["dlast"]; self::$user["admn"] = @substr(self::$user["rights"], 0, 1) === "1"; $cookie = session_id(); } } } } //saving final data self::_cookie($cookie); if (self::$user["id"]) { if ($log) { self::$user["dlog"] = $dt; } self::$user["dlast"] = $dt; self::$user["cookie"] = $cookie; db::q("UPDATE " . db::tnm(self::$class) . " SET " . ($log ? "`ses`='" . $cookie . "'" : "") . ($u ? "`dtlog`='" . $dtS . "' AND " : "") . "`dtlast`='" . $dtS . "' WHERE `id`=" . self::$user["id"], false); return true; } else { self::_userReset(); return false; } }
public static final function __uninstall($instance) { self::$__isadmin = defined("ADMIN_MODE") && auth::admin(); if (!self::_isAdmn()) { msgr::add(_t("Can't uninstall from non-admin environment.")); return false; } if (!self::_iGet($instance)) { return; } if (self::$__ic->__runstage > 0) { return; } self::$__ic->__runstage++; self::$__ic->__instance = $__instance; if (@method_exists(__NAMESPACE__ . "\\" . self::$__ic->__instance, "_on_uninstall")) { $res = @call_user_func(array(__NAMESPACE__ . "\\" . self::$__ic->__instance, "_on_uninstall")); if (!is_bool($res)) { $res = true; } return $res; } return true; }
private static function _moduleGet() { self::_moduleEmpty(); $id = 0 + self::post(self::$class . "-" . self::$section["name"] . "-id"); if (!$id) { self::$module["title"] = "Новый модуль"; return true; } $r = db::q("SELECT * FROM " . db::tn("mods") . " WHERE id={$id}", true); $rec = mysql_fetch_assoc($r); if (!$rec) { msgr::add(_t("Модуль не найден") . "[{$id}]"); return false; } self::$module["id"] = $id; self::$module["act"] = $rec["act"]; self::$module["binds"] = array(); self::$module["created"] = $rec["created"]; self::$module["updated"] = $rec["updated"]; self::$module["class"] = $rec["class"]; self::$module["title"] = $rec["title"]; self::$module["hookInit"] = self::modHookName("initDeep"); if (!@method_exists(self::$module["class"], self::$module["hookInit"])) { self::$module["hookInit"] = self::modHookName("init") . self::modHookName("adminSuf"); if (!@method_exists(self::$module["class"], self::$module["hookInit"])) { self::$module["hookInit"] = false; } } self::$module["hookExec"] = self::modHookName("execDeep"); if (!@method_exists(self::$module["class"], self::$module["hookExec"])) { self::$module["hookExec"] = self::modHookName("exec") . self::modHookName("adminSuf"); if (!@method_exists(self::$module["class"], self::$module["hookExec"])) { self::$module["hookExec"] = false; } } self::$module["hookRender"] = self::modHookName("renderDeep"); if (!@method_exists(self::$module["class"], self::$module["hookRender"])) { self::$module["hookRender"] = self::modHookName("render") . self::modHookName("adminSuf"); if (!@method_exists(self::$module["class"], self::$module["hookRender"])) { self::$module["hookRender"] = false; } } self::$module["hookSleep"] = self::modHookName("sleepDeep"); if (!@method_exists(self::$module["class"], self::$module["hookSleep"])) { self::$module["hookSleep"] = self::modHookName("sleep") . self::modHookName("adminSuf"); if (!@method_exists(self::$module["class"], self::$module["hookSleep"])) { self::$module["hookSleep"] = false; } } return true; }
/** * Выполняет запрос к БД * * @param string $q - строка запроса * @param boolean $die - прервать работу приложения * @param array $debug - перезапись параметров стека отладки * @return resource */ public static function q($q,$die=false,$debug=array("msg"=>"Ошибка выполнения запроса к БД.")) { $r=@mysql_query($q); if($r===false) { $sql="SQL запрос: [".lib::jsonPrepare($q)."]."; $raw="Ответ MySQL: [".lib::jsonPrepare(@mysql_error(self::$db["link"]))."]."; if(@function_exists("error_log") || $die) { //сохраняем if(!isset($debug["msg"]))$debug["msg"]="Ошибка выполнения запроса к БД."; if(!isset($debug["class"]))$debug["class"]=""; if(!isset($debug["func"]))$debug["func"]=""; if(!isset($debug["line"]))$debug["line"]=""; if(!$debug["class"] || !$debug["func"] || !$debug["line"]) { if(@function_exists("debug_backtrace")) { $dbg=@debug_backtrace(); if(!$debug["line"])$debug["line"]=$dbg[0]["line"]; @array_shift($dbg); if(!$debug["class"])$debug["class"]=isset($dbg[0]["class"])?$dbg[0]["class"]:""; if(!$debug["func"])$debug["func"]=isset($dbg[0]["function"])?$dbg[0]["function"]:""; } } self::$lastError=$debug["msg"]; self::$lastErrorId=msgr::errorLog($debug["msg"],false,$debug["class"],$debug["func"],$debug["line"],$sql." ".$raw); $ep="EP: [".($debug["class"]?($debug["class"]."::"):"").($debug["func"]?($debug["func"].">"):"").$debug["line"]."]"; if(@function_exists("error_log")) { $amail=self::$c->config("","adminEmail"); if(lib::validEmail($amail,false))@error_log($debug["msg"]."\n\n".$sql."\n\n".$raw."\n\n".$ep,1,$amail); } if($die)die($debug["msg"]."<br /><br />".$ep); } self::$counts[1]++; } else self::$counts[0]++; return $r; }
public static function fetchArray($class,$entity=false,$filters=array(),$range=false,$childs=false) { //проверка модуля if(!$class || !@class_exists(__NAMESPACE__."\\".$class)) { $msg="Указанный модуль [".$class."] отсутствует в системе."; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__); return false; } $modId=self::$c->modId($class); if(!$modId) { $msg="Указанный модуль [".$class."] не зарегистрирован в системе."; if(!self::$silent)msgr::add($msg,MSGR_TYPE_ERR); else msgr::errorLog($msg,false,self::$class,__FUNCTION__,__LINE__); return false; } //проверяем $entity if($entity!==false && ((0+$entity)>0))$filters[]=array("oid","=",0+$entity); else $entity=false; //проверяем $range if(!is_array($range))$range=false; else { $c=count($range); if(!$c || $c>2)$range=false; else { if($c==1)array_unshift($range,0); } } return self::_fetchArray($modId,$entity,$filters,$range,$childs); }
public static function update($filters=array(),$values=array(),$data=false) { $sl=self::$c->silent(); $uid=auth::user("id"); if(!is_string($data) || !$data)$data=false; $t=db::tMeta("content"); $fs=array_keys($t); //проверяем фильтры $fts=array(); $filterId=-1; foreach($filters as $filter) { if(is_string($filter)) { $t=str_replace("`","",$filter); $t=preg_replace("/\s+/","",$t); if(strpos($filter,"id=")!==false) { $id=str_replace("id=","",$t); if(($id && ((0+$id)>0)))$filterId=$id; else continue; } $fts[]=$filter; continue; } if(is_array($filter)) { if(isset($filter[0]) && (in_array($filter[0],$fs)) && isset($filter[1]) && isset($filter[2])) { if(($t[$filter[0]]["type"]=="string") || ($t[$filter[0]]["type"]=="text")) { $filter[2]="".$filter[2]; $type="string"; } else $type="other"; $fts[]=array($type,$filter[2],"AND",$filter[0],$filter[1]); if(($filter[0]=="id") && ($filter[1]=="=") && ($filter[2]>0))$filterId=$filter[2]; } } } //проверяем данные $dts=array(); $actInProc=false; $aliasInProc=false; foreach($values as $field=>$value) { if(!is_string($field))continue; if(!in_array($field,$fs))continue; if(in_array($field,self::$fieldsSys))continue; if($field=="act")$actInProc=true; if($field=="alias")$aliasInProc=true; if(($t[$field]["type"]=="string") || ($t[$field]["type"]=="text")) { $value="".$value; $type="string"; } else $type="other"; $dts[]=array($type,$value,",",$field,($value===false?"NOT":"=")); } if(!count($dts)) { $msg="Невозможно выполнить операцию: данные не распознаны или заданы с ошибкой."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input values: ".serialize($values).", parced data: ".serialize($dts)); return false; } $fc=count($fts); if(count($filters)!=$fc) { $msg="Невозможно выполнить операцию: один или несколько критериев поиска не распознаны или заданы с ошибкой."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", parced filters: ".serialize($fts)); return false; } if($data && (($filterId==-1) || ($fc!=1))) { $data=false; if(!$sl)msgr::add("Содержимое страницы проигнорировано: фильтр должен содержать только указатель на конкретную страницу.",MSGR_TYPE_WRN); } $dts=db::filtersMake($dts,true,true,false); $fts=db::filtersMake($fts,true,true,false); //кол-во затрагиваемых страниц $r=db::q("SELECT COUNT(`id`) AS `cnt` FROM ".db::tnm(self::$class).($fts?(" WHERE ".$fts):""),!$sl); if($r===false)return false; $rec=mysql_fetch_row($r); $affected=0+$rec[0]; if(!$affected) { $msg="Выборка набор страниц по заданному фильтру не принесла результата."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } if($aliasInProc) { if(!self::check("alias",$values["alias"],0,false))return false; //проверка установки алиаса для более чем 1 страницы if($affected>1) { $msg="Невозможно выполнить операцию: попытка задать одинаковый алиас для множества страниц."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } if($values["alias"]=="") { //проверка установки пустого алиаса для активных страниц if(!$actInProc) { $r=db::q("SELECT COUNT(`id`) AS `cnt` FROM ".db::tnm(self::$class)." WHERE ".($fts?($fts." AND "):"")."`act`=1",!$sl); if($r===false)return false; $rec=mysql_fetch_row($r); if((0+$rec[0])>0) { if($affected==1)$msg="Невозможно выполнить операцию: невозможно очистить алиас для активной страницы."; else $msg="Невозможно выполнить операцию: попытка очистить алиас для множества страниц, содержащего активные страницы"; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } } } else { //если страница одна, проверяем алиас на уникальность $r=db::q("SELECT COUNT(`id`) AS `cnt` FROM ".db::tnm(self::$class)." WHERE ".($fts?(" NOT (".$fts.") AND "):"")."`alias`='".mysql_real_escape_string($values["alias"])."'",!$sl); if($r===false)return false; $rec=mysql_fetch_row($r); if((0+$rec[0])>1) { $msg="Невозможно выполнить операцию: указанный алиас уже используется."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } } } if($actInProc) { if(!$aliasInProc) { if(($values["act"]=="1") || ($values["act"]==1)) { $r=db::q("SELECT COUNT(`id`) AS `cnt` FROM ".db::tnm(self::$class)." WHERE ".($fts?($fts." AND "):"")."`alias`=''",!$sl); if($r===false)return false; $rec=mysql_fetch_row($r); if((0+$rec[0])>0) { if($affected==1)$msg="Невозможно выполнить операцию: попытка активировать страницу с отсутствующим алиасом."; else $msg="Невозможно выполнить операцию: попытка активировать набор страниц с отсутствующим алиасом."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } } } else { //$affected>1 выйдет с ошибкой в проверках выше if(($values["alias"]=="") && (($values["act"]=="0") || ($values["act"]==0))) { $msg="Невозможно выполнить операцию: попытка активировать страницу с очисткой ее алиаса."; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Input filters: ".serialize($filters).", joined filters: [".$fts."]"); return false; } } } //проверяем на существование папку модуля, //создаем ее, если нужно if($data) { $mdir=FLEX_APP_DIR_DAT."/_".self::$class; if(!@file_exists($mdir)) { if(@mkdir($mdir,0755)===false || (!@is_writeable($mdir))) { $msg="Невозможно обновить страницу: доступ к файловой системе ограничен!"; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Directory creation failed: ".$mdir); return false; } } } $r=db::q("UPDATE ".db::tnm(self::$class)." SET `uuid`=".$uid.", `updated`=NOW()".($dts?(", ".$dts):"").($fts?(" WHERE ".$fts):""),!$sl); if($r===false)return false; $c=0+mysql_affected_rows(); if($data) { $fn=$mdir."/".$filterId; if(!@file_exists($fn)) { @mkdir($fn,0755,true); if(!@file_exists($fn)) { $msg="Невозможно обновить содержимое страницы: доступ к файловой системе ограничен!"; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"File creation failed: ".$fn); return false; } } //проверяем доступ на запись файла страницы $fn=$mdir."/".$filterId."/".self::$config["index"].".php"; if(@file_exists($fn) && !@is_writable($fn)) { $msg="Невозможно обновить содержимое страницы: доступ к файловой системе ограничен!"; msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"File creation failed: ".$fn); } @file_put_contents($fn,"<?defined(\"FLEX_APP\") or die(\"Forbidden.\");?>\n".$data); @chmod($fn,0755); } return $c; }