diff --git a/app/Actions/Database/StartClickhouse.php b/app/Actions/Database/StartClickhouse.php index f9e92e08f1..4332050317 100644 --- a/app/Actions/Database/StartClickhouse.php +++ b/app/Actions/Database/StartClickhouse.php @@ -108,7 +108,7 @@ class StartClickhouse $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; $this->commands[] = dockerStopCommand(10, $container_name, $this->database->destination->server).' 2>/dev/null || true'; $this->commands[] = "docker rm -f $container_name 2>/dev/null || true"; diff --git a/app/Actions/Database/StartDragonfly.php b/app/Actions/Database/StartDragonfly.php index 078d557f57..a4c1540206 100644 --- a/app/Actions/Database/StartDragonfly.php +++ b/app/Actions/Database/StartDragonfly.php @@ -190,7 +190,7 @@ class StartDragonfly $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "chown -R 999:999 $this->configuration_dir/ssl/server.key $this->configuration_dir/ssl/server.crt"; diff --git a/app/Actions/Database/StartKeydb.php b/app/Actions/Database/StartKeydb.php index 3b9cba28f4..c10723b59e 100644 --- a/app/Actions/Database/StartKeydb.php +++ b/app/Actions/Database/StartKeydb.php @@ -205,7 +205,7 @@ class StartKeydb $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "chown -R 999:999 $this->configuration_dir/ssl/server.key $this->configuration_dir/ssl/server.crt"; diff --git a/app/Actions/Database/StartMariadb.php b/app/Actions/Database/StartMariadb.php index a05da25efd..6eb73f65b3 100644 --- a/app/Actions/Database/StartMariadb.php +++ b/app/Actions/Database/StartMariadb.php @@ -208,7 +208,7 @@ class StartMariadb $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt < /dev/null"; diff --git a/app/Actions/Database/StartMongodb.php b/app/Actions/Database/StartMongodb.php index ff338aa99f..1f389a101f 100644 --- a/app/Actions/Database/StartMongodb.php +++ b/app/Actions/Database/StartMongodb.php @@ -263,7 +263,7 @@ class StartMongodb $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mongodb:mongodb /etc/mongo/certs/server.pem < /dev/null"; diff --git a/app/Actions/Database/StartMysql.php b/app/Actions/Database/StartMysql.php index cff8d0b363..e69993323e 100644 --- a/app/Actions/Database/StartMysql.php +++ b/app/Actions/Database/StartMysql.php @@ -211,7 +211,7 @@ class StartMysql $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt < /dev/null"; diff --git a/app/Actions/Database/StartPostgresql.php b/app/Actions/Database/StartPostgresql.php index f9dd7a3c4f..4766fd8157 100644 --- a/app/Actions/Database/StartPostgresql.php +++ b/app/Actions/Database/StartPostgresql.php @@ -223,7 +223,7 @@ class StartPostgresql $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name postgres:postgres /var/lib/postgresql/certs/server.key /var/lib/postgresql/certs/server.crt < /dev/null"; diff --git a/app/Actions/Database/StartRedis.php b/app/Actions/Database/StartRedis.php index 41ece532b1..580738635d 100644 --- a/app/Actions/Database/StartRedis.php +++ b/app/Actions/Database/StartRedis.php @@ -202,7 +202,7 @@ class StartRedis $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; $readme = generate_readme_file($this->database->name, now()); $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; + $this->commands[] = 'echo '.escapeshellarg("Pulling {$database->image} image."); $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; if ($this->database->enable_ssl) { $this->commands[] = "chown -R 999:999 $this->configuration_dir/ssl/server.key $this->configuration_dir/ssl/server.crt"; diff --git a/tests/Unit/DatabaseStartupOutputTest.php b/tests/Unit/DatabaseStartupOutputTest.php new file mode 100644 index 0000000000..6b20ec9ae9 --- /dev/null +++ b/tests/Unit/DatabaseStartupOutputTest.php @@ -0,0 +1,25 @@ +toContain('$this->commands[] = \'echo \'.escapeshellarg("Pulling {$database->image} image.");'); +})->with([ + 'postgresql' => 'StartPostgresql', + 'clickhouse' => 'StartClickhouse', + 'dragonfly' => 'StartDragonfly', + 'keydb' => 'StartKeydb', + 'mariadb' => 'StartMariadb', + 'mongodb' => 'StartMongodb', + 'mysql' => 'StartMysql', + 'redis' => 'StartRedis', +]); + +it('prints image names as text', function (string $image) { + $message = "Pulling {$image} image."; + + expect(shell_exec('echo '.escapeshellarg($message)))->toBe($message."\n"); +})->with([ + 'apostrophe' => "example:v1's", + 'parentheses' => 'example:v1 (preview)', +]);