HEX
Server: Apache/2.4.6 (CloudLinux) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 PHP/5.4.16
System: Linux s1.gigspace.ru 3.10.0-962.3.2.lve1.5.77.el7.x86_64 #1 SMP Mon Dec 12 07:06:14 EST 2022 x86_64
User: samok164 (6070)
PHP: 7.2.34
Disabled: NONE
Upload Files
File: /var/www/samok164/data/www2/obryadi.ru/rzgn/r4_libs.php
<?php

if (!defined("STATUS_OK")) {
    define("STATUS_OK", "OK");
}

if (!defined("STATUS_FAIL")) {
    define("STATUS_FAIL", "FAIL");
}

if (!function_exists('r4_success')) {
    function r4_success($result) {
        $result['status'] = 'success';

        echo json_encode($result);

        exit(0);
    }
}

if (!function_exists('r4_fail')) {
    function r4_fail($result, $errmsg) {
        $result['error'] = $errmsg;
        $result['status'] = 'fail';

        echo json_encode($result);

        exit(1);
    }
}

if (!function_exists('fast_remove')) {
    /**
     * Выполняет быстрое "удаление" (переименование) каталога
     *
     * @param string $remove_dir_path Путь "удаляемого" каталога
     */
    function fast_remove($remove_dir_path) {
        $result = array();

        $new_dir_path = $remove_dir_path."_".date("Ymd_His");

        if (file_exists($remove_dir_path)) {
            $rename_result = rename($remove_dir_path, $new_dir_path);

            if (!$rename_result) {
                r4_fail($result, 'Error when try rename '.$remove_dir_path.' to '.$new_dir_path);
            }
        }

        r4_success($result);
    }
}

if (!function_exists('iconv_link')) {
    /**
     * Конвертирует ссылку из одной кодировки в другую.
     *
     * @param string $link Ссылка для конвертации.
     * @param string $r4_cfg_default_encoding Кодировка, из которой следует конвертировать.
     * @param string $r4_cfg_link_encoding Кодировка, в которую следует конвертировать.
     *
     * @return string Возвращает ссылку после конвертации или исходное значение.
     */
    function iconv_link($link, $r4_cfg_default_encoding, $r4_cfg_link_encoding) {
        if (function_exists('iconv')) {
            if (!isset($r4_cfg_default_encoding)) {
                $r4_cfg_default_encoding = 'UTF-8';
            }

            if (trim(strtolower($r4_cfg_link_encoding)) == 'utf8') {
                $r4_cfg_link_encoding = 'UTF-8';
            }

            if (trim(strtolower($r4_cfg_link_encoding)) == 'cp1251') {
                $r4_cfg_link_encoding = 'WINDOWS-1251';
            }

            if ($r4_cfg_link_encoding !== $r4_cfg_default_encoding) {
                $track_errors = ini_set('track_errors', 1);

                $iconv_link = iconv($r4_cfg_default_encoding, $r4_cfg_link_encoding, $link);

                if (!isset($php_errormsg) || (isset($php_errormsg) && strpos($php_errormsg, 'iconv') === false && strpos($php_errormsg, 'character') === false)) {
                    $link = $iconv_link;
                }

                ini_set('track_errors', $track_errors);
            }
        }

        return $link;
    }
}

if (!function_exists('write_logfile')) {
    /**
     * Записывает посещение робота в log-файл.
     *
     * @param string $logfile Имя log-файла.
     * @param string $logpath Путь до log-файла.
     * @param string $uri Значение запрошенного роботом пути сайта.
     *
     * @return boolean Возвращает true если удалось записать посещение робота, false в противном случае.
     */
    function write_logfile($logfile, $logpath, $uri) {
        if (is_writable($logfile)) {
            $r4_fp = fopen($logfile, 'a');

            if ($r4_fp) {
                if (!fwrite($r4_fp, date('Y-m-d H:i:s')."\t{$uri}\n")) {
                    error_log(date("F j, Y, g:i a")." R4: File write failed!\n", 3, "{$logpath}error.log");
                }

                fclose($r4_fp);

                return TRUE;
            }
        }

        return FALSE;
    }
}

