403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/classes/general/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/classes/general/favorites.php
<?php

/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage main
 * @copyright 2001-2025 Bitrix
 */

IncludeModuleLangFile(__FILE__);

class CFavorites extends CDBResult
{
	public static function GetIDByUrl($url)
	{
		global $USER;

		if ($url == "")
		{
			return 0;
		}

		$paresedUrl = CBXFavUrls::ParseDetail($url);
		if ($paresedUrl !== false)
		{
			$pathInfo = pathinfo($paresedUrl["path"]);

			$dbFav = CFavorites::GetList([], [
				"URL" => "'%" . $pathInfo["basename"] . "%'",
				"MENU_FOR_USER" => $USER->GetID(),
				"LANGUAGE_ID" => LANGUAGE_ID,
			]);
			while ($arFav = $dbFav->Fetch())
			{
				if (CBXFavUrls::Compare($paresedUrl, $arFav["URL"]))
				{
					return $arFav["ID"];
				}
			}
		}

		return 0;
	}

	public static function GetByID($ID)
	{
		global $DB;

		$ID = intval($ID);
		if ($ID <= 0)
		{
			return false;
		}

		return $DB->Query("
			SELECT F.*,
				" . $DB->DateToCharFunction("F.TIMESTAMP_X") . " as TIMESTAMP_X,
				" . $DB->DateToCharFunction("F.DATE_CREATE") . " as	DATE_CREATE
			FROM b_favorite F
			WHERE ID=" . $ID
		);
	}

	public static function CheckFields($arFields)
	{
		global $APPLICATION;

		$aMsg = [];
		if (is_set($arFields, "NAME") && trim($arFields["NAME"]) == "")
		{
			$aMsg[] = ["id" => "NAME", "text" => GetMessage("fav_general_err_name")];
		}
		if (is_set($arFields, "URL") && trim($arFields["URL"]) == "")
		{
			$aMsg[] = ["id" => "URL", "text" => GetMessage("fav_general_err_url")];
		}
		if (is_set($arFields, "USER_ID"))
		{
			if (intval($arFields["USER_ID"]) > 0)
			{
				$res = CUser::GetByID(intval($arFields["USER_ID"]));
				if (!$res->Fetch())
				{
					$aMsg[] = ["id" => "USER_ID", "text" => GetMessage("fav_general_err_user")];
				}
			}
			elseif ($arFields["COMMON"] == "N")
			{
				$aMsg[] = ["id" => "USER_ID", "text" => GetMessage("fav_general_err_user1")];
			}
		}
		if (is_set($arFields, "LANGUAGE_ID"))
		{
			if ($arFields["LANGUAGE_ID"] <> "")
			{
				$res = CLanguage::GetByID($arFields["LANGUAGE_ID"]);
				if (!$res->Fetch())
				{
					$aMsg[] = ["id" => "LANGUAGE_ID", "text" => GetMessage("fav_general_err_lang")];
				}
			}
			else
			{
				$aMsg[] = ["id" => "LANGUAGE_ID", "text" => GetMessage("fav_general_err_lang1")];
			}
		}

		if (!empty($aMsg))
		{
			$e = new CAdminException($aMsg);
			$APPLICATION->ThrowException($e);
			return false;
		}
		return true;
	}

	public static function IsExistDuplicate($arFields)
	{
		if (!isset($arFields["MENU_ID"]) && !isset($arFields["URL"]) && !isset($arFields["NAME"]))
		{
			return false;
		}

		global $USER, $DB;

		$uid = $USER->GetID();

		$strSql = "SELECT MENU_ID, URL, ID FROM b_favorite  WHERE ( ";

		if (isset($arFields["MENU_ID"]))
		{
			$strSql .= "MENU_ID = '" . $DB->ForSql($arFields["MENU_ID"]) . "' AND ";
		}

		if (isset($arFields["URL"]))
		{
			$strSql .= "URL = '" . $DB->ForSql($arFields["URL"]) . "' AND ";
		}

		if (isset($arFields["NAME"]))
		{
			$strSql .= "NAME = '" . $DB->ForSql($arFields["NAME"]) . "' AND ";
		}

		$strSql .= "( USER_ID=" . $uid . " OR COMMON='Y' ))";

		$dbFav = $DB->Query($strSql);

		while ($arFav = $dbFav->GetNext())
		{
			if ($arFields["MENU_ID"] == $arFav["MENU_ID"] || $arFields["URL"] == $arFav["URL"] || $arFields["NAME"] == $arFav["NAME"])
			{
				return $arFav["ID"];
			}
		}

		return false;
	}

