MaxSem has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/335101 )
Change subject: [WIP][POC] Automatic serialization guard trait ...................................................................... [WIP][POC] Automatic serialization guard trait Bug: T156541 Change-Id: Ib3d24da9cb29b6c0ca1f2c9033f7d206f771d2d8 --- A includes/SafeSerializable.php A includes/SerializationChangedException.php 2 files changed, 48 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/01/335101/1 diff --git a/includes/SafeSerializable.php b/includes/SafeSerializable.php new file mode 100644 index 0000000..b15cfea --- /dev/null +++ b/includes/SafeSerializable.php @@ -0,0 +1,41 @@ +<?php + +trait SafeSerializable { + + private $serializationId; + + public function __construct() { + $this->serializationId = $this->getSerializationId(); + } + + public function __wakeup() { + if ( $this->serializationId !== $this->getSerializationId() ) { + throw new SerializationChangedException( static::class ); + } + if ( $this->serializationId === null ) { + throw new Exception( static::class . ' deserialized with a null serializationId' ); + } + } + + public function getSerializationId() { + static $cachedId; + + if ( $cachedId === null ) { + $this->serializationId = $cachedId = $this->generateSerializationId(); + } + + return $this->serializationId; + } + + private function generateSerializationId() { + $className = static::class; + $classNameLen = strlen( $className ); + + // Create a blank copy of the current class + $serialization = "0:$classNameLen:\"$className\":0:{}"; + + $serialization = serialize( unserialize( $serialization ) ); + + return md5( $serialization ); + } +} diff --git a/includes/SerializationChangedException.php b/includes/SerializationChangedException.php new file mode 100644 index 0000000..0794382 --- /dev/null +++ b/includes/SerializationChangedException.php @@ -0,0 +1,7 @@ +<?php + +class SerializationChangedException extends Exception { + public function __construct( $className ) { + parent::__construct( "Serialization of class '$className' has changed" ); + } +} -- To view, visit https://gerrit.wikimedia.org/r/335101 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib3d24da9cb29b6c0ca1f2c9033f7d206f771d2d8 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: MaxSem <maxsem.w...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits