From dad3fcc7fc724e45ef0935133d1f54d5f8cd9512 Mon Sep 17 00:00:00 2001 From: pkamps Date: Thu, 17 Jan 2019 11:39:21 +0100 Subject: [PATCH 01/11] EZP-29096: Do not store empty draft values in DB --- kernel/classes/datatypes/ezuser/ezuser.php | 11 ++++++++++- kernel/classes/datatypes/ezuser/ezusertype.php | 6 ++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kernel/classes/datatypes/ezuser/ezuser.php b/kernel/classes/datatypes/ezuser/ezuser.php index b19fdd26196..52d1bcf1b4c 100644 --- a/kernel/classes/datatypes/ezuser/ezuser.php +++ b/kernel/classes/datatypes/ezuser/ezuser.php @@ -233,7 +233,11 @@ function store( $fieldFilters = null ) unset( $GLOBALS['eZUserObject_' . $userID] ); $GLOBALS['eZUserObject_' . $userID] = $this; self::purgeUserCacheByUserId( $userID ); - parent::store( $fieldFilters ); + + if( $this->Login ) + { + parent::store( $fieldFilters ); + } } function originalPassword() @@ -307,6 +311,11 @@ function setInformation( $id, $login, $email, $password, $passwordConfirm = fals } } + /** + * @param integer $id + * @param bool $asObject + * @return eZUser|null + */ static function fetch( $id, $asObject = true ) { if ( !$id ) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 5f0554dbf0f..85b1c228671 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -258,7 +258,10 @@ function storeObjectAttribute( $contentObjectAttribute ) } // saving information in the object attribute data_text field to simulate a draft - $contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) ); + if( $user->Login ) + { + $contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) ); + } } } @@ -360,7 +363,6 @@ function objectAttributeContent( $contentObjectAttribute ) $GLOBALS['eZUserObject_' . $userID] = eZUser::fetch( $userID ); } - /** @var eZUser $user */ $user = eZUser::fetch( $userID ); eZDebugSetting::writeDebug( 'kernel-user', $user, 'user' ); From 04ff14cdf9d7bcd087a6d4603b3ca598c4835541 Mon Sep 17 00:00:00 2001 From: pkamps Date: Tue, 22 Jan 2019 21:57:33 +0100 Subject: [PATCH 02/11] Only store data if a serialized draft exists - makes unit tests happy --- kernel/classes/datatypes/ezuser/ezusertype.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 85b1c228671..b037301f32c 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -277,10 +277,9 @@ function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes ) if ( !empty( $serializedDraft ) ) { $user = $this->updateUserDraft( $user, $serializedDraft ); + $user->store(); + $contentObjectAttribute->setContent( $user ); } - - $user->store(); - $contentObjectAttribute->setContent( $user ); } /** From 2503777448cae3b1d39d039d5876466de4cf71da Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Tue, 22 Jan 2019 21:58:03 +0100 Subject: [PATCH 03/11] Update kernel/classes/datatypes/ezuser/ezuser.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezuser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezuser.php b/kernel/classes/datatypes/ezuser/ezuser.php index 52d1bcf1b4c..8547057cbcb 100644 --- a/kernel/classes/datatypes/ezuser/ezuser.php +++ b/kernel/classes/datatypes/ezuser/ezuser.php @@ -234,7 +234,7 @@ function store( $fieldFilters = null ) $GLOBALS['eZUserObject_' . $userID] = $this; self::purgeUserCacheByUserId( $userID ); - if( $this->Login ) + if ( $this->Login ) { parent::store( $fieldFilters ); } From 2d418d3f7157b362b14dfd7cb27093984a92480c Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Tue, 22 Jan 2019 21:58:12 +0100 Subject: [PATCH 04/11] Update kernel/classes/datatypes/ezuser/ezusertype.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezusertype.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index b037301f32c..0fb4e608f76 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -258,7 +258,7 @@ function storeObjectAttribute( $contentObjectAttribute ) } // saving information in the object attribute data_text field to simulate a draft - if( $user->Login ) + if ( $user->Login ) { $contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) ); } From 40820c8bf9a8653c7ef38f93ddfd72c5cbc9c238 Mon Sep 17 00:00:00 2001 From: pkamps Date: Mon, 4 Feb 2019 18:04:58 +0100 Subject: [PATCH 05/11] Using draft data only on drafts, adjusting unit tests --- kernel/classes/datatypes/ezuser/ezuser.php | 7 +++- .../classes/datatypes/ezuser/ezusertype.php | 28 +++++++++++--- kernel/user/ezuseroperationcollection.php | 2 +- .../ezuser/ezusertype_regression.php | 38 +++++++------------ 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/kernel/classes/datatypes/ezuser/ezuser.php b/kernel/classes/datatypes/ezuser/ezuser.php index 52d1bcf1b4c..ade41828d8f 100644 --- a/kernel/classes/datatypes/ezuser/ezuser.php +++ b/kernel/classes/datatypes/ezuser/ezuser.php @@ -225,7 +225,12 @@ static function create( $contentObjectID ) return new eZUser( $row ); } - function store( $fieldFilters = null ) + /** + * Only stores the entry if it has a Login value + * + * @param null $fieldFilters + */ + public function store( $fieldFilters = null ) { $this->Email = trim( $this->Email ); $userID = $this->attribute( 'contentobject_id' ); diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index b037301f32c..2292bfeec38 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -258,13 +258,22 @@ function storeObjectAttribute( $contentObjectAttribute ) } // saving information in the object attribute data_text field to simulate a draft - if( $user->Login ) + // only if the object version is a draft (status == 0) + if( + $user->Login && + $contentObjectAttribute->attribute( 'object_version' )->attribute( 'status' ) == 0 + ) { $contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) ); } } } + /** + * @param $contentObjectAttribute + * @param eZContentObject $contentObject + * @param $publishedNodes + */ function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes ) { /** @var eZContentObjectAttribute $contentObjectAttribute */ @@ -279,6 +288,10 @@ function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes ) $user = $this->updateUserDraft( $user, $serializedDraft ); $user->store(); $contentObjectAttribute->setContent( $user ); + + // Clear draft info + $contentObjectAttribute->setAttribute( 'data_text', '' ); + $contentObjectAttribute->store(); } } @@ -322,10 +335,13 @@ private function updateUserDraft( eZUser $user, $serializedDraft ) { $draft = $this->unserializeDraft( $serializedDraft ); - $user->setAttribute( 'login', $draft->login ); - $user->setAttribute( 'password_hash', $draft->password_hash ); - $user->setAttribute( 'email', $draft->email ); - $user->setAttribute( 'password_hash_type', $draft->password_hash_type ); + if( $draft ) + { + $user->setAttribute( 'login', $draft->login ); + $user->setAttribute( 'password_hash', $draft->password_hash ); + $user->setAttribute( 'email', $draft->email ); + $user->setAttribute( 'password_hash_type', $draft->password_hash_type ); + } return $user; } @@ -365,7 +381,7 @@ function objectAttributeContent( $contentObjectAttribute ) $user = eZUser::fetch( $userID ); eZDebugSetting::writeDebug( 'kernel-user', $user, 'user' ); - // Looking for a "draft" and loading it's content + //Looking for a "draft" and loading it's content $serializedDraft = $contentObjectAttribute->attribute( 'data_text' ); if ( !empty( $serializedDraft ) ) diff --git a/kernel/user/ezuseroperationcollection.php b/kernel/user/ezuseroperationcollection.php index c3f5d619059..5f878afc9e3 100644 --- a/kernel/user/ezuseroperationcollection.php +++ b/kernel/user/ezuseroperationcollection.php @@ -297,7 +297,7 @@ static public function activation( $userID, $userHash, $enableUser = false ) } /** - * Change user password + * Change user password for an existing user * * @param int $userID * @param string $newPassword diff --git a/tests/tests/kernel/datatypes/ezuser/ezusertype_regression.php b/tests/tests/kernel/datatypes/ezuser/ezusertype_regression.php index 358bdd1d094..512166a411a 100644 --- a/tests/tests/kernel/datatypes/ezuser/ezusertype_regression.php +++ b/tests/tests/kernel/datatypes/ezuser/ezusertype_regression.php @@ -38,11 +38,16 @@ public function setUp() 'parent_node_id' => $ini->variable( 'UserSettings', 'DefaultUserPlacement' ), 'attributes' => array( 'first_name' => 'foo', - 'last_name' => 'bar' ), + 'last_name' => 'bar', + 'user_account' => "{$this->userLogin}|{$this->userEmail}|1234|md5_password|0", + ), ); $contentObject = eZContentFunctions::createAndPublishObject( $params ); + // Re-fetch to get the object after it was published + $contentObject = eZContentObject::fetch( $contentObject->ID ); + if( !$contentObject instanceof eZContentObject ) { die( 'Impossible to create user object' ); @@ -110,8 +115,9 @@ public function testFromStringHandlesDisabledAccount() $userAccount = $dataMap['user_account']->fromString( join( '|', array( $tmpLogin, $tmpEmail, self::USER_PASSWORD_HASH, self::USER_PASSWORD_HASH_ID, 0 ) ) ); - $userAccount->store(); + $dataMap['user_account']->setContent( $userAccount ); + $dataMap['user_account']->store(); $tempObject = eZContentObject::fetch( $this->userObject->attribute( 'id' ) ); $dataMap = $tempObject->dataMap(); @@ -151,8 +157,9 @@ public function testFromStringHandlesEnabledAccount() $userAccount = $dataMap['user_account']->fromString( join( '|', array( $tmpLogin, $tmpEmail, self::USER_PASSWORD_HASH, self::USER_PASSWORD_HASH_ID, 1 ) ) ); - $userAccount->store(); + $dataMap['user_account']->setContent( $userAccount ); + $dataMap['user_account']->store(); $tempObject = eZContentObject::fetch( $this->userObject->attribute( 'id' ) ); $dataMap = $tempObject->dataMap(); @@ -188,11 +195,13 @@ public function testUpdatePasswordUpdatesSerializedData() { $userId = $this->userObject->attribute('id'); - $passwordHash = $this->getSerializedPasswordHash($this->userObject); + $user = ezuser::fetch( $userId ); + $passwordHash = $user->PasswordHash; eZUserOperationCollection::password($userId, 'newpassword'); - $updatedPasswordHash = $this->getSerializedPasswordHash( eZContentObject::fetch($userId) ); + $user = ezuser::fetch( $userId ); + $updatedPasswordHash = $user->PasswordHash; self::assertNotEquals( $passwordHash, @@ -201,25 +210,6 @@ public function testUpdatePasswordUpdatesSerializedData() ); } - /** - * @param \eZContentObject $userObject - * - * @return string The serialized password hash, or null if none is set - */ - private function getSerializedPasswordHash(eZContentObject $userObject) - { - $dataMap = $userObject->dataMap(); - - $userAccountAttributeText = $dataMap['user_account']->attribute('data_text'); - - // empty on initial version - if (!empty($userAccountAttributeText)) { - return json_decode($userAccountAttributeText)->password_hash; - } - - return null; - } - /** * Enables the current user */ From 78d897cf371c0d4ce76e88d073d977ccdcd41eeb Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Wed, 20 Feb 2019 16:17:02 +0100 Subject: [PATCH 06/11] Update kernel/classes/datatypes/ezuser/ezusertype.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezusertype.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 2292bfeec38..51ea8d9b602 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -259,7 +259,7 @@ function storeObjectAttribute( $contentObjectAttribute ) // saving information in the object attribute data_text field to simulate a draft // only if the object version is a draft (status == 0) - if( + if ( $user->Login && $contentObjectAttribute->attribute( 'object_version' )->attribute( 'status' ) == 0 ) From dba4aeda9985c54cab372390226c3aaea2a2d702 Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Wed, 20 Feb 2019 16:19:04 +0100 Subject: [PATCH 07/11] Update kernel/classes/datatypes/ezuser/ezusertype.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezusertype.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 51ea8d9b602..3c40108bbbb 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -335,7 +335,7 @@ private function updateUserDraft( eZUser $user, $serializedDraft ) { $draft = $this->unserializeDraft( $serializedDraft ); - if( $draft ) + if ( $draft ) { $user->setAttribute( 'login', $draft->login ); $user->setAttribute( 'password_hash', $draft->password_hash ); From beab2f9af6d535cfae6f65a3afcff57d4c056cac Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Wed, 20 Feb 2019 16:19:51 +0100 Subject: [PATCH 08/11] Update kernel/classes/datatypes/ezuser/ezusertype.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezusertype.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 3c40108bbbb..0634d510561 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -381,7 +381,7 @@ function objectAttributeContent( $contentObjectAttribute ) $user = eZUser::fetch( $userID ); eZDebugSetting::writeDebug( 'kernel-user', $user, 'user' ); - //Looking for a "draft" and loading it's content + //Looking for a "draft" and loading its content $serializedDraft = $contentObjectAttribute->attribute( 'data_text' ); if ( !empty( $serializedDraft ) ) From 97a6d3a58da678bd4ba658acf320dc1f76164d21 Mon Sep 17 00:00:00 2001 From: Gunnstein Lye Date: Wed, 20 Feb 2019 16:20:29 +0100 Subject: [PATCH 09/11] Update kernel/classes/datatypes/ezuser/ezuser.php Co-Authored-By: pkamps --- kernel/classes/datatypes/ezuser/ezuser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/classes/datatypes/ezuser/ezuser.php b/kernel/classes/datatypes/ezuser/ezuser.php index 0051f1d6472..5eba4218719 100644 --- a/kernel/classes/datatypes/ezuser/ezuser.php +++ b/kernel/classes/datatypes/ezuser/ezuser.php @@ -228,7 +228,7 @@ static function create( $contentObjectID ) /** * Only stores the entry if it has a Login value * - * @param null $fieldFilters + * @param mixed|null $fieldFilters */ public function store( $fieldFilters = null ) { From 9f5d6af2e521c12ce0ca2162ded41e72e73354e8 Mon Sep 17 00:00:00 2001 From: pkamps Date: Wed, 20 Feb 2019 16:26:45 +0100 Subject: [PATCH 10/11] Reverting function description changes --- kernel/user/ezuseroperationcollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/user/ezuseroperationcollection.php b/kernel/user/ezuseroperationcollection.php index 5f878afc9e3..c3f5d619059 100644 --- a/kernel/user/ezuseroperationcollection.php +++ b/kernel/user/ezuseroperationcollection.php @@ -297,7 +297,7 @@ static public function activation( $userID, $userHash, $enableUser = false ) } /** - * Change user password for an existing user + * Change user password * * @param int $userID * @param string $newPassword From 112b00bda499078f71d7fca14a2c2556c2ae5c59 Mon Sep 17 00:00:00 2001 From: pkamps Date: Thu, 28 Feb 2019 08:18:00 +0100 Subject: [PATCH 11/11] Replacing '0' with eZContentObjectVersion::STATUS_DRAFT --- kernel/classes/datatypes/ezuser/ezusertype.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/classes/datatypes/ezuser/ezusertype.php b/kernel/classes/datatypes/ezuser/ezusertype.php index 0634d510561..1f4d38aee9c 100644 --- a/kernel/classes/datatypes/ezuser/ezusertype.php +++ b/kernel/classes/datatypes/ezuser/ezusertype.php @@ -258,10 +258,10 @@ function storeObjectAttribute( $contentObjectAttribute ) } // saving information in the object attribute data_text field to simulate a draft - // only if the object version is a draft (status == 0) + // only if the object version is a draft if ( $user->Login && - $contentObjectAttribute->attribute( 'object_version' )->attribute( 'status' ) == 0 + $contentObjectAttribute->attribute( 'object_version' )->attribute( 'status' ) == eZContentObjectVersion::STATUS_DRAFT ) { $contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) );