Skip to content

Commit

Permalink
EZP-29096: Do not store empty draft values in DB (#1417)
Browse files Browse the repository at this point in the history
* EZP-29096: Do not store empty draft values in DB
  • Loading branch information
pkamps authored and andrerom committed Mar 11, 2019
1 parent 8608700 commit 1adb33d
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 36 deletions.
18 changes: 16 additions & 2 deletions kernel/classes/datatypes/ezuser/ezuser.php
Original file line number Diff line number Diff line change
Expand Up @@ -225,15 +225,24 @@ static function create( $contentObjectID )
return new eZUser( $row );
}

function store( $fieldFilters = null )
/**
* Only stores the entry if it has a Login value
*
* @param mixed|null $fieldFilters
*/
public function store( $fieldFilters = null )
{
$this->Email = trim( $this->Email );
$userID = $this->attribute( 'contentobject_id' );
// Clear memory cache
unset( $GLOBALS['eZUserObject_' . $userID] );
$GLOBALS['eZUserObject_' . $userID] = $this;
self::purgeUserCacheByUserId( $userID );
parent::store( $fieldFilters );

if ( $this->Login )
{
parent::store( $fieldFilters );
}
}

function originalPassword()
Expand Down Expand Up @@ -307,6 +316,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 )
Expand Down
37 changes: 27 additions & 10 deletions kernel/classes/datatypes/ezuser/ezusertype.php
Original file line number Diff line number Diff line change
Expand Up @@ -258,10 +258,22 @@ function storeObjectAttribute( $contentObjectAttribute )
}

// saving information in the object attribute data_text field to simulate a draft
$contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) );
// only if the object version is a draft
if (
$user->Login &&
$contentObjectAttribute->attribute( 'object_version' )->attribute( 'status' ) == eZContentObjectVersion::STATUS_DRAFT
)
{
$contentObjectAttribute->setAttribute( 'data_text', $this->serializeDraft( $user ) );
}
}
}

/**
* @param $contentObjectAttribute
* @param eZContentObject $contentObject
* @param $publishedNodes
*/
function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes )
{
/** @var eZContentObjectAttribute $contentObjectAttribute */
Expand All @@ -274,10 +286,13 @@ function onPublish( $contentObjectAttribute, $contentObject, $publishedNodes )
if ( !empty( $serializedDraft ) )
{
$user = $this->updateUserDraft( $user, $serializedDraft );
}
$user->store();
$contentObjectAttribute->setContent( $user );

$user->store();
$contentObjectAttribute->setContent( $user );
// Clear draft info
$contentObjectAttribute->setAttribute( 'data_text', '' );
$contentObjectAttribute->store();
}
}

/**
Expand Down Expand Up @@ -320,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;
}
Expand Down Expand Up @@ -360,11 +378,10 @@ function objectAttributeContent( $contentObjectAttribute )
$GLOBALS['eZUserObject_' . $userID] = eZUser::fetch( $userID );
}

/** @var eZUser $user */
$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 ) )
Expand Down
38 changes: 14 additions & 24 deletions tests/tests/kernel/datatypes/ezuser/ezusertype_regression.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' );
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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,
Expand All @@ -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
*/
Expand Down

0 comments on commit 1adb33d

Please sign in to comment.