/** * Проверка права запускать скрипты через Консоль * * В режиме отладки - разрешено без вопросов, иначе - при указании правильного ключа. Количество ошибок считается. * Ключ и допустимое количество прописываем в конфиге приложения: * <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); }
public function test_deleteFile() { $this->assertTrue($this->root->hasChild('some.ext'), 'Целевой файл перед удалением существует'); FS::deleteFile($this->rootPath . 'some.ext'); $this->assertFalse($this->root->hasChild('some.ext'), 'Целевой файл после удаления исчез'); }
/** * Пример кастомного валидатора * * Дезинфекция каталога. Валидатор для типа "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; }