Ejemplo n.º 1
0
 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;
     }
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
	/**
	* Выполняет запрос к БД
	*
	* @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;
	}
Ejemplo n.º 5
0
	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);
	}
Ejemplo n.º 6
0
	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;
	}