Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
PasvCommand
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 1
 run
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2namespace Apie\FtpServer\Commands;
3
4use Apie\Core\Context\ApieContext;
5use Apie\FtpServer\FtpConstants;
6use Apie\FtpServer\Transfers\PasvTransfer;
7use Apie\FtpServer\Transfers\TransferInterface;
8use React\Socket\ConnectionInterface;
9
10class PasvCommand implements CommandInterface
11{
12    public function run(ApieContext $apieContext, string $arg = ''): ApieContext
13    {
14        $conn = $apieContext->getContext(ConnectionInterface::class);
15        $transfer = $apieContext->getContext(TransferInterface::class, false);
16        if ($transfer instanceof PasvTransfer) {
17            $transfer->end();
18        }
19        $transfer = new PasvTransfer(
20            $apieContext->getContext(FtpConstants::PASV_MIN_PORT, false) ?? '49152',
21            $apieContext->getContext(FtpConstants::PASV_MAX_PORT, false) ?? '65534',
22        );
23        $address = $transfer->getAddress();
24        $port = parse_url($address, PHP_URL_PORT);
25        $ip = str_replace(
26            '.',
27            ',',
28            $apieContext->getContext(FtpConstants::PUBLIC_IP, false) ?? '127.0.0.1'
29        );
30        $p1 = intdiv($port, 256);
31        $p2 = $port % 256;
32
33        $conn->write("227 Entering Passive Mode ($ip,$p1,$p2)\r\n");
34
35        return $apieContext->withContext(TransferInterface::class, $transfer);
36    }
37}