diff --git a/includes/Menu/PageActions/ToolbarBuilder.php b/includes/Menu/PageActions/ToolbarBuilder.php index 692decb77..09d012081 100644 --- a/includes/Menu/PageActions/ToolbarBuilder.php +++ b/includes/Menu/PageActions/ToolbarBuilder.php @@ -137,10 +137,10 @@ class ToolbarBuilder { public function getGroup(): Group { $group = new Group( 'p-views' ); $permissions = $this->permissions; - $userPageOrUserTalkPageWithOveflowMode = $this->skinOptions->get( SkinOptions::TOOLBAR_SUBMENU ) + $userPageOrUserTalkPageWithOverflowMode = $this->skinOptions->get( SkinOptions::TOOLBAR_SUBMENU ) && $this->relevantUserPageHelper->isUserPage(); - if ( !$userPageOrUserTalkPageWithOveflowMode && $permissions->isAllowed( + if ( !$userPageOrUserTalkPageWithOverflowMode && $permissions->isAllowed( IMinervaPagePermissions::SWITCH_LANGUAGE ) ) { $group->insertEntry( new LanguageSelectorEntry( $this->title, @@ -160,7 +160,9 @@ class ToolbarBuilder { $group->insertEntry( $this->getHistoryPageAction() ); } - if ( $this->relevantUserPageHelper->isUserPage() ) { + $isUserPage = $this->relevantUserPageHelper->isUserPage(); + $isUserPageAccessible = $this->relevantUserPageHelper->isUserPageAccessibleToCurrentUser(); + if ( $isUserPage && $isUserPageAccessible ) { // T235681: Contributions icon should be added to toolbar on user pages // and user talk pages for all users $user = $this->relevantUserPageHelper->getPageUser(); diff --git a/includes/MinervaHooks.php b/includes/MinervaHooks.php index 467176e52..2c2057685 100644 --- a/includes/MinervaHooks.php +++ b/includes/MinervaHooks.php @@ -227,9 +227,13 @@ class MinervaHooks { // SkinUserPageHelper is being instantiated instead. $relevantUserPageHelper = new SkinUserPageHelper( $services->getUserNameUtils(), - $title->inNamespace( NS_USER_TALK ) ? $title->getSubjectPage() : $title + $title->inNamespace( NS_USER_TALK ) ? $title->getSubjectPage() : $title, + $mobileContext ); - $isUserPageOrUserTalkPage = $relevantUserPageHelper->isUserPage(); + + $isUserPage = $relevantUserPageHelper->isUserPage(); + $isUserPageAccessible = $relevantUserPageHelper->isUserPageAccessibleToCurrentUser(); + $isUserPageOrUserTalkPage = $isUserPage && $isUserPageAccessible; } else { // If no title this must be false $isUserPageOrUserTalkPage = false; diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 131508c14..968ded28c 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -89,7 +89,8 @@ return [ $relevantUserPageHelper = $title->inNamespace( NS_USER_TALK ) ? new SkinUserPageHelper( $services->getUserNameUtils(), - $context->getSkin()->getRelevantTitle()->getSubjectPage() + $context->getSkin()->getRelevantTitle()->getSubjectPage(), + $context ) : $userPageHelper; @@ -132,7 +133,8 @@ return [ 'Minerva.SkinUserPageHelper' => static function ( MediaWikiServices $services ): SkinUserPageHelper { return new SkinUserPageHelper( $services->getUserNameUtils(), - RequestContext::getMain()->getSkin()->getRelevantTitle() + RequestContext::getMain()->getSkin()->getRelevantTitle(), + RequestContext::getMain() ); }, 'Minerva.LanguagesHelper' => static function (): LanguagesHelper { diff --git a/includes/Skins/SkinMinerva.php b/includes/Skins/SkinMinerva.php index 2defaf476..777cb83da 100644 --- a/includes/Skins/SkinMinerva.php +++ b/includes/Skins/SkinMinerva.php @@ -431,7 +431,8 @@ class SkinMinerva extends SkinMustache { if ( $this->getUserPageHelper()->isUserPage() ) { $pageUser = $this->getUserPageHelper()->getPageUser(); $fromDate = $pageUser->getRegistration(); - if ( is_string( $fromDate ) ) { + + if ( $this->getUserPageHelper()->isUserPageAccessibleToCurrentUser() && is_string( $fromDate ) ) { $fromDateTs = wfTimestamp( TS_UNIX, $fromDate ); // This is shown when js is disabled. js enhancement made due to caching @@ -461,7 +462,9 @@ class SkinMinerva extends SkinMustache { * @return string HTML for header */ protected function getHeadingHtml() { - if ( $this->getUserPageHelper()->isUserPage() ) { + $isUserPage = $this->getUserPageHelper()->isUserPage(); + $isUserPageAccessible = $this->getUserPageHelper()->isUserPageAccessibleToCurrentUser(); + if ( $isUserPage && $isUserPageAccessible ) { // The heading is just the username without namespace $heading = $this->getUserPageHelper()->getPageUser()->getName(); } else { diff --git a/includes/Skins/SkinUserPageHelper.php b/includes/Skins/SkinUserPageHelper.php index 8ec3f4fd6..e444eb844 100644 --- a/includes/Skins/SkinUserPageHelper.php +++ b/includes/Skins/SkinUserPageHelper.php @@ -20,6 +20,7 @@ namespace MediaWiki\Minerva\Skins; +use IContextSource; use MediaWiki\User\UserNameUtils; use Title; use User; @@ -29,10 +30,12 @@ class SkinUserPageHelper { * @var UserNameUtils */ private $userNameUtils; + /** * @var Title|null */ private $title; + /** * @var bool */ @@ -43,13 +46,20 @@ class SkinUserPageHelper { */ private $pageUser; + /** + * @var IContextSource|null + */ + private $context; + /** * @param UserNameUtils $userNameUtils * @param Title|null $title + * @param IContextSource|null $context */ - public function __construct( UserNameUtils $userNameUtils, Title $title = null ) { + public function __construct( UserNameUtils $userNameUtils, Title $title = null, IContextSource $context = null ) { $this->userNameUtils = $userNameUtils; $this->title = $title; + $this->context = $context; } /** @@ -100,4 +110,14 @@ class SkinUserPageHelper { public function isUserPage() { return $this->fetchData() !== null; } + + /** + * @return bool + */ + public function isUserPageAccessibleToCurrentUser() { + $pageUser = $this->fetchData(); + $isHidden = $pageUser && $pageUser->isHidden(); + $canViewHidden = $this->context && $this->context->getAuthority()->isAllowed( 'hideuser' ); + return !$isHidden || $canViewHidden; + } }