diff --git a/Core/API/Parameter/StringType.class.php b/Core/API/Parameter/StringType.class.php index 1916910..7732530 100644 --- a/Core/API/Parameter/StringType.class.php +++ b/Core/API/Parameter/StringType.class.php @@ -4,8 +4,10 @@ namespace Core\API\Parameter; class StringType extends Parameter { + const UNLIMITED = -1; + public int $maxLength; - public function __construct(string $name, int $maxLength = -1, bool $optional = FALSE, ?string $defaultValue = NULL, ?array $choices = NULL) { + public function __construct(string $name, int $maxLength = self::UNLIMITED, bool $optional = FALSE, ?string $defaultValue = NULL, ?array $choices = NULL) { $this->maxLength = $maxLength; parent::__construct($name, Parameter::TYPE_STRING, $optional, $defaultValue, $choices); } diff --git a/Core/API/SettingsAPI.class.php b/Core/API/SettingsAPI.class.php index b44e5f2..703c5ce 100644 --- a/Core/API/SettingsAPI.class.php +++ b/Core/API/SettingsAPI.class.php @@ -37,28 +37,11 @@ namespace Core\API\Settings { $key = $this->getParam("key"); $sql = $this->context->getSQL(); - $query = $sql->select("name", "value") ->from("Settings"); - - if (!is_null($key)) { - $query->where(new CondRegex(new Column("name"), $key)); - } - - // filter sensitive values, if called from outside - if ($this->isExternalCall()) { - $query->where(new CondNot("private")); - } - - $res = $query->execute(); - - $this->success = ($res !== FALSE); - $this->lastError = $sql->getLastError(); - - if ($this->success) { - $settings = array(); - foreach($res as $row) { - $settings[$row["name"]] = $row["value"]; - } + $settings = Settings::getAll($sql, $key); + if ($settings !== null) { $this->result["settings"] = $settings; + } else { + return $this->createError("Error fetching settings: " . $sql->getLastError()); } return $this->success; @@ -151,7 +134,7 @@ namespace Core\API\Settings { return null; } - private function deleteKeys(array $keys) { + private function deleteKeys(array $keys): bool { $sql = $this->context->getSQL(); $res = $sql->delete("Settings") ->where(new CondIn(new Column("name"), $keys)) diff --git a/Core/Configuration/Settings.class.php b/Core/Configuration/Settings.class.php index 8ccb847..89d4dab 100644 --- a/Core/Configuration/Settings.class.php +++ b/Core/Configuration/Settings.class.php @@ -7,7 +7,11 @@ namespace Core\Configuration; use Core\Driver\Logger\Logger; +use Core\Driver\SQL\Column\Column; +use Core\Driver\SQL\Condition\CondNot; +use Core\Driver\SQL\Condition\CondRegex; use Core\Driver\SQL\Query\Insert; +use Core\Driver\SQL\SQL; use Core\Objects\Context; class Settings { @@ -45,6 +49,41 @@ class Settings { $this->logger = new Logger("Settings"); } + public static function getAll(?SQL $sql, ?string $pattern = null, bool $external = false): ?array { + $query = $sql->select("name", "value") ->from("Settings"); + + if ($pattern) { + $query->where(new CondRegex(new Column("name"), $pattern)); + } + + if ($external) { + $query->where(new CondNot("private")); + } + + $res = $query->execute(); + if ($res !== false && $res !== null) { + $settings = array(); + foreach($res as $row) { + $settings[$row["name"]] = $row["value"]; + } + return $settings; + } else { + return null; + } + } + + public static function get(?SQL $sql, string $key, mixed $defaultValue): mixed { + $res = $sql->select("value") ->from("Settings") + ->whereEq("name", $key) + ->execute(); + + if ($res === false || $res === null) { + return null; + } else { + return (empty($res)) ? $defaultValue : $res[0]["value"]; + } + } + public function getJwtPublicKey(bool $allowPrivate = true): ?\Firebase\JWT\Key { if (empty($this->jwtPublicKey)) { if ($allowPrivate && $this->jwtSecretKey) { diff --git a/Core/Driver/SQL/MySQL.class.php b/Core/Driver/SQL/MySQL.class.php index 560f10a..bb7c055 100644 --- a/Core/Driver/SQL/MySQL.class.php +++ b/Core/Driver/SQL/MySQL.class.php @@ -201,7 +201,10 @@ class MySQL extends SQL { } } } catch (\mysqli_sql_exception $exception) { - $this->lastError = $this->logger->error("MySQL::execute failed: $stmt->error ($stmt->errno)"); + $this->lastError = $this->logger->error("MySQL::execute failed: " . + ($stmt !== null + ? "$stmt->error ($stmt->errno)" + : $exception->getMessage())); } finally { if ($res !== null && !is_bool($res) && $fetchType !== self::FETCH_ITERATIVE) { diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 2bc369d..460a438 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -1,13 +1,17 @@ FROM composer:latest AS composer -FROM php:8.0-fpm +FROM php:8.1-fpm WORKDIR "/application" + +ARG ADDITIONAL_PACKAGES +ARG ADDITIONAL_SCRIPT + RUN mkdir -p /application/core/Configuration /var/www/.gnupg && \ chown -R www-data:www-data /application /var/www/ && \ chmod 700 /var/www/.gnupg -# YAML + dev dependencies +# YAML + dev dependencies + additional packages RUN apt-get update -y && \ - apt-get install -y libyaml-dev libzip-dev libgmp-dev libpng-dev gnupg2 && \ + apt-get install -y libyaml-dev libzip-dev libgmp-dev libpng-dev gnupg2 $ADDITIONAL_PACKAGES && \ pecl install yaml && docker-php-ext-enable yaml && \ docker-php-ext-install gd @@ -27,5 +31,8 @@ RUN docker-php-ext-install mysqli zip gmp # clean cache RUN apt-get clean +# run additional scripts +RUN if [[ ! -z "$ADDITIONAL_SCRIPT" ]]; then $ADDITIONAL_SCRIPT; fi + COPY --from=composer /usr/bin/composer /usr/bin/composer USER www-data \ No newline at end of file