Skip to content

Commit 1c122d7

Browse files
committed
Fix compatibility
1 parent 6d28a6d commit 1c122d7

2 files changed

Lines changed: 74 additions & 10 deletions

File tree

yii2-adapter/legacy/services/Elements.php

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,7 @@ public function propagateElement(
15551555
*/
15561556
public function canView(ElementInterface $element, ?User $user = null): bool
15571557
{
1558-
return Gate::forUser($user)->check('view', $element);
1558+
return $this->_checkAuthorization($element, 'view', $user);
15591559
}
15601560

15611561
/**
@@ -1570,7 +1570,7 @@ public function canView(ElementInterface $element, ?User $user = null): bool
15701570
*/
15711571
public function canSave(ElementInterface $element, ?User $user = null): bool
15721572
{
1573-
return Gate::forUser($user)->check('save', $element);
1573+
return $this->_checkAuthorization($element, 'save', $user);
15741574
}
15751575

15761576
/**
@@ -1585,7 +1585,14 @@ public function canSave(ElementInterface $element, ?User $user = null): bool
15851585
*/
15861586
public function canSaveCanonical(ElementInterface $element, ?User $user = null): bool
15871587
{
1588-
return Gate::forUser($user)->check('saveCanonical', $element);
1588+
if ($element->getIsUnpublishedDraft()) {
1589+
$fakeCanonical = clone $element;
1590+
$fakeCanonical->draftId = null;
1591+
1592+
return $this->canSave($fakeCanonical, $user);
1593+
}
1594+
1595+
return $this->canSave($element->getCanonical(true), $user);
15891596
}
15901597

15911598
/**
@@ -1602,7 +1609,7 @@ public function canSaveCanonical(ElementInterface $element, ?User $user = null):
16021609
*/
16031610
public function canDuplicate(ElementInterface $element, ?User $user = null): bool
16041611
{
1605-
return Gate::forUser($user)->check('duplicate', $element);
1612+
return $this->_checkAuthorization($element, 'duplicate', $user);
16061613
}
16071614

16081615
/**
@@ -1617,7 +1624,7 @@ public function canDuplicate(ElementInterface $element, ?User $user = null): boo
16171624
*/
16181625
public function canDuplicateAsDraft(ElementInterface $element, ?User $user = null): bool
16191626
{
1620-
return Gate::forUser($user)->check('duplicateAsDraft', $element);
1627+
return $this->_checkAuthorization($element, 'duplicateAsDraft', $user);
16211628
}
16221629

16231630
/**
@@ -1634,7 +1641,7 @@ public function canDuplicateAsDraft(ElementInterface $element, ?User $user = nul
16341641
*/
16351642
public function canCopy(ElementInterface $element, ?User $user = null): bool
16361643
{
1637-
return Gate::forUser($user)->check('copy', $element);
1644+
return $this->_checkAuthorization($element, 'copy', $user);
16381645
}
16391646

16401647
/**
@@ -1651,7 +1658,7 @@ public function canCopy(ElementInterface $element, ?User $user = null): bool
16511658
*/
16521659
public function canDelete(ElementInterface $element, ?User $user = null): bool
16531660
{
1654-
return Gate::forUser($user)->check('delete', $element);
1661+
return $this->_checkAuthorization($element, 'delete', $user);
16551662
}
16561663

16571664
/**
@@ -1668,7 +1675,7 @@ public function canDelete(ElementInterface $element, ?User $user = null): bool
16681675
*/
16691676
public function canDeleteForSite(ElementInterface $element, ?User $user = null): bool
16701677
{
1671-
return Gate::forUser($user)->check('deleteForSite', $element);
1678+
return $this->_checkAuthorization($element, 'deleteForSite', $user);
16721679
}
16731680

16741681
/**
@@ -1685,7 +1692,18 @@ public function canDeleteForSite(ElementInterface $element, ?User $user = null):
16851692
*/
16861693
public function canCreateDrafts(ElementInterface $element, ?User $user = null): bool
16871694
{
1688-
return Gate::forUser($user)->check('createDrafts', $element);
1695+
return $this->_checkAuthorization($element, 'createDrafts', $user);
1696+
}
1697+
1698+
private function _checkAuthorization(ElementInterface $element, string $ability, ?User $user = null): bool
1699+
{
1700+
$user ??= Auth::user();
1701+
1702+
if (!$user) {
1703+
return false;
1704+
}
1705+
1706+
return Gate::forUser($user)->check($ability, $element);
16891707
}
16901708

16911709
private static function _authCheck(ElementInterface $element, User $user, string $eventName): ?bool
@@ -1941,7 +1959,7 @@ public static function registerEvents(): void
19411959
return null;
19421960
}
19431961

1944-
return self::_authCheck($element, $user, $ability);
1962+
return self::_authCheck($element, $user, $event);
19451963
});
19461964
}
19471965
}

yii2-adapter/tests/unit/services/ElementsTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,20 @@
1111
namespace crafttests\unit\services;
1212

1313
use Craft;
14+
use craft\events\AuthorizationCheckEvent;
1415
use craft\services\Elements;
1516
use craft\test\TestCase;
1617
use craft\test\TestSetup;
1718
use CraftCms\Cms\Entry\Elements\Entry;
1819
use CraftCms\Cms\Support\Str;
20+
use CraftCms\Yii2Adapter\IdentityWrapper;
1921
use crafttests\fixtures\AssetFixture;
2022
use crafttests\fixtures\EntryFixture;
2123
use crafttests\fixtures\GlobalSetFixture;
2224
use crafttests\fixtures\settings\GeneralConfigSettingFixture;
2325
use crafttests\fixtures\SitesFixture;
2426
use crafttests\fixtures\UserFixture;
27+
use Illuminate\Support\Facades\Auth;
2528

2629
/**
2730
* Unit tests for the config service
@@ -86,6 +89,36 @@ public function testParseRefs(): void
8689
}
8790
}
8891

92+
public function testCanViewFallsBackToCurrentUser(): void
93+
{
94+
$entry = $this->_getEntry();
95+
$user = $this->_getUser();
96+
97+
Auth::login($user);
98+
Craft::$app->getUser()->setIdentity(new IdentityWrapper($user));
99+
100+
$this->elements->on(Elements::EVENT_AUTHORIZE_VIEW, function(AuthorizationCheckEvent $event) use ($user) {
101+
self::assertSame($user->id, $event->user->id);
102+
$event->authorized = true;
103+
});
104+
105+
self::assertTrue($this->elements->canView($entry));
106+
}
107+
108+
public function testCanSaveCanonicalUsesAuthorizeSaveEvent(): void
109+
{
110+
$entry = clone $this->_getEntry();
111+
$user = $this->_getUser();
112+
$entry->draftId = 100;
113+
114+
$this->elements->on(Elements::EVENT_AUTHORIZE_SAVE, function(AuthorizationCheckEvent $event) use ($user) {
115+
self::assertSame($user->id, $event->user->id);
116+
$event->authorized = true;
117+
});
118+
119+
self::assertTrue($this->elements->canSaveCanonical($entry, $user));
120+
}
121+
89122
/**
90123
* @inheritdoc
91124
*/
@@ -127,4 +160,17 @@ protected function _before(): void
127160
parent::_before();
128161
$this->elements = Craft::$app->getElements();
129162
}
163+
164+
private function _getEntry(): Entry
165+
{
166+
return Entry::find()
167+
->site('*')
168+
->status(null)
169+
->one();
170+
}
171+
172+
private function _getUser()
173+
{
174+
return Craft::$app->getUsers()->getUserById(1);
175+
}
130176
}

0 commit comments

Comments
 (0)