Skip to content

Commit 2239781

Browse files
authored
Merge pull request #454 from AndreRudolph/3.x
#453: Introduced native tls support
2 parents b9ee63c + 6995565 commit 2239781

File tree

7 files changed

+116
-13
lines changed

7 files changed

+116
-13
lines changed

config/services.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ services:
374374
- '@gos_web_socket.server.builder'
375375
- '@gos_web_socket.server.event_loop'
376376
- '@event_dispatcher'
377+
- '%gos_web_socket.server.tls.enabled%'
378+
- '%gos_web_socket.server.tls.options%'
377379
calls:
378380
- [ setLogger, ['@logger'] ]
379381
tags:

docs/config.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,17 @@ gos_web_socket:
5050
# The port on the server which connections for the websocket server are accepted.
5151
port: ~ # Required
5252

53+
tls:
54+
55+
# Enables the native tls support that can be configured with the options below.
56+
enabled: false
57+
58+
# The options to set up the tls configuration. See the example below or see https://www.php.net/manual/en/context.ssl.php for all available options.
59+
options:
60+
local_cert: '/path/to/cert/cert.crt'
61+
local_pk: '/path/to/key/mykey.key'
62+
verify_peer: false
63+
5364
# Enables checking the Origin header of websocket connections for allowed values.
5465
origin_check: false
5566

src/DependencyInjection/Configuration.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,19 @@ private function addServerSection(ArrayNodeDefinition $rootNode): void
198198
->isRequired()
199199
->info('The port on the server which connections for the websocket server are accepted.')
200200
->end()
201+
->arrayNode('tls')
202+
->addDefaultsIfNotSet()
203+
->children()
204+
->booleanNode('enabled')
205+
->info('Enables native TLS support.')
206+
->defaultFalse()
207+
->end()
208+
->variableNode('options')
209+
->info('An array of options for the TLS context, see https://www.php.net/manual/en/context.ssl.php for available options.')
210+
->defaultValue([])
211+
->end()
212+
->end()
213+
->end()
201214
->booleanNode('origin_check')
202215
->defaultFalse()
203216
->info('Enables checking the Origin header of websocket connections for allowed values.')

