File: /var/www/samok164/data/www2/townsusa.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");
$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');
}
}
// Проверка режима SAFE MODE.
$safe_mode = check_safe_mode($r4_cfg_root);
if ($safe_mode) {
include_once("{$r4_cfg_root}pclerror.lib.php3");
include_once("{$r4_cfg_root}pcltrace.lib.php3");
include_once("{$r4_cfg_root}pcltar.lib.php3");
}
// Мультидомены.
if (isset($r4_cfg_multidomain) && $r4_cfg_multidomain && !$safe_mode) {
$r4_domain = preg_replace('#^www\.#ism', '', $_SERVER['SERVER_NAME']).'/';
if (!file_exists("{$r4_cfg_root}{$r4_domain}")) {
mkdir("{$r4_cfg_root}{$r4_domain}", 0755);
chmod("{$r4_cfg_root}{$r4_domain}", 0755);
}
$safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
}
elseif (isset($r4_cfg_multidomain) && $r4_cfg_multidomain) {
$r4_domain = preg_replace('#^www\.#ism', '', $_SERVER['SERVER_NAME']).'_';
$safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
$r4_domain = '';
}
else {
$r4_domain = '';
$safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
}
// Загрузка или обновление файлов (бывший 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);
}
$skip_key_check = false;
if ($fn === 'multiuploader') {
$skip_key_check = true; // Ключ один, а файлов может быть несколько
foreach (explode(';', $rq) as $t) {
list($fn, $rq) = explode(',', $t, 2);
$content[$fn] = base64_decode($rq);
}
}
else {
$content[$fn] = $rq;
}
foreach ($content as $fn => $rq) {
if (!$skip_key_check) {
$url = preg_replace("/&key=[0-9a-f]{32}/i", "", $_SERVER['REQUEST_URI']);
$secret_key = md5('987agsdn7aoluygto97w64tudydtjkv'.'http://'.$_SERVER['HTTP_HOST'].$url.md5($rq));
if ($secret_key != $_GET['key']) {
r4_fail($result, 'Incorrect key '.$_GET['key'].'. Host '.$_SERVER['HTTP_HOST']);
}
}
$is_new_rzg_file = preg_match('/^\d{18}\.rzg$/', $fn);
// Для нового разгонщика предварительно создаём папку links и соответствующие подпапки
// Если на сайте включён SAFE MODE, то пропускаем данный шаг
if ($is_new_rzg_file && !$safe_mode) {
$r5_links_dir = "{$r4_domain}links";
$r5_links_subdir = $r5_links_dir.'/'.substr($fn, 0, 2);
if (!file_exists($r5_links_dir)) {
mkdir($r5_links_dir, 0777);
chmod($r5_links_dir, 0777);
}
if (!file_exists($r5_links_subdir) && file_exists($r5_links_dir)) {
mkdir($r5_links_subdir, 0777);
chmod($r5_links_subdir, 0777);
}
$fn = "{$r5_links_subdir}/{$fn}";
}
$r4_files_list = array(
'.htaccess',
'pclerror.lib.php3',
'pcltar.lib.php3',
'pcltrace.lib.php3',
'r4_api.php',
'r4_download_links.php',
'r4_download.php',
'r4_getHash.php',
'r4_libs.php',
'r4_vars.php',
'r4_version',
'razgon2006return.php',
'razgon2006vnutri.php'
);
$r4_params_files_list = array(
'r4_badparams.list',
'r4_knownparams.list'
);
if ($is_new_rzg_file || in_array($fn, $r4_files_list) || $safe_mode) {
$fn = "{$r4_cfg_root}{$fn}";
}
else {
$fn = "{$r4_cfg_root}{$r4_domain}{$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);
// Если включён SAFE MODE, то файл добавляем к links.tar, а искомый файл удаляем
if ($safe_mode) {
$p_tarname = $safe_mode_links_file;
$p_list = array($fn);
$p_mode = 'tar';
$p_add_dir = '';
$p_remove_dir = "{$r4_cfg_root}";
if (file_exists($p_tarname)) {
PclTarUpdate($p_tarname, $p_list, $p_mode, $p_add_dir, $p_remove_dir);
}
else {
PclTarCreate($p_tarname, $p_list, $p_mode, $p_add_dir, $p_remove_dir);
}
if (!unlink($fn)) {
r4_fail($result, "Error to delete file: {$fn} - SAFE MODE ON");
}
}
}
else {
r4_fail($result, "Error to open file: {$fn}");
}
}
r4_success($result);
}
// Паттерны для файлов разгонщика и файлов ссылок
$rzgn_pattern = '^(r4.*|razgon.*|getHash.*|addongoogle.*|\.htaccess|pcl.*)$';
$links_pattern = '^(([0-9A-Fa-f]{32}|[0-9]{18})\.rzg|.*links\.tar)$';
// Удаление папок и файлов в каталоге разгонщика (по умолчанию: удаление всех файлов).
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']);
}
}
// Если SAFE MODE включён на сайте, выполняем дополнительную проверку для SiteApi.check_r4()
if ($safe_mode && file_exists($safe_mode_links_file) && preg_match('/\d{18}\.rzg/', $pattern)) {
$filelist = PclTarList($safe_mode_links_file, 'tar');
foreach ($filelist as $properties) {
$filename = basename($properties['filename']);
$filenames[] = 'links/'.substr($filename, 0, 2).'/'.$filename;
}
}
else {
$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 = "{$r4_cfg_root}{$r4_domain}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_cfg_root}r4_version";
if (file_exists($filename)) {
$result['version'] = file_get_contents($filename);
r4_success($result);
}
else {
r4_fail($result, "File not found: {$filename}");
}
}
// Получение параметров сайта из конфигурационного файла.
if (isset($_GET['get_config'])) {
$filename = "{$r4_cfg_root}r4_vars.php";
if (file_exists($filename)) {
$matches = array();
$contents = file_get_contents($filename);
preg_match_all('/^\s+\$(.*?)\s+=\s+(.*?);/ism', $contents, $matches);
$result['safe_mode'] = $safe_mode;
$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);