Exemplo n.º 1
0
 /**
  * Метод регистрации страницы
  * 
  * 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]);
     }
 }
Exemplo n.º 2
0
 /**
  * Список методов, доступных для вызова
  */
 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;
 }
Exemplo n.º 3
0
 /**
  * Метод получает на вход 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();
 }
Exemplo n.º 4
0
 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}] прошла валидацию и не была изменена");
 }
Exemplo n.º 5
0
 /**
  * Признак - авторизованы мы под админом или же работаем в девелопменте.
  * Часто в этом сочитании можно дать возможность выполнять дополнительные действия.
  */
 public static function DEVMODE_OR_ADMIN()
 {
     return !PsDefines::isProduction() || AuthManager::isAuthorizedAsAdmin();
 }
Exemplo n.º 6
0
 /**
  * Функция для регистрации страниц
  * 
  * @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;
 }
Exemplo n.º 7
0
 public static final function production()
 {
     return PsDefines::isProduction();
 }