src/DependencyInjection/GosWebSocketExtension.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ private function registerServerConfiguration(array $config, ContainerBuilder $co
277277
{
278278
$container->setParameter('gos_web_socket.server.port', $config['server']['port']);
279279
$container->setParameter('gos_web_socket.server.host', $config['server']['host']);
280+
$container->setParameter('gos_web_socket.server.tls.enabled', $config['server']['tls']['enabled']);
281+
$container->setParameter('gos_web_socket.server.tls.options', $config['server']['tls']['options']);
280282
$container->setParameter('gos_web_socket.server.origin_check', $config['server']['origin_check']);
281283
$container->setParameter('gos_web_socket.server.ip_address_check', $config['server']['ip_address_check']);
282284
$container->setParameter('gos_web_socket.server.keepalive_ping', $config['server']['keepalive_ping']);

src/Server/Type/WebSocketServer.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Psr\Log\LoggerAwareTrait;
1010
use Ratchet\Server\IoServer;
1111
use React\EventLoop\LoopInterface;
12+
use React\Socket\SecureServer;
1213
use React\Socket\SocketServer;
1314
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
1415

@@ -22,15 +23,21 @@ final class WebSocketServer implements ServerInterface, LoggerAwareInterface
2223
private ServerBuilderInterface $serverBuilder;
2324
private LoopInterface $loop;
2425
private EventDispatcherInterface $eventDispatcher;
26+
private bool $tlsEnabled;
27+
private array $tlsOptions;
2528

2629
public function __construct(
2730
ServerBuilderInterface $serverBuilder,
2831
LoopInterface $loop,
29-
EventDispatcherInterface $eventDispatcher
32+
EventDispatcherInterface $eventDispatcher,
33+
bool $tlsEnabled = false,
34+
array $tlsOptions = []
3035
) {
3136
$this->serverBuilder = $serverBuilder;
3237
$this->loop = $loop;
3338
$this->eventDispatcher = $eventDispatcher;
39+
$this->tlsEnabled = $tlsEnabled;
40+
$this->tlsOptions = $tlsOptions;
3441
}
3542

3643
public function launch(string $host, int $port, bool $profile): void
@@ -41,6 +48,10 @@ public function launch(string $host, int $port, bool $profile): void
4148

4249
$server = new SocketServer("$host:$port", [], $this->loop);
4350

51+
if ($this->tlsEnabled) {
52+
$server = new SecureServer($server, $this->loop, $this->tlsOptions);
53+
}
54+
4455
$app = new IoServer(
4556
$this->serverBuilder->buildMessageStack(),
4657
$server,

tests/DependencyInjection/ConfigurationTest.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ public function testConfigWithAServer(): void
246246
'server' => [
247247
'host' => '127.0.0.1',
248248
'port' => 8080,
249+
'tls' => [
250+
'enabled' => false,
251+
'options' => [],
252+
],
249253
'origin_check' => false,
250254
'ip_address_check' => false,
251255
'keepalive_ping' => false,
@@ -283,6 +287,10 @@ public function testConfigWithAServerAndPubSubRouterWithoutArrayResources(): voi
283287
'server' => [
284288
'host' => '127.0.0.1',
285289
'port' => 8080,
290+
'tls' => [
291+
'enabled' => false,
292+
'options' => [],
293+
],
286294
'origin_check' => false,
287295
'ip_address_check' => false,
288296
'keepalive_ping' => false,
@@ -312,6 +320,10 @@ public function testConfigWithAServerAndPubSubRouterWithArrayResources(): void
312320
'server' => [
313321
'host' => '127.0.0.1',
314322
'port' => 8080,
323+
'tls' => [
324+
'enabled' => false,
325+
'options' => [],
326+
],
315327
'origin_check' => false,
316328
'ip_address_check' => false,
317329
'keepalive_ping' => false,
@@ -335,12 +347,43 @@ public function testConfigWithAServerAndPubSubRouterWithArrayResources(): void
335347
);
336348
}
337349

350+
public function testConfigWithServerAndTlsEnabled(): void
351+
{
352+
$extraConfig = [
353+
'server' => [
354+
'host' => '127.0.0.1',
355+
'port' => 8080,
356+
'tls' => [
357+
'enabled' => true,
358+
'options' => [
359+
'verify_peer' => false,
360+
],
361+
],
362+
'origin_check' => false,
363+
'ip_address_check' => false,
364+
'keepalive_ping' => false,
365+
'keepalive_interval' => 30,
366+
],
367+
];
368+
369+
$config = (new Processor())->processConfiguration(new Configuration([]), [$extraConfig]);
370+
371+
self::assertEquals(
372+
array_merge(self::getBundleDefaultConfig(), $extraConfig),
373+
$config
374+
);
375+
}
376+
338377
public function testConfigWithAllowedOriginsList(): void
339378
{
340379
$extraConfig = [
341380
'server' => [
342381
'host' => '127.0.0.1',
343382
'port' => 8080,
383+
'tls' => [
384+
'enabled' => false,
385+
'options' => [],
386+
],
344387
'origin_check' => true,
345388
'ip_address_check' => false,
346389
'keepalive_ping' => false,
@@ -388,6 +431,10 @@ public function testConfigWithBlockedIpAddressList(): void
388431
'server' => [
389432
'host' => '127.0.0.1',
390433
'port' => 8080,
434+
'tls' => [
435+
'enabled' => false,
436+
'options' => [],
437+
],
391438
'origin_check' => false,
392439
'ip_address_check' => true,
393440
'keepalive_ping' => false,
@@ -554,6 +601,10 @@ protected static function getBundleDefaultConfig(): array
554601
],
555602
'shared_config' => true,
556603
'server' => [
604+
'tls' => [
605+
'enabled' => false,
606+
'options' => [],
607+
],
557608
'origin_check' => false,
558609
'ip_address_check' => false,
559610
'keepalive_ping' => false,

tests/Server/Type/WebSocketServerTest.php

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,18 @@ class WebSocketServerTest extends TestCase
2929
*/
3030
private $eventDispatcher;
3131

32-
/**
33-
* @var WebSocketServer
34-
*/
35-
private $server;
36-
3732
protected function setUp(): void
3833
{
3934
parent::setUp();
4035

4136
$this->serverBuilder = $this->createMock(ServerBuilderInterface::class);
4237
$this->loop = $this->createMock(LoopInterface::class);
4338
$this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
44-
45-
$this->server = new WebSocketServer(
46-
$this->serverBuilder,
47-
$this->loop,
48-
$this->eventDispatcher
49-
);
5039
}
5140

41+
/**
42+
* @runInSeparateProcess
43+
*/
5244
public function testTheServerIsLaunched(): void
5345
{
5446
$this->serverBuilder->expects(self::once())
@@ -62,6 +54,27 @@ public function testTheServerIsLaunched(): void
6254
$this->loop->expects(self::once())
6355
->method('run');
6456

65-
$this->server->launch('127.0.0.1', 1337, false);
57+
(new WebSocketServer($this->serverBuilder, $this->loop, $this->eventDispatcher))
58+
->launch('127.0.0.1', 1337, false);
59+
}
60+
61+
/**
62+
* @runInSeparateProcess
63+
*/
64+
public function testTheServerIsLaunchedWithTlsSupport(): void
65+
{
66+
$this->serverBuilder->expects(self::once())
67+
->method('buildMessageStack')
68+
->willReturn($this->createMock(MessageComponentInterface::class));
69+
70+
$this->eventDispatcher->expects(self::once())
71+
->method('dispatch')
72+
->with(self::isInstanceOf(ServerLaunchedEvent::class), GosWebSocketEvents::SERVER_LAUNCHED);
73+
74+
$this->loop->expects(self::once())
75+
->method('run');
76+
77+
(new WebSocketServer($this->serverBuilder, $this->loop, $this->eventDispatcher, true, ['verify_peer' => false]))
78+
->launch('127.0.0.1', 1337, false);
6679
}
6780
}

0 commit comments

Comments
 (0)