	//Addition
	public static function Add($arFields, $checkDuplicate = false)
	{
		global $DB;

		if (!CFavorites::CheckFields($arFields))
		{
			return false;
		}

		if ($checkDuplicate)
		{
			$duplicate = CFavorites::IsExistDuplicate($arFields);

			if ($duplicate)
			{
				return $duplicate;
			}
		}

		$codes = new CHotKeysCode;
		$codeID = $codes->Add([
			"CODE" => "location.href='" . $arFields["URL"] . "';",
			"NAME" => $arFields["NAME"],
			"COMMENTS" => "FAVORITES",
		]);

		$codes->Update($codeID, [
			"CLASS_NAME" => "FAV-" . $codeID,
			"TITLE_OBJ" => "FAV-" . $codeID,
		]);

		$arFields["CODE_ID"] = intval($codeID);

		$ID = $DB->Add("b_favorite", $arFields);
		return $ID;
	}

	//Update
	public static function Update($ID, $arFields)
	{
		global $DB;
		$ID = intval($ID);

		if (!CFavorites::CheckFields($arFields))
		{
			return false;
		}

		$strUpdate = $DB->PrepareUpdate("b_favorite", $arFields);
		if ($strUpdate != "")
		{
			$strSql = "UPDATE b_favorite SET " . $strUpdate . " WHERE ID=" . $ID;
			if (!$DB->Query($strSql))
			{
				return false;
			}
		}
		return true;
	}

	// delete by ID
	public static function Delete($ID)
	{
		global $DB;
		$codes = new CHotKeysCode;

		$res = CFavorites::GetByID($ID);

		while ($arFav = $res->Fetch())
		{
			$codes->Delete($arFav["CODE_ID"]);
		}

		return $DB->Query("DELETE FROM b_favorite WHERE ID='" . intval($ID) . "'");
	}

	public static function OnUserDelete($user_id)
	{
		global $DB;
		return $DB->Query("DELETE FROM b_favorite WHERE USER_ID=" . intval($user_id));
	}

	public static function OnLanguageDelete($language_id)
	{
		global $DB;
		return $DB->Query("DELETE FROM b_favorite WHERE LANGUAGE_ID='" . $DB->ForSQL($language_id, 2) . "'");
	}

