Example #1
0
 /**
  * Проверка права запускать скрипты через Консоль
  *
  * В режиме отладки - разрешено без вопросов, иначе - при указании правильного ключа. Количество ошибок считается.
  * Ключ и допустимое количество прописываем в конфиге приложения:
  * <pre>
  * 'console => [
  *      'ties' => int|0
  *      'key' => string|''
  * ]
  * </pre>
  *
  * <b>Внимание!</b> При отсутствии этого конфига, а так же со значениями по умолчанию, доступ будет разрешен.
  *
  * В дальнейшем можно добавить контроль на запрещенные/разрешенные IP и т.п.
  *
  * Неудавшиеся попытки логируются, после NN попыток консоль вообще блокируется через файл [TEMP_PATH/console.lock],
  * при блокировке админу пойдет письмо.
  *
  * @param string $key ключ доступа, спарсенный из запроса
  * @return null если нет права запуска, прямо тут все и закончится. Поэтому возвращаемое значение не важно.
  */
 private function checkAccess(string $key)
 {
     if (DEBUG) {
         return;
     }
     $lockFile = TEMP_PATH . 'convisor.lock';
     $count = file_exists($lockFile) ? file_get_contents($lockFile) : 0;
     $tries = (int) App::conf('convisor.tries', false);
     $critical = $tries && $count >= $tries;
     if ($critical) {
         exit('Консоль заблокирована' . PHP_EOL);
     }
     $allow = (string) App::conf('convisor.key', false) == $key;
     if (!$allow) {
         $count++;
         $msg = "{$count} неудачная попытка запуска скрипта в консоли: {$this->script} " . implode(' ', $this->params);
         if ($critical) {
             App::logger()->add(['message' => $msg, 'type' => 'deny console', 'notify' => true]);
         } else {
             App::logger()->addTyped($msg, 'deny console');
         }
         file_put_contents($lockFile, $count);
         exit('Запуск запрещен' . PHP_EOL);
     }
     FS::deleteFile($lockFile);
 }
Example #2
0
 public function test_deleteFile()
 {
     $this->assertTrue($this->root->hasChild('some.ext'), 'Целевой файл перед удалением существует');
     FS::deleteFile($this->rootPath . 'some.ext');
     $this->assertFalse($this->root->hasChild('some.ext'), 'Целевой файл после удаления исчез');
 }
Example #3
0
 /**
  * Пример кастомного валидатора
  *
  * Дезинфекция каталога. Валидатор для типа "filter_var".
  *
  * Заменяем слеши на прямые, в конце ставим слеш. Проверяем каталог на попытки переходов типа "../path/"
  * или "some/../../path/". Это недопустимо.
  *
  * @param string $value проверяемое значение
  * @return false|string
  */
 public static function normalizePath($value)
 {
     if ($value) {
         $value = trim(str_replace('\\', '/', $value), '/') . '/';
         if (FS::hasDots($value)) {
             return false;
         }
     }
     return $value;
 }