diff --git a/src/Database/Concerns/ValidatesDatabaseParameters.php b/src/Database/Concerns/ValidatesDatabaseParameters.php index 0b1ce746..18af74c7 100644 --- a/src/Database/Concerns/ValidatesDatabaseParameters.php +++ b/src/Database/Concerns/ValidatesDatabaseParameters.php @@ -23,7 +23,7 @@ trait ValidatesDatabaseParameters * Used as the default allowlist in validateParameter(), which validates non-password * parameters such as database names or usernames. */ - protected static function allowedParameterCharacters(): string + protected function allowedParameterCharacters(): string { return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-'; } @@ -36,7 +36,7 @@ trait ValidatesDatabaseParameters * characters that can break out of the quoted SQL strings (so e.g. * ', ", \, and ` aren't allowed). */ - protected static function allowedPasswordCharacters(): string + protected function allowedPasswordCharacters(): string { return ' !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~'; } @@ -46,15 +46,15 @@ trait ValidatesDatabaseParameters * only contain allowed characters before used in SQL statements * (or paths in the case of SQLiteDatabaseManager). * - * By default, only the characters in static::allowedParameterCharacters() are allowed. + * By default, only the characters in allowedParameterCharacters() are allowed. * * Null parameters are skipped. * * @throws InvalidArgumentException */ - protected static function validateParameter(string|array|null $parameters, string|null $allowedCharacters = null): void + protected function validateParameter(string|array|null $parameters, string|null $allowedCharacters = null): void { - $allowedCharacters ??= static::allowedParameterCharacters(); + $allowedCharacters ??= $this->allowedParameterCharacters(); foreach ((array) $parameters as $parameter) { if (is_null($parameter)) { @@ -78,7 +78,7 @@ trait ValidatesDatabaseParameters } /** - * Ensure password only contains allowed characters (static::allowedPasswordCharacters()) + * Ensure password only contains allowed characters (allowedPasswordCharacters()) * before used in SQL statements. * * Used in permission controlled managers as a shorthand for calling validateParameter() @@ -86,8 +86,8 @@ trait ValidatesDatabaseParameters * * @throws InvalidArgumentException */ - protected static function validatePassword(string|null $password): void + protected function validatePassword(string|null $password): void { - static::validateParameter($password, allowedCharacters: static::allowedPasswordCharacters()); + $this->validateParameter($password, allowedCharacters: $this->allowedPasswordCharacters()); } } diff --git a/src/Database/TenantDatabaseManagers/SQLiteDatabaseManager.php b/src/Database/TenantDatabaseManagers/SQLiteDatabaseManager.php index 8f52a9ed..129cdb37 100644 --- a/src/Database/TenantDatabaseManagers/SQLiteDatabaseManager.php +++ b/src/Database/TenantDatabaseManagers/SQLiteDatabaseManager.php @@ -136,6 +136,9 @@ class SQLiteDatabaseManager implements TenantDatabaseManager public function makeConnectionConfig(array $baseConfig, string $databaseName): array { if ($this->isInMemory($databaseName)) { + // Named in-memory DBs are formatted like 'file:_tenancy_inmemory_tenant123?mode=memory&cache=shared' + $this->validateDatabaseName($databaseName, ':?=&'); + $baseConfig['database'] = $databaseName; if (static::$persistInMemoryConnectionUsing !== null) { @@ -162,30 +165,21 @@ class SQLiteDatabaseManager implements TenantDatabaseManager public static function isInMemory(string $name): bool { - if ($name === ':memory:') { - return true; - } + $isNamed = str_starts_with($name, 'file:_tenancy_inmemory_') && + str_ends_with($name, '?mode=memory&cache=shared'); - if (str_starts_with($name, 'file:_tenancy_inmemory_') && - str_ends_with($name, '?mode=memory&cache=shared')) { - // Named in-memory DBs are formatted like 'file:_tenancy_inmemory_tenant123?mode=memory&cache=shared' - static::validateDatabaseName($name, ':?=&'); - - return true; - } - - return false; + return $name === ':memory:' || $isNamed; } /** * Ensure database name only contains allowed characters - * (static::allowedDatabaseNameCharacters() + $extraAllowedCharacters) and is not a directory name. + * (allowedDatabaseNameCharacters() + $extraAllowedCharacters) and is not a directory name. * * @throws InvalidArgumentException */ - protected static function validateDatabaseName(string $name, string $extraAllowedCharacters = ''): void + protected function validateDatabaseName(string $name, string $extraAllowedCharacters = ''): void { - static::validateParameter($name, static::allowedDatabaseNameCharacters() . $extraAllowedCharacters); + $this->validateParameter($name, $this->allowedDatabaseNameCharacters() . $extraAllowedCharacters); if ($name === '') { throw new InvalidArgumentException('Database name cannot be empty.');