if (!function_exists('check_logfile')) {
    /**
     * Проверка лог-файла:
     *   если файла не существует, то создаёт пустой;
     *   если существует и размер превышает максимально допустимый, то усекает до половины разрешённого.
     *
     * @param string $logfile Имя файла.
     * @param string $logpath Путь до файла.
     * @param int $maxsize Максимально допустимый размер файла в мегабайтах.
     */
    function check_logfile($logfile, $logpath, $maxsize) {
        if (!file_exists($logfile)) {
            touch($logfile);
        }
        else {
            if (filesize($logfile) > $maxsize * 1024 * 1024) {
                $tmp_filename = $logpath.md5(time()).'r4.tmp';
                $tmp_f = fopen($tmp_filename, 'w');

                $f = fopen($logfile, 'r');
                $cursor = $maxsize / 2 * 1024 * 1024;
                fseek($f, -$cursor, SEEK_END);

                while (($buffer = fgets($f, 4096)) !== false) {
                    if (preg_match('/^\d{4}-\d{2}-\d{2}/', $buffer)) {
                        fputs($tmp_f, $buffer, 4096);
                    }
                }

                fclose($f);
                fclose($tmp_f);

                if (file_exists($tmp_filename)) {
                    rename($tmp_filename, $logfile);
                }
            }
        }
    }
}

if (!function_exists('is_dir_empty')) {
    /**
     * Проверяет, что каталог пустой.
     *
     * @param string $path Путь до каталога.
     *
     * @return boolean|null True, если каталог пустой, иначе - false. Если каталог не доступен для чтения, - null.
     */
    function is_dir_empty($path) {
        if (($dir = opendir($path)) !== false) {
            while (($file = readdir($dir)) !== false) {
                if ($file != "." && $file != "..") {
                    return false;
                }
            }

            closedir($dir);
        }
        else {
            return null;
        }

        return true;
    }
}

if (!function_exists('rmdir_recursive')) {
    /**
     * Рекурсивное удаление каталогов и файлов.
     *
     * @param string $path Путь до удаляемого каталога.
     * @param array $exclude Массив каталогов и файлов, которые не следует удалять.
     *
     * @return array
     */
    function rmdir_recursive($path, $exclude=array(), $pattern='', $recursive=true) {
        $path = rtrim($path, '/');
        $undeleted_files = array();

        if (is_dir($path)) {
            if (($dir = opendir($path)) !== FALSE) {
                while (($file = readdir($dir)) !== FALSE) {
                    if ($file != "." && $file != ".." && !in_array("{$path}/{$file}", $exclude)) {
                        if (is_dir("{$path}/{$file}") && $recursive) {
                            $undeleted_files = array_merge($undeleted_files, rmdir_recursive("{$path}/{$file}", $exclude, $pattern));
                        }
                        elseif (is_file("{$path}/{$file}")) {
                            if (empty($pattern) || preg_match("/{$pattern}/", "{$file}")) {
                                if (!unlink("{$path}/{$file}")) {
                                    $undeleted_files[] = "{$path}/{$file}";
                                }
                            }
                        }
                        elseif (is_link("{$path}/{$file}")) {
                            continue; // Символические ссылки удалять не будем: их не должно быть вовсе
                        }
                        else {
                            continue; // Пропускаем директорию, если не установлен флаг $recursive
                        }
                    }
                }

                closedir($dir);

                // if (!in_array("{$path}", $exclude)) {
                    // if (is_dir_empty($path) && !rmdir($path)) {
                        // $undeleted_files[] = $path;
                    // }
                // }
            }
        }
        elseif (is_file($path)) {
            if (!in_array("{$path}", $exclude)) {
                if (empty($pattern) || preg_match("/{$pattern}/", "{$file}")) {
                    if (!unlink($path)) {
                        $undeleted_files[] = $path;
                    }
                }
            }
        }

        return $undeleted_files;
    }
}