	public static function GetList($aSort = [], $arFilter = [])
	{
		global $DB;
		$arSqlSearch = [];
		if (is_array($arFilter))
		{
			foreach ($arFilter as $key => $val)
			{
				if ((string)$val == '' || $val == "NOT_REF")
				{
					continue;
				}
				switch (mb_strtoupper($key))
				{
					case "ID":
						$arSqlSearch[] = GetFilterQuery("F.ID", $val, "N");
						break;
					case "USER_ID":
						$arSqlSearch[] = "F.USER_ID = " . intval($val);
						break;
					case "MENU_FOR_USER":
						$arSqlSearch[] = "(F.USER_ID=" . intval($val) . " OR F.COMMON='Y')";
						break;
					case "COMMON":
						$arSqlSearch[] = "F.COMMON = '" . $DB->ForSql($val, 1) . "'";
						break;
					case "LANGUAGE_ID":
						$arSqlSearch[] = "F.LANGUAGE_ID = '" . $DB->ForSql($val, 2) . "'";
						break;
					case "DATE1":
						$arSqlSearch[] = "F.TIMESTAMP_X >= FROM_UNIXTIME('" . MkDateTime(FmtDate($val, "D.M.Y"), "d.m.Y") . "')";
						break;
					case "DATE2":
						$arSqlSearch[] = "F.TIMESTAMP_X <= FROM_UNIXTIME('" . MkDateTime(FmtDate($val, "D.M.Y") . " 23:59:59", "d.m.Y") . "')";
						break;
					case "MODIFIED":
						$arSqlSearch[] = GetFilterQuery("UM.ID, UM.LOGIN, UM.LAST_NAME, UM.NAME", $val);
						break;
					case "MODIFIED_ID":
						$arSqlSearch[] = "F.MODIFIED_BY = " . intval($val);
						break;
					case "CREATED":
						$arSqlSearch[] = GetFilterQuery("UC.ID, UC.LOGIN, UC.LAST_NAME, UC.NAME", $val);
						break;
					case "CREATED_ID":
						$arSqlSearch[] = "F.CREATED_BY = " . intval($val);
						break;
					case "KEYWORDS":
						$arSqlSearch[] = GetFilterQuery("F.COMMENTS", $val);
						break;
					case "NAME":
						$arSqlSearch[] = GetFilterQuery("F.NAME", $val);
						break;
					case "URL":
						$arSqlSearch[] = GetFilterQuery("F.URL", $val);
						break;
					case "MODULE_ID":
						$arSqlSearch[] = "F.MODULE_ID='" . $DB->ForSql($val, 50) . "'";
						break;
					case "MENU_ID":
						$arSqlSearch[] = "F.MENU_ID='" . $DB->ForSql($val, 255) . "'";
						break;
				}
			}
		}

		$sOrder = "";
		foreach ($aSort as $key => $val)
		{
			$ord = (mb_strtoupper($val) <> "ASC" ? "DESC" : "ASC");
			switch (mb_strtoupper($key))
			{
				case "ID":
					$sOrder .= ", F.ID " . $ord;
					break;
				case "LANGUAGE_ID":
					$sOrder .= ", F.LANGUAGE_ID " . $ord;
					break;
				case "COMMON":
					$sOrder .= ", F.COMMON " . $ord;
					break;
				case "USER_ID":
					$sOrder .= ", F.USER_ID " . $ord;
					break;
				case "TIMESTAMP_X":
					$sOrder .= ", F.TIMESTAMP_X " . $ord;
					break;
				case "MODIFIED_BY":
					$sOrder .= ", F.MODIFIED_BY " . $ord;
					break;
				case "NAME":
					$sOrder .= ", F.NAME " . $ord;
					break;
				case "URL":
					$sOrder .= ", F.URL " . $ord;
					break;
				case "SORT":
					$sOrder .= ", F.C_SORT " . $ord;
					break;
				case "MODULE_ID":
					$sOrder .= ", F.MODULE_ID " . $ord;
					break;
				case "MENU_ID":
					$sOrder .= ", F.MENU_ID " . $ord;
					break;
			}
		}
		if ($sOrder == '')
		{
			$sOrder = "F.ID DESC";
		}
		$strSqlOrder = " ORDER BY " . trim($sOrder, ", ");

		$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
		$strSql = "
			SELECT
				F.ID, F.C_SORT, F.NAME, F.MENU_ID, F.URL, F.MODIFIED_BY, F.CREATED_BY, F.MODULE_ID, F.LANGUAGE_ID,
				F.COMMENTS, F.COMMON, F.USER_ID, UM.LOGIN AS M_LOGIN, UC.LOGIN as C_LOGIN, U.LOGIN, F.CODE_ID,
				" . $DB->DateToCharFunction("F.TIMESTAMP_X") . "	TIMESTAMP_X,
				" . $DB->DateToCharFunction("F.DATE_CREATE") . "	DATE_CREATE,
				" . $DB->Concat($DB->IsNull("UM.NAME", "''"), "' '", $DB->IsNull("UM.LAST_NAME", "''")) . " as M_USER_NAME,
				" . $DB->Concat($DB->IsNull("UC.NAME", "''"), "' '", $DB->IsNull("UC.LAST_NAME", "''")) . " as C_USER_NAME,
				" . $DB->Concat($DB->IsNull("U.NAME", "''"), "' '", $DB->IsNull("U.LAST_NAME", "''")) . " as USER_NAME
			FROM
				b_favorite F
				LEFT JOIN b_user UM ON (UM.ID = F.MODIFIED_BY)
				LEFT JOIN b_user UC ON (UC.ID = F.CREATED_BY)
				LEFT JOIN b_user U ON (U.ID = F.USER_ID)
			WHERE
			" . $strSqlSearch . "
			" . $strSqlOrder;

		$res = $DB->Query($strSql);

		return $res;
	}
}

