Skip to content

Commit 6166b1e

Browse files
committed
OXDEV-7202 Apply fix for changeUser method
1 parent 796ac6d commit 6166b1e

File tree

5 files changed

+133
-50
lines changed

5 files changed

+133
-50
lines changed

CHANGELOG-7.1.md

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ template extension resolving is already performed in `TemplateRenderer`
2222
### Fixed
2323
- Wrong property "_oUserData" used in ContactController [PR-918](https://github.com/OXID-eSales/oxideshop_ce/pull/918)
2424
- Can't use dot character for template file names
25+
- User registration in the Private Sales mode
2526

2627
### Changed
2728
- Executing `oe-console` command with an invalid `shop-id` value will be interrupted

source/Application/Component/UserComponent.php

+26-32
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use OxidEsales\Eshop\Core\Form\UpdatableFieldsConstructor;
2525
use OxidEsales\Eshop\Core\Registry;
2626
use function array_key_exists;
27+
use function is_array;
2728

2829
// defining login/logout states
2930
define('USER_LOGIN_SUCCESS', 1);
@@ -435,15 +436,8 @@ public function createUser()
435436
$password = Registry::getRequest()->getRequestParameter('lgn_pwd');
436437
$passwordConfirmation = Registry::getRequest()->getRequestParameter('lgn_pwd2');
437438

438-
$billingAddress = Registry::getRequest()->getRequestParameter('invadr');
439-
$billingAddress = $this->cleanAddress($billingAddress, oxNew(UserUpdatableFields::class));
440-
$billingAddress = $this->removeNonAddressFields($billingAddress);
441-
$billingAddress = $this->trimAddress($billingAddress);
442-
443-
$shippingAddress = $this->getDelAddressData();
444-
$shippingAddress = $this->cleanAddress($shippingAddress, oxNew(UserShippingAddressUpdatableFields::class));
445-
$shippingAddress = $this->trimAddress($shippingAddress);
446-
439+
$billingAddress = $this->getBillingAddress();
440+
$shippingAddress = $this->getShippingAddress();
447441
try {
448442
$user = oxNew(User::class);
449443
$user->checkValues($username, $password, $passwordConfirmation, $billingAddress, $shippingAddress);
@@ -656,18 +650,11 @@ protected function changeUserWithoutRedirect()
656650
if (!$user) {
657651
return;
658652
}
659-
660-
$shippingAddress = $this->getDelAddressData();
661-
$shippingAddress = $this->cleanAddress($shippingAddress, oxNew(UserShippingAddressUpdatableFields::class));
662-
$shippingAddress = $this->trimAddress($shippingAddress);
663-
664-
$billingAddress = Registry::getRequest()->getRequestParameter('invadr');
665-
$billingAddress = $this->cleanAddress($billingAddress, oxNew(UserUpdatableFields::class));
666-
$billingAddress = $this->trimAddress($billingAddress);
653+
$shippingAddress = $this->getShippingAddress();
654+
$billingAddress = $this->getBillingAddress();
667655

668656
$username = $user->getFieldData('oxusername');
669657
$password = $user->getFieldData('oxpassword');
670-
671658
try {
672659
$newName = $billingAddress['oxuser__oxusername'] ?? '';
673660
if (
@@ -865,27 +852,17 @@ private function trimAddress($address)
865852
return $address;
866853
}
867854

868-
/**
869-
* @param $user
870-
* @return bool
871-
*/
872855
private function isGuestUser(User $user): bool
873856
{
874857
return empty($user->oxuser__oxpassword->value);
875858
}
876859

877-
/**
878-
* @param $currentName
879-
* @param $newName
880-
* @return bool
881-
*/
882860
private function isUserNameUpdated(string $currentName, string $newName): bool
883861
{
884862
return $currentName && $newName && $currentName !== $newName;
885863
}
886864

887865
/**
888-
* @param string $newName
889866
* @throws Exception
890867
*/
891868
private function deleteExistingGuestUser(string $newName): void
@@ -897,7 +874,24 @@ private function deleteExistingGuestUser(string $newName): void
897874
}
898875
}
899876

900-
private function removeNonAddressFields(array $billingAddress): array
877+
private function getShippingAddress(): array
878+
{
879+
$shippingAddress = $this->getDelAddressData();
880+
$shippingAddress = $this->cleanAddress($shippingAddress, oxNew(UserShippingAddressUpdatableFields::class));
881+
return $this->trimAddress($shippingAddress);
882+
}
883+
884+
private function getBillingAddress(): array
885+
{
886+
$billingAddress = Registry::getRequest()->getRequestParameter('invadr');
887+
$billingAddress = $this->cleanAddress($billingAddress, oxNew(UserUpdatableFields::class));
888+
if ($billingAddress && is_array($billingAddress)) {
889+
$billingAddress = $this->removeNonAddressFields($billingAddress);
890+
}
891+
return (array) $this->trimAddress($billingAddress);
892+
}
893+
894+
private function removeNonAddressFields(array $addressFormData): array
901895
{
902896
$nonAddressFields = [
903897
'oxuser__oxactive',
@@ -908,11 +902,11 @@ private function removeNonAddressFields(array $billingAddress): array
908902
'oxuser__oxupdateexp',
909903
];
910904
foreach ($nonAddressFields as $field) {
911-
if ($billingAddress && array_key_exists($field, $billingAddress)) {
912-
unset($billingAddress[$field]);
905+
if ($addressFormData && array_key_exists($field, $addressFormData)) {
906+
unset($addressFormData[$field]);
913907
}
914908
}
915909

916-
return $billingAddress;
910+
return $addressFormData;
917911
}
918912
}

tests/Integration/Application/Component/UserComponentTest.php

+77-18
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@ public function setUp(): void
2424
{
2525
parent::setUp();
2626

27-
$this->mockSessionChallenge();
27+
$this->mockSession();
2828
Registry::getConfig()->reinitialize();
2929
}
3030

3131
public function testCreateUserWillActivateUserAutomatically(): void
3232
{
33-
$requestData = $this->getUserFormData();
34-
$_POST = array_merge($_POST, $requestData);
33+
$_POST = $this->getUserFormData();
3534

3635
$this->getUserComponent()->createUser();
3736

@@ -41,27 +40,37 @@ public function testCreateUserWillActivateUserAutomatically(): void
4140
public function testCreateUserWithPrivateSalesWillNotActivateUserAutomatically(): void
4241
{
4342
Registry::getConfig()->setConfigParam('blPsLoginEnabled', true);
44-
$requestData = $this->getUserFormData();
45-
$_POST = array_merge($_POST, $requestData);
43+
$_POST = $this->getUserFormData();
4644

4745
$this->getUserComponent()->createUser();
4846

4947
$this->assertEmpty($this->fetchUserData()['OXACTIVE']);
5048
}
5149

52-
public function testCreateUserWithPrivateSalesAndExtraDataInAddressForm(): void
50+
public function testCreateUserWithMissingBillingAddressData(): void
51+
{
52+
$requestData = $this->getUserFormData();
53+
unset($requestData['invadr']);
54+
$_POST = $requestData;
55+
56+
$return = $this->getUserComponent()->createUser();
57+
58+
$this->assertFalse($return);
59+
}
60+
61+
public function testCreateUserWithPrivateSalesAndExtraFormDataWillNotUpdateUserStatus(): void
5362
{
5463
Registry::getConfig()->setConfigParam('blPsLoginEnabled', true);
5564
$requestData = $this->getUserFormData();
5665
$requestData['invadr']['oxuser__oxactive'] = 1;
57-
$_POST = array_merge($_POST, $requestData);
66+
$_POST = $requestData;
5867

5968
$this->getUserComponent()->createUser();
6069

6170
$this->assertEmpty($this->fetchUserData()['OXACTIVE']);
6271
}
6372

64-
public function testCreateUserExtraDataInAddressFormWillNotUpdateNonAddressUserFields(): void
73+
public function testCreateUserWithExtraFormDataWillNotUpdateNonAddressUserFields(): void
6574
{
6675
$wrongShopId = 123;
6776
$wrongUserRights = 'admin';
@@ -80,7 +89,7 @@ public function testCreateUserExtraDataInAddressFormWillNotUpdateNonAddressUserF
8089
$requestData['invadr']['oxuser__oxregister'] = $wrongTimestamp;
8190
$requestData['invadr']['oxuser__oxupdatekey'] = $wrongTimestamp;
8291
$requestData['invadr']['oxuser__oxupdateexp'] = $wrongUpdateExpiration;
83-
$_POST = array_merge($_POST, $requestData);
92+
$_POST = $requestData;
8493

8594
$this->getUserComponent()->createUser();
8695

@@ -96,20 +105,71 @@ public function testCreateUserExtraDataInAddressFormWillNotUpdateNonAddressUserF
96105
$this->assertNotEquals($wrongUpdateExpiration, $userData['OXUPDATEEXP']);
97106
}
98107

99-
private function mockSessionChallenge(): void
108+
public function testChangeUserWithMissingBillingAddressData(): void
100109
{
101-
Registry::set(
102-
Session::class,
103-
$this->createConfiguredMock(
104-
Session::class,
105-
['checkSessionChallenge' => true]
106-
)
107-
);
110+
$_POST = $this->getUserFormData();
111+
$this->getUserComponent()->createUser();
112+
113+
$requestData = $this->getUserFormData();
114+
unset($requestData['invadr']);
115+
$_POST = $requestData;
116+
117+
$return = $this->getUserComponent()->changeUser();
118+
119+
$this->assertFalse($return);
120+
}
121+
122+
public function testChangeUserWithExtraFormDataWillNotUpdateNonAddressUserFields(): void
123+
{
124+
$_POST = $this->getUserFormData();
125+
$this->getUserComponent()->createUser();
126+
127+
$wrongShopId = 123;
128+
$wrongUserRights = 'admin';
129+
$wrongCustomerNumber = 12345;
130+
$wrongPassword = uniqid('some-pass-', true);
131+
$wrongPasswordSalt = uniqid('some-pass-salt-', true);
132+
$wrongTimestamp = '2001-01-01';
133+
$wrongUpdateExpiration = 123;
134+
$requestData = $this->getUserFormData();
135+
$requestData['invadr']['oxuser__oxshopid'] = $wrongShopId;
136+
$requestData['invadr']['oxuser__oxrights'] = $wrongUserRights;
137+
$requestData['invadr']['oxuser__oxcustnr'] = $wrongCustomerNumber;
138+
$requestData['invadr']['oxuser__oxpassword'] = $wrongPassword;
139+
$requestData['invadr']['oxuser__oxpasssalt'] = $wrongPasswordSalt;
140+
$requestData['invadr']['oxuser__oxcreate'] = $wrongTimestamp;
141+
$requestData['invadr']['oxuser__oxregister'] = $wrongTimestamp;
142+
$requestData['invadr']['oxuser__oxupdatekey'] = $wrongTimestamp;
143+
$requestData['invadr']['oxuser__oxupdateexp'] = $wrongUpdateExpiration;
144+
$_POST = $requestData;
145+
146+
$this->getUserComponent()->changeUser();
147+
148+
$userData = $this->fetchUserData();
149+
$this->assertNotEquals($wrongShopId, $userData['OXSHOPID']);
150+
$this->assertNotEquals($wrongUserRights, $userData['OXRIGHTS']);
151+
$this->assertNotEquals($wrongUserRights, $userData['OXCUSTNR']);
152+
$this->assertNotEquals($wrongPassword, $userData['OXPASSWORD']);
153+
$this->assertNotEquals($wrongPasswordSalt, $userData['OXPASSSALT']);
154+
$this->assertNotEquals($wrongTimestamp, $userData['OXCREATE']);
155+
$this->assertNotEquals($wrongTimestamp, $userData['OXREGISTER']);
156+
$this->assertNotEquals($wrongTimestamp, $userData['OXUPDATEKEY']);
157+
$this->assertNotEquals($wrongUpdateExpiration, $userData['OXUPDATEEXP']);
158+
}
159+
160+
private function mockSession(): void
161+
{
162+
$sessionMock = $this->createPartialMock(Session::class, ['checkSessionChallenge']);
163+
$sessionMock
164+
->method('checkSessionChallenge')
165+
->willReturn(true);
166+
Registry::set(Session::class, $sessionMock);
108167
}
109168

110169
private function getUserFormData(): array
111170
{
112171
$password = uniqid('some-string-', true);
172+
113173
return [
114174
'oxuser__oxfname' => uniqid('first-name-', true),
115175
'oxuser__oxlname' => uniqid('last-name-', true),
@@ -125,7 +185,6 @@ private function getUserFormData(): array
125185
'oxuser__oxzip' => 123,
126186
'oxuser__oxcity' => 'Freiburg',
127187
'oxuser__oxcountryid' => 'a7c40f631fc920687.20179984',
128-
// 'oxuser__oxshopid' => 1,
129188
],
130189
];
131190
}

tests/Integration/IntegrationTestCase.php

+4
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@
1212
use OxidEsales\EshopCommunity\Tests\CachingTrait;
1313
use OxidEsales\EshopCommunity\Tests\ContainerTrait;
1414
use OxidEsales\EshopCommunity\Tests\DatabaseTrait;
15+
use OxidEsales\EshopCommunity\Tests\RequestTrait;
1516
use PHPUnit\Framework\TestCase;
1617

1718
class IntegrationTestCase extends TestCase
1819
{
1920
use ContainerTrait;
2021
use CachingTrait;
2122
use DatabaseTrait;
23+
use RequestTrait;
2224

2325
public function setUp(): void
2426
{
2527
parent::setUp();
28+
$this->backupRequestData();
2629
$this->cleanupCaching();
2730
$this->beginTransaction();
2831
}
@@ -31,6 +34,7 @@ public function tearDown(): void
3134
{
3235
$this->rollBackTransaction();
3336
$this->cleanupCaching();
37+
$this->restoreRequestData();
3438
parent::tearDown();
3539
}
3640
}

tests/RequestTrait.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/**
4+
* Copyright © OXID eSales AG. All rights reserved.
5+
* See LICENSE file for license details.
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OxidEsales\EshopCommunity\Tests;
11+
12+
trait RequestTrait
13+
{
14+
private array $post;
15+
16+
public function backupRequestData(): void
17+
{
18+
$this->post = $_POST;
19+
}
20+
21+
public function restoreRequestData(): void
22+
{
23+
$_POST = $this->post;
24+
}
25+
}

0 commit comments

Comments
 (0)