Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ImplicitSslFtpServerFactory
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 3
30
0.00% covered (danger)
0.00%
0 / 1
 createConnector
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 createSslOptions
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
12
 createServer
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace Apie\FtpServer\Factories;
3
4use React\Socket\Connector;
5use React\Socket\ConnectorInterface;
6use React\Socket\SecureConnector;
7use React\Socket\SecureServer;
8use React\Socket\SocketServer;
9
10class ImplicitSslFtpServerFactory implements ServerFactoryInterface
11{
12    public function createConnector(): ConnectorInterface
13    {
14        return new SecureConnector(
15            new Connector(),
16            null,
17            $this->createSslOptions()
18        );
19    }
20
21    /**
22     * @return array<string, mixed>
23     */
24    private function createSslOptions(): array
25    {
26        // TODO: add config to provide your own certificate.
27        $crtFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'server.crt';
28        $keyFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'server.key';
29        if (!file_exists($crtFile) || !file_exists($keyFile)) {
30            $dn = [
31                "commonName" => "localhost",
32            ];
33            $privkey = openssl_pkey_new();
34            $cert = openssl_csr_new($dn, $privkey);
35            $cert = openssl_csr_sign($cert, null, $privkey, 3650);
36            openssl_x509_export($cert, $out);
37            file_put_contents($crtFile, $out);
38            openssl_pkey_export($privkey, $out);
39            file_put_contents($keyFile, $out);
40        }
41        return [
42            'local_cert' => $crtFile,
43            'local_pk' => $keyFile,
44            'allow_self_signed' => true,
45            'verify_peer' => false,
46        ];
47    }
48
49    public function createServer(int $port): SecureServer
50    {
51        
52        return new SecureServer(
53            new SocketServer('0.0.0.0:' . $port),
54            null,
55            $this->createSslOptions()
56        );
57    }
58}