class CBXFavAdmMenu
{
	private $arItems = [];

	public function __construct()
	{
		global $APPLICATION, $USER, $adminPage, $adminMenu;

		//for ajax requests, and menu autoupdates
		$adminPage->Init();
		$adminMenu->Init($adminPage->aModules);

		$dbFav = CFavorites::GetList(
			[
				"COMMON" => "ASC",
				"SORT" => "ASC",
				"NAME" => "ASC",
			], [
				"MENU_FOR_USER" => $USER->GetID(),
				"LANGUAGE_ID" => LANGUAGE_ID,
			]
		);

		while ($arFav = $dbFav->GetNext())
		{
			if ($arFav["COMMON"] == "Y" && $arFav["MODULE_ID"] <> "" && $APPLICATION->GetGroupRight($arFav["MODULE_ID"]) < "R")
			{
				continue;
			}

			$this->arItems[] = $arFav;
		}
	}

	public function GetMenuItem($itemsID, $arMenu)
	{
		if (!is_array($arMenu))
		{
			return false;
		}

		foreach ($arMenu as $arItem)
		{
			if (isset($arItem["items_id"]) && $arItem["items_id"] == $itemsID)
			{
				return $arItem;
			}
			else
			{
				if (is_array($arItem) && !empty($arItem))
				{
					$arFindItem = $this->GetMenuItem($itemsID, $arItem);

					if (is_array($arFindItem) && !empty($arFindItem))
					{
						return $arFindItem;
					}
				}
			}
		}

		return false;
	}

	public function GenerateItems()
	{
		global $adminMenu;

		$favOptions = CUserOptions::GetOption('favorite', 'favorite_menu', ["stick" => "N"]);

		$aMenu = [];

		foreach ($this->arItems as $arItem)
		{
			$tmpMenu = [];

			if ($arItem["MENU_ID"])
			{
				$tmpMenu = $this->GetMenuItem($arItem["MENU_ID"], $adminMenu->aGlobalMenu);
			}

			if (!$arItem["MENU_ID"] || !is_array($tmpMenu) || empty($tmpMenu))
			{
				$tmpMenu = [
					"text" => $arItem["NAME"],
					"url" => $arItem["URL"],
					"dynamic" => false,
					"items_id" => "menu_favorite_" . $arItem["ID"],
					"title" => $arItem["NAME"],
					"icon" => "fav_menu_icon",
					"page_icon" => "fav_page_icon",
				];
			}

			$tmpMenu["fav_id"] = $arItem["ID"];
			$tmpMenu["parent_menu"] = "global_menu_desktop";

			if (!isset($tmpMenu['icon']) || $tmpMenu['icon'] == '')
			{
				$tmpMenu['icon'] = 'fav_menu_icon';
			}

			if ($this->CheckItemActivity($tmpMenu))
			{
				$tmpMenu["_active"] = true;
			}

			if ((isset($tmpMenu["_active"]) && $tmpMenu["_active"] || $this->CheckSubItemActivity($tmpMenu)) && $favOptions["stick"] == "Y")
			{
				$GLOBALS["BX_FAVORITE_MENU_ACTIVE_ID"] = true;
			}

			$aMenu[] = $tmpMenu;
		}

		return $aMenu;
	}

