@@ -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}
0 commit comments