Skip to content

Commit

Permalink
constants are scalars, can be securely serialized
Browse files Browse the repository at this point in the history
  • Loading branch information
juliangut committed Mar 7, 2020
1 parent 9a22205 commit 723433c
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 24 deletions.
43 changes: 31 additions & 12 deletions src/AbstractEnum.php
Expand Up @@ -143,34 +143,53 @@ final public function getValue()
}

/**
* @return string[]
* @return array<string, mixed>
*/
final public function __sleep(): array
final public function __serialize(): array
{
throw new EnumException(\sprintf('Enum "%s" cannot be serialized', static::class));
return ['value' => $this->value];
}

final public function __wakeup(): void
/**
* @param array<string, mixed> $data
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
final public function __unserialize(array $data): void
{
throw new EnumException(\sprintf('Enum "%s" cannot be unserialized', static::class));
$this->assertImmutable();
$this->assertFinal();

$value = $data['value'];

$this->checkValue($value);

$this->value = $value;
}

/**
* @return array<string, mixed>
* {@inheritdoc}
*/
final public function __serialize(): array
final public function serialize(): string
{
throw new EnumException(\sprintf('Enum "%s" cannot be serialized', static::class));
return \serialize($this->value);
}

/**
* @param array<string, mixed> $data
* {@inheritdoc}
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
* @param mixed $serialized
*/
final public function __unserialize(array $data): void
public function unserialize($serialized): void
{
throw new EnumException(\sprintf('Enum "%s" cannot be unserialized', static::class));
$this->assertImmutable();
$this->assertFinal();

$value = \unserialize($serialized, ['allowed_classes' => false]);

$this->checkValue($value);

$this->value = $value;
}

final public function __clone()
Expand Down
2 changes: 1 addition & 1 deletion src/Enum.php
Expand Up @@ -16,7 +16,7 @@
/**
* Enum interface.
*/
interface Enum
interface Enum extends \Serializable
{
/**
* Check enum equality.
Expand Down
18 changes: 7 additions & 11 deletions tests/Enum/AbstractEnumTest.php
Expand Up @@ -116,20 +116,16 @@ public function testStaticCreation(): void
static::assertFalse($stub->isAnyOf([OrdinalEnumStub::VALUE_TWO(), OrdinalEnumStub::VALUE_THREE()]));
}

public function testNoSerialization(): void
public function testSerialization(): void
{
$this->expectException(EnumException::class);
$this->expectExceptionMessage('Enum "Gears\Enum\Tests\Stub\OrdinalEnumStub" cannot be serialized');

\serialize(OrdinalEnumStub::VALUE_ONE());
}
$stub = OrdinalEnumStub::VALUE_ONE();

public function testNoDeserialization(): void
{
$this->expectException(EnumException::class);
$this->expectExceptionMessage('Enum "Gears\Enum\Tests\Stub\OrdinalEnumStub" cannot be unserialized');
$serialized = \version_compare(\PHP_VERSION, '7.4.0') >= 0
? 'O:37:"Gears\Enum\Tests\Stub\OrdinalEnumStub":1:{s:5:"value";s:3:"one";}'
: 'C:37:"Gears\Enum\Tests\Stub\OrdinalEnumStub":10:{s:3:"one";}';

\unserialize('O:37:"Gears\Enum\Tests\Stub\OrdinalEnumStub":0:{}');
static::assertSame($serialized, \serialize($stub));
static::assertSame('one', (\unserialize($serialized))->getValue());
}

public function testClone(): void
Expand Down

0 comments on commit 723433c

Please sign in to comment.