	private function CheckSubItemActivity($arMenu)
	{
		if (!isset($arMenu["items"]) || !is_array($arMenu["items"]))
		{
			return false;
		}

		foreach ($arMenu["items"] as $menu)
		{
			if (!empty($menu["_active"]))
			{
				return true;
			}

			if ($this->CheckSubItemActivity($menu))
			{
				return true;
			}
		}

		return false;
	}

	private function CheckItemActivity($arMenu)
	{
		if (!empty($arMenu["_active"]))
		{
			return true;
		}

		global $adminMenu, $APPLICATION;

		if (empty($adminMenu->aActiveSections))
		{
			return false;
		}

		$currentUrl = $APPLICATION->GetCurPageParam();
		$menuUrl = htmlspecialcharsback($arMenu["url"] ?? '');

		if (CBXFavUrls::Compare($menuUrl, $currentUrl))
		{
			return true;
		}

		$activeSectUrl = htmlspecialcharsback($adminMenu->aActiveSections["_active"]["url"] ?? '');

		if (CBXFavUrls::Compare($menuUrl, $activeSectUrl))
		{
			return true;
		}

		return $this->CheckFilterActivity($currentUrl, $menuUrl, $activeSectUrl);
	}

	private function CheckFilterActivity($currentUrl, $menuUrl, $activeSectUrl)
	{
		if (!CBXFavUrls::Compare($menuUrl, $activeSectUrl))
		{
			return false;
		}

		$curUrlFilterId = CBXFavUrls::GetFilterId($currentUrl);

		if ($curUrlFilterId == CBXFavUrls::GetFilterId($menuUrl))
		{
			return true;
		}

		if ($curUrlFilterId && $curUrlFilterId == CBXFavUrls::GetPresetId($menuUrl))
		{
			return true;
		}

		if (CBXFavUrls::GetPresetId($currentUrl) && CBXFavUrls::GetFilterId($menuUrl) == CBXFavUrls::GetPresetId($currentUrl))
		{
			return true;
		}

		return false;
	}

	public function GenerateMenuHTML($id = 0)
	{
		global $adminMenu;
		$buff = "";

		$menuItems = $this->GenerateItems();

		if (empty($menuItems))
		{
			$buff .= self::GetEmptyMenuHTML();
		}
		else
		{
			ob_start();

			echo '<script bxrunfirst="true">BX.adminFav.setLastId(' . intval($id) . ');</script>';

			$menuScripts = '';
			foreach ($menuItems as $arItem)
			{
				$menuScripts .= $adminMenu->Show($arItem);
			}

			echo '<script>' . $menuScripts . '</script>';

			$buff .= ob_get_contents();
			ob_end_clean();
		}

		$buff .= self::GetMenuHintHTML(empty($menuItems));

		return $buff;
	}

	public static function GetEmptyMenuHTML()
	{
		return '
<div class="adm-favorites-cap-text">
	' . GetMessage("fav_main_menu_nothing") . '
</div>';
	}

	public static function GetMenuHintHTML($IsMenuEmpty)
	{
		$favHintOptions = CUserOptions::GetOption('favorites_menu', "hint", ["hide" => "N"]);

		if (!$IsMenuEmpty && $favHintOptions["hide"] == "Y")
		{
			return false;
		}

		$retHtml = '
<div id="adm-favorites-cap-hint-block" class="adm-favorites-cap-hint-block">
	<div class="adm-favorites-cap-hint-icon icon-1"></div>
	<div class="adm-favorites-cap-hint-text">
		' . GetMessage("fav_main_menu_add_icon") . '
	</div>
	<div class="adm-favorites-cap-hint-icon icon-2"></div>
	<div class="adm-favorites-cap-hint-text">
		' . GetMessage("fav_main_menu_add_dd") . '
	</div>';

		if (!$IsMenuEmpty)
		{
			$retHtml .= '
	<a class="adm-favorites-cap-remove" href="javascript:void(0);" onclick="BX.adminFav.closeHint(this);">' . GetMessage("fav_main_menu_close_hint") . '</a>';
		}

		$retHtml .= '
</div>';

		return $retHtml;
	}
}

