/** * Метод регистрации страницы * * WebPages::register('xxx.php', 'Консоль администратора', PAGE_ADMIN, self::getIdent(), AuthManager::AUTH_TYPE_NO_MATTER, PAGE_ADMIN); * * @param string $path - путь к скрипту, например 'xxx.php' * @param string $name - название страницы, например 'Консоль администратора' * @param int $code - код страницы PAGE_ADMIN * @param int $builderIdent - идентификатор построителя страниц, например 'PB_admin::getIdent()' * @param int $authType - тип авторизации, необходимый для доступа к странице, например 'AuthManager::AUTH_TYPE_NO_MATTER' * @param int $pageCodeNoAccess - страница, на которую нужно перейти при отсутствии доступа, например 'BASE_PAGE_INDEX' * @param bool $allovedInProduction - признак, доступна ли страница в ProductionMode */ protected final function register($path, $name, $code, $builderIdent = null, $authType = AuthManager::AUTH_TYPE_NO_MATTER, $pageCodeNoAccess = null, $allovedInProduction = true) { if (!$allovedInProduction && PsDefines::isProduction()) { return; //---- } $path = PsCheck::notEmptyString($path); $name = PsCheck::notEmptyString($name); $code = PsCheck::int($code); if (array_key_exists($code, $this->PAGES)) { PsUtil::raise('\'{}\' is already registered. Cannot register WebPage with same code \'{}\'.', $this->PAGES[$code], $code); } else { $this->PAGES[$code] = new WebPage($path, $name, $code, $authType, $pageCodeNoAccess, $builderIdent); $this->LOGGER->info('+{}. {}', pad_left(count($this->PAGES), 2, ' '), $this->PAGES[$code]); } }
/** * Список методов, доступных для вызова */ public static function getMethodsList() { if (!AuthManager::isAuthorizedAsAdmin() || PsDefines::isProduction()) { return array(); } if (!is_array(self::$METHODS)) { self::$METHODS = array(); $methodNames = PsUtil::getClassMethods(TestManager::inst(), true, false, true, true); foreach ($methodNames as $name) { $method = new ReflectionMethod(TestManager::inst(), $name); $params['name'] = $name; $params['descr'] = implode("\n", StringUtils::parseMultiLineComments($method->getDocComment())); $params['params'] = array(); /* @var $param ReflectionParameter */ foreach ($method->getParameters() as $param) { $params['params'][] = array('name' => $param->getName(), 'dflt' => $param->isDefaultValueAvailable() ? var_export($param->getDefaultValue(), true) : null); } self::$METHODS[$name] = $params; } } return self::$METHODS; }
/** * Метод получает на вход url ресурса и пытается его обфусцировать, если это возможно. * * @return: путь к ресурсу, который должнет быть подключен, или null, если ресурс подключать не нужно */ private function tryReplaceResource($url) { if (!starts_with($url, DIR_SEPARATOR)) { //Это внешний ресурс: http:// и т.д. - подключаем. return $url; } $di = DirItem::inst($url); if (!$di->isFile() || $di->getSize() <= 0) { return null; } if (!PsDefines::isProduction()) { //Не будем пытаться обфусцировать в девелопменте //return $url; } if (!ends_with($url, '.js')) { //Мы не можем обфусцировать .css файлы, так как они используют относительные пути к ресурсам. return $url; } return $url; $url = $di->getRelPath(); if (!starts_with($url, $this->OBFUSCATABLE)) { //Не стоит обфусцировать не наши .js файлы, так как они могут внутри использовать ссылки на рядом лежащие ресурсы return $url; } $type = 'js'; $obfuscatedDi = DirManager::autogen("resources/{$type}")->getDirItem(null, md5($url), $type); $mtyme = $obfuscatedDi->getModificationTime(); if (!$mtyme || $mtyme < $di->getModificationTime()) { $obfuscatedDi->writeToFile(StringUtils::normalizeResourceFile($type, $di->getFileContents()), true); } return $obfuscatedDi->getRelPath(); }
private function validateGroup($group) { /** * Если зависимости от сущностей БД ещё не были проверены, * то запустим эту проверку и больше о валидности кешей, * зависящих от сущностей БД, можно не заботиться. * * Эту проверку нужно выполнять в любом случае, так как её запуск может * показать изменение сущностей фолдинга или самих фолдингов, работающих * с изменёнными таблицами/представлениями. */ DbChangeListener::check(); $this->TREE->setTypeValidated(self::CHILD_DBENTITY, 'Выполнена проверка изменений в БД'); /** * Если группа не валидируема - пропускаем. * Она могла стать валидируемой после проверки по базе. */ if (!$this->TREE->isGroupValidatable($group)) { return; //--- } $this->LOGGER->info(" > Валидируем группу кешей [{$group}]"); /* * Проверим, можно ли выполнить процесс и, если можно, выполним. * После выполнения о свежести логов можно будет не заботиться. */ $this->LOGGER->info(" ! Пытаемся выполнить внейший процесс"); if (ExternalProcess::inst()->executeFromClient()) { $this->TREE->setTypeValidated(self::CHILD_FOLDING, 'Выполнен внешний процесс от имени клиента'); return; //--- } /* * Если мы в продакшене - прекращаем дальнейшие проверки. * * Вообще говоря без полной проверки всех фолдингов, от которых зависит данная группа кеша, * считать группу провалидированной нельзя. Но если где-либо будет обнаружен изменённый * фолдинг, то это приведёт к вызову метода {@link #onFoldingChanged} и кеш всёже будет сброшен. */ $this->LOGGER->info(" ! Проверяем режим продакшн"); if (PsDefines::isProduction()) { $this->TREE->setTypeValidated(self::CHILD_FOLDING, 'Включён режим продакшн'); return; //--- } $foldings = $this->TREE->getChildsForValidate(self::CHILD_FOLDING, $group); $this->LOGGER->info(" ! Валидируем фолдинги"); foreach ($foldings as $fUnique) { $this->LOGGER->info(" ! Проверяем на изменение фолдинг [{$fUnique}]"); if (Handlers::getInstance()->getFoldingByUnique($fUnique)->checkFirstEntityChanged()) { //Выполним действия по оповещению об изменении $this->onFoldingChanged($fUnique); //Не будем проверять вообще все фолдинги, от которых мы зависим - это задача {@see ExternalProcess}. return; //--- } else { $this->TREE->onChildValidated(self::CHILD_FOLDING, $fUnique); } } $this->LOGGER->info(" < Группа кешей [{$group}] прошла валидацию и не была изменена"); }
/** * Признак - авторизованы мы под админом или же работаем в девелопменте. * Часто в этом сочитании можно дать возможность выполнять дополнительные действия. */ public static function DEVMODE_OR_ADMIN() { return !PsDefines::isProduction() || AuthManager::isAuthorizedAsAdmin(); }
/** * Функция для регистрации страниц * * @param type $path * @param type $name * @param type $code * @param AbstractPageBuilder $builderIdent * @param type $authType * @param type $basePageCode * @param type $pageCodeNoAccess * @param type $allovedInProduction * @return type */ public static final function register($path, $name, $code, $builderIdent, $authType, $basePageCode = null, $pageCodeNoAccess = null, $allovedInProduction = true) { self::$allowedScripts[] = $path; if (!$allovedInProduction && PsDefines::isProduction()) { return; //---- } check_condition(self::$storeState === 1, 'Страница не может быть заретистирована, хранилище находится в состоянии [' . self::$storeState . ']'); check_condition(is_string($path) && !isEmpty($path), "Некорректный путь для страницы [{$path}]"); check_condition(is_integer($code), "Некорректный код для страницы [{$code}]"); $pathBase = get_file_name($path); check_condition(!array_key_exists($pathBase, self::$page2pathBase) && !array_key_exists($code, self::$page2code), "Страница [{$name} ({$code})] не может быть зарегистрирована дважды"); $page = new WebPage($path, $name, $code, $authType, $basePageCode, $pageCodeNoAccess, $builderIdent); self::$page2code[$code] = $page; self::$page2pathBase[$pathBase] = $page; }
public static final function production() { return PsDefines::isProduction(); }