File: /var/www/samok164/data/www2/mirneboskrebov.ru/rzgn/r4_api.php
<?php
$r4_error_reporting = error_reporting(0);
$r4_cfg_root = dirname(__FILE__);
$r4_cfg_root .= '/';
$r4_cfg_root = preg_replace('|([/]+)|is', '/', $r4_cfg_root);
include_once("{$r4_cfg_root}r4_vars.php");
include_once("{$r4_cfg_root}r4_libs.php");
function r4_success($result) {
$result['status'] = 'success';
echo json_encode($result);
exit(0);
}
function r4_fail($result, $errmsg) {
$result['error'] = $errmsg;
$result['status'] = 'fail';
echo json_encode($result);
exit(1);
}
$result = array();
// Проверка ключа для доступа к API.
if (!empty($_GET['apikey'])) {
if (md5('r4apikey') !== $_GET['apikey']) {
r4_fail($result, 'ApiKey is invalid');
}
}
else {
r4_fail($result, 'ApiKey required');
}
// Проверка защитного ключа с привязкой к сайту.
if (file_exists("{$r4_cfg_root}r4_vars.php")) {
if (!empty($_GET['dongle']) && !empty($r4_cfg_dongle)) {
if ($r4_cfg_dongle !== $_GET['dongle']) {
r4_fail($result, 'Dongle is invalid');
}
}
else {
r4_fail($result, 'Dongle required');
}
}
// Загрузка или обновление файлов (бывший r4.putfile.php).
if (isset($_GET['upload']) || isset($_GET['putfile'])) {
if (empty($_GET['key'])) {
r4_fail($result, 'Signature required');
}
if (!isset($_POST['r'])) {
r4_fail($result, 'No file contents');
}
$rq = $_POST['r'];
if (!isset($_GET['fn'])) {
r4_fail($result, 'Filename not specified');
}
$fn = $_GET['fn'];
if (get_magic_quotes_gpc()) {
$rq = stripslashes($rq);
$fn = stripslashes($fn);
}
// Для нового разгонщика предварительно создаём папку links и соответствующие подпапки
if (preg_match('/^\d{18}\.rzg$/', $fn)) {
$r5_links_dir = 'links/';
$r5_links_subdir = $r5_links_dir . substr($fn, 0, 2);
if (!file_exists($r5_links_dir)) {
mkdir($r5_links_dir, 0777);
$error = error_get_last();
$error_message = isset($error['message']) ? $error['message'] : '';
if (strpos($error_message, 'SAFE MODE')) {
r4_fail($result, 'Safe mode is on');
}
chmod($r5_links_dir, 0777);
}
if (!file_exists($r5_links_subdir) && file_exists($r5_links_dir)) {
mkdir($r5_links_subdir, 0777);
$error = error_get_last();
$error_message = isset($error['message']) ? $error['message'] : '';
if (strpos($error_message, 'SAFE MODE')) {
r4_fail($result, 'Safe mode is on');
}
chmod($r5_links_subdir, 0777);
}
$fn = "{$r5_links_subdir}/{$fn}";
}
$url = preg_replace("/&key=[0-9a-f]{32}/i", "", $_SERVER['REQUEST_URI']);
if (md5('987agsdn7aoluygto97w64tudydtjkv'.'http://'.$_SERVER['HTTP_HOST'].$url.md5($rq)) != $_GET['key']) {
r4_fail($result, 'Incorrect key '.$_GET['key'].'. Host '.$_SERVER['HTTP_HOST']);
}
if (isset($r4_cfg_cms) && strtolower($r4_cfg_cms) === 'ozpp') {
$domain = $_SERVER['SERVER_NAME'];
$domain = preg_replace('#^www\.#ism', '', $domain);
$fn = "{$r4_cfg_root}{$domain}/{$fn}";
}
else {
$fn = "{$r4_cfg_root}{$fn}";
}
$f = fopen($fn, 'w');
if ($f) {
if (fwrite($f, $rq) == -1) {
r4_fail($result, "Error to write file: {$fn}");
}
fclose($f);
chmod($fn, 0644);
}
else {
r4_fail($result, "Error to open file: {$fn}");
}
r4_success($result);
}
// Паттерны для файлов разгонщика и файлов ссылок
$rzgn_pattern = '^(r4.*|razgon.*|getHash.*|addongoogle.*|\.htaccess)$';
$links_pattern = '^([0-9A-Fa-f]{32}|[0-9]{18})\.rzg$';
// Удаление папок и файлов в каталоге разгонщика (по умолчанию: удаление всех файлов).
if (array_intersect(array('delete_all', 'delete_rzgn', 'delete_links', 'delete_files'), array_keys($_GET))) {
$pattern = '';
if (isset($_GET['delete_rzgn'])) { // Удаление всех файлов разгонщика.
$pattern = $rzgn_pattern;
}
elseif (isset($_GET['delete_links'])) { // Удаление всех файлов со ссылками разгонщика.
$pattern = $links_pattern;
}
elseif (isset($_GET['delete_files']) && isset($_GET['pattern'])) { // Удаление файлов по маске.
if (get_magic_quotes_gpc()) {
$pattern = rawurldecode(stripslashes($_GET['pattern']));
}
else {
$pattern = rawurldecode($_GET['pattern']);
}
}
$exclude_files = array($r4_cfg_root.'r4_api.php', $r4_cfg_root.'r4_libs.php');
$undeleted_files = rmdir_recursive($r4_cfg_root, $exclude_files, $pattern);
if (empty($undeleted_files)) {
r4_success($result);
}
else {
$result['undeleted_files'] = $undeleted_files;
r4_fail($result, 'Some files were not deleted.');
}
}
// Получение содержимого файлов (по умолчанию: получение содержимого всех файлов в папке разгонщика).
if (array_intersect(array('download_all', 'download_rzgn', 'download_links', 'download_files'), array_keys($_GET))) {
$pattern = '';
if (isset($_GET['download_rzgn'])) { // Получение содержимого всех файлов разгонщика.
$pattern = $rzgn_pattern;
}
elseif (isset($_GET['download_links'])) { // Получение содержимого всех файлов со ссылками разгонщика.
$pattern = $links_pattern;
}
elseif (isset($_GET['download_files']) && isset($_GET['pattern'])) { // Получение содержимого файлов по маске.
if (get_magic_quotes_gpc()) {
$pattern = rawurldecode(stripslashes($_GET['pattern']));
}
else {
$pattern = rawurldecode($_GET['pattern']);
}
}
$filenames = get_filenames($r4_cfg_root, array(), $pattern);
$files = array();
foreach ($filenames as $filename) {
$contents = file_get_contents($filename);
$files[substr($filename, strlen($r4_cfg_root))] = base64_encode($contents);
}
$result['files'] = $files;
r4_success($result);
}
// Возвращает список файлов (по умолчанию: получение списка всех файлов в папке разгонщика).
if (array_intersect(array('list_all', 'list_rzgn', 'list_links', 'list_files'), array_keys($_GET))) {
$pattern = '';
if (isset($_GET['list_rzgn'])) { // Возвращает список всех файлов разгонщика.
$pattern = $rzgn_pattern;
}
elseif (isset($_GET['list_links'])) { // Возвращает список всех файлов со ссылками разгонщика.
$pattern = $links_pattern;
}
elseif (isset($_GET['list_files']) && isset($_GET['pattern'])) { // Возвращает список файлов по маске.
if (get_magic_quotes_gpc()) {
$pattern = rawurldecode(stripslashes($_GET['pattern']));
}
else {
$pattern = rawurldecode($_GET['pattern']);
}
}
$filenames = get_filenames($r4_cfg_root, array(), $pattern);
foreach ($filenames as $key => $filename) {
$filenames[$key] = substr($filename, strlen($r4_cfg_root));
}
$result['files'] = $filenames;
r4_success($result);
}
// Возвращает содержимое log-файлов посещений роботов поисковых систем.
if (isset($_GET['get_visits_log'])) {
if (empty($_GET['engine'])) {
r4_fail($result, 'Param engine is empty');
}
if (!in_array($_GET['engine'], array('yandex', 'google'))) {
r4_fail($result, 'Unknown engine: ' . $_GET['engine']);
}
$r4_logfile = $_SERVER['DOCUMENT_ROOT'] . '/rzgn/seenby' . $_GET['engine'] . '.rzg';
if (!file_exists($r4_logfile)) {
r4_fail($result, 'File not found: ' . $r4_logfile);
}
$action = array_intersect(array('get', 'delete'), explode(',', (empty($_GET['action']) ? 'get' : $_GET['action'])));
if (in_array('get', $action)) {
$result['contents'] = file_get_contents($r4_logfile);
}
if (in_array('delete', $action)) {
if (!unlink($r4_logfile)) {
$result['error'] = 'Could not delete: ' . $r4_logfile;
}
}
r4_success($result);
}
// Получение используемой версии разгонщика.
if (isset($_GET['get_version'])) {
$filename = 'r4_version';
if (file_exists("{$r4_cfg_root}{$filename}")) {
$result['version'] = file_get_contents("{$r4_cfg_root}{$filename}");
r4_success($result);
}
else {
r4_fail($result, "File not found: {$filename}");
}
}
// Получение параметров сайта из конфигурационного файла.
if (isset($_GET['get_config'])) {
$filename = 'r4_vars.php';
if (file_exists("{$r4_cfg_root}{$filename}")) {
$matches = array();
$contents = file_get_contents("{$r4_cfg_root}{$filename}");
preg_match_all('/^\s+\$(.*?)\s+=\s+(.*?);/ism', $contents, $matches);
$result['php_version'] = preg_replace('/^(\d+\.\d+(?:\.\d+)?).*$/', '$1', phpversion());
$result['cfg_root'] = $r4_cfg_root;
foreach ($matches[1] as $index => $match) {
$result[$match] = ($matches[2][$index]);
}
r4_success($result);
}
else {
r4_fail($result, "File not found: {$filename}");
}
}
error_reporting($r4_error_reporting);