diff --git a/resources/views/ssh/services/database/mariadb/create.blade.php b/resources/views/ssh/services/database/mariadb/create.blade.php index 51dc05bed..c0e663d99 100644 --- a/resources/views/ssh/services/database/mariadb/create.blade.php +++ b/resources/views/ssh/services/database/mariadb/create.blade.php @@ -1,4 +1,4 @@ -if ! sudo mariadb -e "CREATE DATABASE IF NOT EXISTS {{ $name }} CHARACTER SET '{{ $charset }}' COLLATE '{{ $collation }}'"; then +if ! sudo mariadb -e "CREATE DATABASE IF NOT EXISTS \`{{ $name }}\` CHARACTER SET '{{ $charset }}' COLLATE '{{ $collation }}'"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/resources/views/ssh/services/database/mariadb/delete.blade.php b/resources/views/ssh/services/database/mariadb/delete.blade.php index 406fad58e..ebc48b1e7 100644 --- a/resources/views/ssh/services/database/mariadb/delete.blade.php +++ b/resources/views/ssh/services/database/mariadb/delete.blade.php @@ -1,4 +1,4 @@ -if ! sudo mariadb -e "DROP DATABASE IF EXISTS {{ $name }}"; then +if ! sudo mariadb -e "DROP DATABASE IF EXISTS \`{{ $name }}\`"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/resources/views/ssh/services/database/mariadb/link.blade.php b/resources/views/ssh/services/database/mariadb/link.blade.php index adffbe91f..02d38b8cd 100644 --- a/resources/views/ssh/services/database/mariadb/link.blade.php +++ b/resources/views/ssh/services/database/mariadb/link.blade.php @@ -7,13 +7,13 @@ @endphp # Revoke all privileges first to ensure clean state -if ! sudo mariadb -e "REVOKE ALL PRIVILEGES ON {{ $database }}.* FROM '{{ $username }}'@'{{ $host }}'"; then +if ! sudo mariadb -e "REVOKE ALL PRIVILEGES ON \`{{ $database }}\`.* FROM '{{ $username }}'@'{{ $host }}'"; then # Ignore error if user has no privileges yet true fi # Grant the specific privileges -if ! sudo mariadb -e "GRANT {{ $grants }} ON {{ $database }}.* TO '{{ $username }}'@'{{ $host }}'"; then +if ! sudo mariadb -e "GRANT {{ $grants }} ON \`{{ $database }}\`.* TO '{{ $username }}'@'{{ $host }}'"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/resources/views/ssh/services/database/mysql/create.blade.php b/resources/views/ssh/services/database/mysql/create.blade.php index da09ba89e..9061349ca 100755 --- a/resources/views/ssh/services/database/mysql/create.blade.php +++ b/resources/views/ssh/services/database/mysql/create.blade.php @@ -1,4 +1,4 @@ -if ! sudo mysql -e "CREATE DATABASE IF NOT EXISTS {{ $name }} CHARACTER SET '{{ $charset }}' COLLATE '{{ $collation }}'"; then +if ! sudo mysql -e "CREATE DATABASE IF NOT EXISTS \`{{ $name }}\` CHARACTER SET '{{ $charset }}' COLLATE '{{ $collation }}'"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/resources/views/ssh/services/database/mysql/delete.blade.php b/resources/views/ssh/services/database/mysql/delete.blade.php index 0130f47e6..a75643f18 100755 --- a/resources/views/ssh/services/database/mysql/delete.blade.php +++ b/resources/views/ssh/services/database/mysql/delete.blade.php @@ -1,4 +1,4 @@ -if ! sudo mysql -e "DROP DATABASE IF EXISTS {{ $name }}"; then +if ! sudo mysql -e "DROP DATABASE IF EXISTS \`{{ $name }}\`"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/resources/views/ssh/services/database/mysql/link.blade.php b/resources/views/ssh/services/database/mysql/link.blade.php index e1b180b39..b6fa51143 100755 --- a/resources/views/ssh/services/database/mysql/link.blade.php +++ b/resources/views/ssh/services/database/mysql/link.blade.php @@ -7,13 +7,13 @@ @endphp # Revoke all privileges first to ensure clean state -if ! sudo mysql -e "REVOKE ALL PRIVILEGES ON {{ $database }}.* FROM '{{ $username }}'@'{{ $host }}'"; then +if ! sudo mysql -e "REVOKE ALL PRIVILEGES ON \`{{ $database }}\`.* FROM '{{ $username }}'@'{{ $host }}'"; then # Ignore error if user has no privileges yet true fi # Grant the specific privileges -if ! sudo mysql -e "GRANT {{ $grants }} ON {{ $database }}.* TO '{{ $username }}'@'{{ $host }}'"; then +if ! sudo mysql -e "GRANT {{ $grants }} ON \`{{ $database }}\`.* TO '{{ $username }}'@'{{ $host }}'"; then echo 'VITO_SSH_ERROR' && exit 1 fi diff --git a/tests/Feature/DatabaseTest.php b/tests/Feature/DatabaseTest.php index aa887b2e7..2e24b5a7e 100644 --- a/tests/Feature/DatabaseTest.php +++ b/tests/Feature/DatabaseTest.php @@ -32,6 +32,25 @@ ]); }); +test('create database with a hyphen in the name', function () { + $this->actingAs($this->user); + + SSH::fake(); + + $this->post(route('databases.store', $this->server), [ + 'name' => 'my-database', + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + ])->assertSessionDoesntHaveErrors(); + + $this->assertDatabaseHas('databases', [ + 'name' => 'my-database', + 'status' => DatabaseStatus::READY, + ]); + + SSH::assertExecutedContains('CREATE DATABASE IF NOT EXISTS \`my-database\`'); +}); + test('create database with user', function () { $this->actingAs($this->user); @@ -129,6 +148,29 @@ ]); }); +test('delete database with a hyphen in the name', function () { + $this->actingAs($this->user); + + SSH::fake(); + + /** @var Database $database */ + $database = Database::factory()->create([ + 'server_id' => $this->server, + 'name' => 'my-database', + ]); + + $this->delete(route('databases.destroy', [ + 'server' => $this->server, + 'database' => $database, + ]))->assertSessionDoesntHaveErrors(); + + $this->assertSoftDeleted('databases', [ + 'id' => $database->id, + ]); + + SSH::assertExecutedContains('DROP DATABASE IF EXISTS \`my-database\`'); +}); + test('delete database keeps linked user databases a list', function () { $this->actingAs($this->user); diff --git a/tests/Feature/DatabaseUserTest.php b/tests/Feature/DatabaseUserTest.php index b59d1dc76..e9a226d80 100644 --- a/tests/Feature/DatabaseUserTest.php +++ b/tests/Feature/DatabaseUserTest.php @@ -740,6 +740,28 @@ SSH::assertNotExecutedContains('ALTER DEFAULT PRIVILEGES'); }); +test('mysql link quotes a database name with a hyphen', function () { + $this->actingAs($this->user); + + SSH::fake(); + + Database::factory()->create(['server_id' => $this->server, 'name' => 'my-database']); + + $databaseUser = DatabaseUser::factory()->create([ + 'server_id' => $this->server, + 'username' => 'app', + 'host' => 'localhost', + ]); + + $this->put(route('database-users.link', [ + 'server' => $this->server, + 'databaseUser' => $databaseUser, + ]), ['databases' => ['my-database']])->assertSessionDoesntHaveErrors(); + + SSH::assertExecutedContains('REVOKE ALL PRIVILEGES ON \`my-database\`.*'); + SSH::assertExecutedContains('GRANT ALL PRIVILEGES ON \`my-database\`.*'); +}); + function vitoPestFeatureDatabaseUserTestUsePostgresql(): void { test()->server->services()->where('type', Mysql::type())->delete();