diff --git a/apps/files_external/lib/Lib/Storage/FTP.php b/apps/files_external/lib/Lib/Storage/FTP.php index 2761f0123b97a..66e623e5a1b2c 100644 --- a/apps/files_external/lib/Lib/Storage/FTP.php +++ b/apps/files_external/lib/Lib/Storage/FTP.php @@ -49,7 +49,8 @@ public function __construct(array $parameters) { $this->secure = false; } $this->root = isset($parameters['root']) ? '/' . ltrim($parameters['root']) : '/'; - $this->port = $parameters['port'] ?? 21; + $parsedPort = $parameters['port'] ?? null; + $this->port = is_numeric($parsedPort) ? (int)$parsedPort : 21; $this->utf8Mode = isset($parameters['utf8']) && $parameters['utf8']; } else { throw new \Exception('Creating ' . self::class . ' storage failed, required parameters not set'); diff --git a/apps/files_external/tests/FtpConstructorTest.php b/apps/files_external/tests/FtpConstructorTest.php new file mode 100644 index 0000000000000..78c9d6b33e030 --- /dev/null +++ b/apps/files_external/tests/FtpConstructorTest.php @@ -0,0 +1,45 @@ + 'somehost', + 'user' => 'someuser', + 'password' => 'somepassword', + ]; + + return [ + 'no port given' => [$parameters, 21], + 'empty port' => [array_merge($parameters, ['port' => '']), 21], + 'null port' => [array_merge($parameters, ['port' => null]), 21], + 'non numeric port' => [array_merge($parameters, ['port' => 'ftp']), 21], + 'numeric string port' => [array_merge($parameters, ['port' => '2121']), 2121], + 'integer port' => [array_merge($parameters, ['port' => 2121]), 2121], + ]; + } + + #[DataProvider('portProvider')] + public function testPort(array $parameters, int $expectedPort): void { + $instance = new FTP($parameters); + + $this->assertSame($expectedPort, self::invokePrivate($instance, 'port')); + } +}