From f2552dd9ab034af3903055c067e1939c5e53be5c Mon Sep 17 00:00:00 2001 From: Denis Ryabov Date: Mon, 10 May 2021 20:06:58 +0300 Subject: [PATCH] Add JEDCheckerHelper class with some common methods --- .../com_jedchecker/libraries/helper.php | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 administrator/components/com_jedchecker/libraries/helper.php diff --git a/administrator/components/com_jedchecker/libraries/helper.php b/administrator/components/com_jedchecker/libraries/helper.php new file mode 100644 index 0000000..6251e04 --- /dev/null +++ b/administrator/components/com_jedchecker/libraries/helper.php @@ -0,0 +1,197 @@ +element)) + { + $extension = (string) $xml->element; + } + else + { + $extension = (string) $xml->name; + + if (isset($xml->files)) + { + foreach ($xml->files->children() as $child) + { + if (isset($child[$type])) + { + $extension = (string) $child[$type]; + } + } + } + } + + $extension = strtolower(JFilterInput::getInstance()->clean($extension, 'cmd')); + + if ($type === 'component' && strpos($extension, 'com_') !== 0) + { + $extension = 'com_' . $extension; + } + + return $extension; + } + + /** + * Removes HTML, comments, and/or strings content keeping EOL characters to preserve line numbers + * + * @param string $content PHP sources + * @param int $options Bitwise set of options + * + * @return string + * @since 3.0 + */ + public static function cleanPhpCode($content, $options = self::CLEAN_HTML | self::CLEAN_COMMENTS) + { + $isCleanHtml = $options & self::CLEAN_HTML; + $isCleanComments = $options & self::CLEAN_COMMENTS; + $isCleanStrings = $options & self::CLEAN_STRINGS; + + if (!preg_match('/<\?php\s/i', $content, $match, PREG_OFFSET_CAPTURE)) + { + // No PHP code found + return $isCleanHtml ? '' : $content; + } + + $pos = $match[0][1]; + $code = substr($content, 0, $pos); + $cleanContent = $isCleanHtml ? self::removeContent($code) : $code; + + while (preg_match('/(?:[\'"]|\/\*|\/\/|\?>)/', $content, $match, PREG_OFFSET_CAPTURE, $pos)) + { + $foundPos = $match[0][1]; + $cleanContent .= substr($content, $pos, $foundPos - $pos); + $pos = $foundPos; + + switch ($match[0][0]) + { + case '"': + case "'": + $q = $match[0][0]; + + if (!preg_match("/$q(?>[^$q\\\\]+|\\\\.)*$q/As", $content, $match, 0, $pos)) + { + return $cleanContent . ($isCleanStrings ? $q : substr($content, $pos)); + } + + $code = $match[0]; + $cleanContent .= $isCleanStrings ? $q . self::removeContent($code) . $q : $code; + $pos += strlen($code); + break; + + case '/*': + $cleanContent .= '/*'; + $pos += 2; + + $endPos = strpos($content, '*/', $pos); + + if ($endPos === false) + { + return $isCleanComments ? $cleanContent : $cleanContent . substr($content, $pos); + } + + $code = substr($content, $pos, $endPos - $pos); + $cleanContent .= $isCleanComments ? self::removeContent($code) : $code; + $cleanContent .= '*/'; + $pos = $endPos + 2; + + break; + + case '//': + $commentLen = strcspn($content, "\r\n", $pos); + + if (!$isCleanComments) + { + $cleanContent .= substr($content, $pos, $commentLen); + } + + $pos += $commentLen; + break; + + case '?>': + $cleanContent .= '?>'; + $pos += 2; + + if (!preg_match('/<\?php\s/i', $content, $match, PREG_OFFSET_CAPTURE, $pos)) + { + // No PHP code found (up to the end of the file) + return $cleanContent . ($isCleanHtml ? '' : substr($content, $pos)); + } + + $foundPos = $match[0][1]; + $code = substr($content, $pos, $foundPos - $pos); + $cleanContent .= $isCleanHtml ? self::removeContent($code) : $code; + + $phpPreamble = $match[0][0]; + $cleanContent .= $phpPreamble; + $pos = $foundPos + strlen($phpPreamble); + + break; + } + } + + $cleanContent .= substr($content, $pos); + + return $cleanContent; + } + + /** + * Remove all text content by keeping newline characters only (to preserve line numbers) + * + * @param string $content Partial content + * + * @return string + * @since 3.0 + */ + protected static function removeContent($content) + { + return str_repeat("\n", substr_count($content, "\n")); + } +}