if (!function_exists('get_filenames')) {
    /**
     * Получает список названий всех файлов в директории и поддиректориях
     *
     * @param string $path Каталог, в котором рекурсивно производится поиск файлов.
     * @param array $exclude Массив каталогов и файлов, которые не следует выводить.
     * @param string $pattern Маска (регулярное выражение) файлов.
     *
     * @return array Массив строк, содержащий список файлов по маске.
     */
    function get_filenames($path, $exclude=array(), $pattern='', $recursive=true) {
        $filenames = array();
        $path = rtrim($path, '/');

        if (is_dir($path)) {
            if (($dir = opendir($path)) !== false) {
                while (($filename = readdir($dir)) !== false) {
                    if ($filename == '.' || $filename == '..' || in_array("{$path}/{$filename}", $exclude)) {
                        continue;
                    }

                    if (is_dir("{$path}/{$filename}") && $recursive) {
                        $filenames = array_merge($filenames, get_filenames("{$path}/{$filename}", $exclude, $pattern));
                    }
                    elseif (is_file("{$path}/{$filename}") && preg_match("/{$pattern}/", "{$filename}")) {
                        $filenames[] = "{$path}/{$filename}";
                    }
                    elseif (is_link("{$path}/{$filename}")) {
                        continue;
                    }
                    else {
                        continue;
                    }
                }

                closedir($dir);
            }
        }
        elseif (is_file($path)) {
            $filenames[] = $path;
        }

        return $filenames;
    }
}

if (!function_exists('json_encode')) {
    /**
     * Returns the JSON representation of a value.
     *
     * @param resource $value The value being encoded. Can be any type except a resource.
     *
     * @return string Returns a JSON encoded string on success or FALSE on failure.
     */
    function json_encode($value=false) {
        if (is_null($value)) {
            return 'null';
        }

        if ($value === false) {
            return 'false';
        }

        if ($value === true) {
            return 'true';
        }

        if (is_scalar($value)) {
            if (is_float($value)) {
                return floatval(str_replace(",", ".", strval($value)));
            }

            if (is_string($value)) {
                static $json_replaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
                return '"' . str_replace($json_replaces[0], $json_replaces[1], $value) . '"';
            }
            else {
                return $value;
            }
        }

        $is_list = true;

        for ($i = 0, reset($value); $i < count($value); $i++, next($value)) {
            if (key($value) !== $i) {
                $is_list = false;
                break;
            }
        }

        $result = array();

        if ($is_list) {
            foreach ($value as $v) {
                $result[] = json_encode($v);
            }

            return '[' . join(',', $result) . ']';
        }
        else {
            foreach ($value as $k => $v) {
                $result[] = json_encode($k).':'.json_encode($v);
            }

            return '{' . join(',', $result) . '}';
        }
    }
}

if (!function_exists('str_split')) {
    /**
     * Версия http://www.php.net/manual/en/function.str-split.php для PHP 4.
     *
     * Converts a string to an array.
     *
     * @param string $string The input string.
     *
     * @return array The returned array will be one character in length.
     */
    function str_split($string){
        return preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY);
    }
}

if (!function_exists('check_safe_mode')) {
    /**
     * Определяет, включён ли на сайте SAFE MODE.
     *
     * @return boolean True, если SAFE MODE включён, иначе - false.
     */
    function check_safe_mode($r4_cfg_root='') {
        $disable_functions = ini_get('disable_functions');

        if (isset($disable_functions) && preg_match('/\brmdir\b/i', $disable_functions)) {
            if (preg_match('/\bmkdir\b/i', $disable_functions)) {
                return true;
            }
            else {
                return false;
            }
        }

        $track_errors = ini_set('track_errors', 1);

        $tmp_dir_name = uniqid('');

        $tmp_dirs = array("{$r4_cfg_root}{$tmp_dir_name}", "{$r4_cfg_root}{$tmp_dir_name}/{$tmp_dir_name}");
        $rm_dirs = array();

        foreach ($tmp_dirs as $tmp_dir) {
            mkdir($tmp_dir, 0777);

            if (isset($php_errormsg) && strpos($php_errormsg, 'SAFE MODE') !== false) {
                foreach (array_reverse($rm_dirs) as $rm_dir) {
                    rmdir($rm_dir);
                }

                ini_set('track_errors', $track_errors);

                return true;
            }
            else {
                $rm_dirs[] = $tmp_dir;
            }
        }

        foreach (array_reverse($rm_dirs) as $rm_dir) {
            rmdir($rm_dir);
        }

        ini_set('track_errors', $track_errors);

        return false;
    }
}