feat: add secure on-demand HLS playback plugin

This commit is contained in:
root
2026-09-04 20:23:10 +02:00
commit 6fae6a3a43
35 changed files with 2283 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace Plugin\AzuraCastOnDemandHls\Tests\Security;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use Plugin\AzuraCastOnDemandHls\Security\OpaqueToken;
#[CoversClass(OpaqueToken::class)]
final class OpaqueTokenTest extends TestCase
{
public function testGeneratedTokensAreOpaqueValidAndUnique(): void
{
$tokens = [];
for ($i = 0; $i < 100; ++$i) {
$token = OpaqueToken::generate();
self::assertTrue(OpaqueToken::isValid($token));
self::assertSame(43, strlen($token));
$tokens[] = $token;
}
self::assertCount(100, array_unique($tokens));
}
public function testMalformedTokensAreRejected(): void
{
foreach (['', 'short', str_repeat('a', 42), str_repeat('a', 44), str_repeat('.', 43), '../' . str_repeat('a', 40), str_repeat('a', 42) . '='] as $token) {
self::assertFalse(OpaqueToken::isValid($token), $token);
}
}
public function testMutationChangesStoredIdentifier(): void
{
$token = OpaqueToken::generate();
$replacement = 'A' === $token[0] ? 'B' : 'A';
$mutated = $replacement . substr($token, 1);
self::assertNotSame(OpaqueToken::id($token), OpaqueToken::id($mutated));
}
}