class CBXFavUrls
{
	const FILTER_ID_VALUE = "adm_filter_applied";
	const PRESET_ID_VALUE = "adm_filter_preset";

	public static function Compare($url1, $url2, $arReqVals = [], $arSkipVals = [])
	{
		if ($url1 == '' && $url2 == '')
		{
			return false;
		}

		if (is_array($url1))
		{
			$arUrl1 = $url1;
		}
		elseif (is_string($url1))
		{
			$arUrl1 = self::ParseDetail($url1);
		}
		else
		{
			return false;
		}

		$arUrl2 = self::ParseDetail($url2);

		if (isset($arUrl1["path"]) && isset($arUrl2["path"]) && $arUrl1["path"] != $arUrl2["path"])
		{
			$urlPath1 = pathinfo($arUrl1["path"]);
			$urlPath2 = pathinfo($arUrl2["path"]);

			if (
				isset($urlPath1["dirname"])
				&& $urlPath1["dirname"] != '.'
				&& isset($urlPath2["dirname"])
				&& $urlPath2["dirname"] != '.'
				&& $urlPath1["dirname"] != $urlPath2["dirname"]
			)
			{
				return false;
			}

			if (isset($urlPath1["basename"]) && isset($urlPath2["basename"]) && $urlPath1["basename"] != $urlPath2["basename"])
			{
				return false;
			}
		}

		if (isset($arUrl1["host"]) && isset($arUrl2["host"]) && $arUrl1["host"] != $arUrl2["host"])
		{
			return false;
		}

		if (isset($arUrl1["query"]) && isset($arUrl2["query"]) && $arUrl1["query"] == $arUrl2["query"])
		{
			return true;
		}

		if (is_array($arUrl1["ar_query"]) && is_array($arUrl2["ar_query"]))
		{
			foreach ($arUrl1["ar_query"] as $valName => $value)
			{
				if (!isset($arUrl2["ar_query"][$valName]) || $arUrl1["ar_query"][$valName] != $arUrl2["ar_query"][$valName])
				{
					if (!empty($arReqVals))
					{
						if (in_array($valName, $arReqVals))
						{
							return false;
						}

						continue;
					}
					if (!empty($arSkipVals))
					{
						if (in_array($valName, $arSkipVals))
						{
							continue;
						}

						return false;
					}

					return false;
				}
			}

			if (!empty($arReqVals))
			{
				foreach ($arReqVals as $valName => $value)
				{
					if (isset($arUrl2["ar_query"][$valName]))
					{
						if (!isset($arUrl1["ar_query"][$valName]))
						{
							return false;
						}

						if ($arUrl1["ar_query"][$valName] != $arUrl2["ar_query"][$valName])
						{
							return false;
						}
					}
				}
			}
		}

		return true;
	}

	public static function ParseDetail($url)
	{
		$parts = parse_url($url);

		if (isset($parts['query']))
		{
			parse_str(urldecode($parts['query']), $parts['ar_query']);
		}

		return $parts;
	}

	public static function GetFilterId($url)
	{
		$urlParams = self::ParseDetail($url);

		if (isset($urlParams["ar_query"][self::FILTER_ID_VALUE]) && $urlParams["ar_query"][self::FILTER_ID_VALUE] != "")
		{
			return $urlParams["ar_query"][self::FILTER_ID_VALUE];
		}

		return false;
	}

	public static function GetPresetId($url)
	{
		$urlParams = self::ParseDetail($url);

		if (isset($urlParams["ar_query"][self::PRESET_ID_VALUE]) && $urlParams["ar_query"][self::PRESET_ID_VALUE] != "")
		{
			return $urlParams["ar_query"][self::PRESET_ID_VALUE];
		}

		return false;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit