mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-13 02:04:03 +00:00
* Bump dependencies for Laravel 10 * Update GitHub Actions for Laravel 10 * ci: do not test L10 using PHP 7.3 * drop < L9 support * use `dispatch_sync` instead of `dispatch_now` * migrate phpunit configuration * Update ci.yml * drop laravel < 9 support * misc L10 fixes, new docker image * specify odbc version * wip * properly list php versions as strings * minor changes * Add `getValue($queryGrammar)` to raw query * Clean up `isVersion8` code * rewrite hasFailed assertion * phpunit schema update * Upgrade `doctrine/dbal` --------- Co-authored-by: Samuel Štancl <samuel@archte.ch> Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com> Co-authored-by: lukinovec <lukinovec@gmail.com>
65 lines
2.2 KiB
PHP
65 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Stancl\Tenancy\TenantDatabaseManagers;
|
|
|
|
use Stancl\Tenancy\Concerns\CreatesDatabaseUsers;
|
|
use Stancl\Tenancy\Contracts\ManagesDatabaseUsers;
|
|
use Stancl\Tenancy\DatabaseConfig;
|
|
|
|
class PermissionControlledMySQLDatabaseManager extends MySQLDatabaseManager implements ManagesDatabaseUsers
|
|
{
|
|
use CreatesDatabaseUsers;
|
|
|
|
public static $grants = [
|
|
'ALTER', 'ALTER ROUTINE', 'CREATE', 'CREATE ROUTINE', 'CREATE TEMPORARY TABLES', 'CREATE VIEW',
|
|
'DELETE', 'DROP', 'EVENT', 'EXECUTE', 'INDEX', 'INSERT', 'LOCK TABLES', 'REFERENCES', 'SELECT',
|
|
'SHOW VIEW', 'TRIGGER', 'UPDATE',
|
|
];
|
|
|
|
public function createUser(DatabaseConfig $databaseConfig): bool
|
|
{
|
|
$database = $databaseConfig->getName();
|
|
$username = $databaseConfig->getUsername();
|
|
$hostname = $databaseConfig->connection()['host'];
|
|
$password = $databaseConfig->getPassword();
|
|
|
|
$this->database()->statement("CREATE USER `{$username}`@`%` IDENTIFIED BY '{$password}'");
|
|
|
|
$grants = implode(', ', static::$grants);
|
|
|
|
if ($this->isVersion8()) { // MySQL 8+
|
|
$grantQuery = "GRANT $grants ON `$database`.* TO `$username`@`%`";
|
|
} else { // MySQL 5.7
|
|
$grantQuery = "GRANT $grants ON `$database`.* TO `$username`@`%` IDENTIFIED BY '$password'";
|
|
}
|
|
|
|
return $this->database()->statement($grantQuery);
|
|
}
|
|
|
|
protected function isVersion8(): bool
|
|
{
|
|
$versionSelect = $this->database()->raw('select version()')->getValue($this->database()->getQueryGrammar());
|
|
$version = $this->database()->select($versionSelect)[0]->{'version()'};
|
|
|
|
return version_compare($version, '8.0.0') >= 0;
|
|
}
|
|
|
|
public function deleteUser(DatabaseConfig $databaseConfig): bool
|
|
{
|
|
return $this->database()->statement("DROP USER IF EXISTS '{$databaseConfig->getUsername()}'");
|
|
}
|
|
|
|
public function userExists(string $username): bool
|
|
{
|
|
return (bool) $this->database()->select("SELECT count(*) FROM mysql.user WHERE user = '$username'")[0]->{'count(*)'};
|
|
}
|
|
|
|
public function makeConnectionConfig(array $baseConfig, string $databaseName): array
|
|
{
|
|
$baseConfig['database'] = $databaseName;
|
|
|
|
return $baseConfig;
|
|
}
|
|
}
|