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

Reply via email to