Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F2753922
GlobalBlockingLinkBuilder.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
GlobalBlockingLinkBuilder.php
View Options
<?php
namespace
MediaWiki\Extension\GlobalBlocking\Services
;
use
HtmlArmor
;
use
MediaWiki\Config\ServiceOptions
;
use
MediaWiki\Context\IContextSource
;
use
MediaWiki\Linker\LinkRenderer
;
use
MediaWiki\Linker\LinkTarget
;
use
MediaWiki\Permissions\Authority
;
use
MediaWiki\SpecialPage\SpecialPage
;
use
MediaWiki\Title\Title
;
use
MediaWiki\WikiMap\WikiMap
;
/**
* A service that builds links to other global blocking special pages and also
* builds user links to user pages on other wikis.
*
* @since 1.42
*/
class
GlobalBlockingLinkBuilder
{
public
const
CONSTRUCTOR_OPTIONS
=
[
'ApplyGlobalBlocks'
,
'GlobalBlockingCentralWiki'
,
];
private
ServiceOptions
$options
;
private
LinkRenderer
$linkRenderer
;
private
GlobalBlockLookup
$globalBlockLookup
;
public
function
__construct
(
ServiceOptions
$options
,
LinkRenderer
$linkRenderer
,
GlobalBlockLookup
$globalBlockLookup
)
{
$options
->
assertRequiredOptions
(
self
::
CONSTRUCTOR_OPTIONS
);
$this
->
options
=
$options
;
$this
->
linkRenderer
=
$linkRenderer
;
$this
->
globalBlockLookup
=
$globalBlockLookup
;
}
/**
* Build links to other global blocking special pages. These are for use in the subtitle of
* GlobalBlocking extension special pages.
*
* @param SpecialPage $sp SpecialPage instance for context
* @return string links to special pages
*/
public
function
buildSubtitleLinks
(
SpecialPage
$sp
):
string
{
// Add a few useful links
$links
=
[];
$pagetype
=
$sp
->
getName
();
// Don't show a link to a special page on the special page itself.
// Show the links only if the user has sufficient rights
if
(
$pagetype
!==
'GlobalBlockList'
)
{
$title
=
SpecialPage
::
getTitleFor
(
'GlobalBlockList'
);
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
$title
,
$sp
->
msg
(
'globalblocklist'
)->
text
()
);
}
$canBlock
=
$sp
->
getAuthority
()->
isAllowed
(
'globalblock'
);
if
(
$pagetype
!==
'GlobalBlock'
&&
$canBlock
)
{
$title
=
SpecialPage
::
getTitleFor
(
'GlobalBlock'
);
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
$title
,
$sp
->
msg
(
'globalblocking-goto-block'
)->
text
()
);
}
if
(
$pagetype
!==
'RemoveGlobalBlock'
&&
$canBlock
)
{
$title
=
SpecialPage
::
getTitleFor
(
'RemoveGlobalBlock'
);
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
$title
,
$sp
->
msg
(
'globalblocking-goto-unblock'
)->
text
()
);
}
if
(
$pagetype
!==
'GlobalBlockStatus'
&&
$sp
->
getAuthority
()->
isAllowed
(
'globalblock-whitelist'
)
)
{
$title
=
SpecialPage
::
getTitleFor
(
'GlobalBlockStatus'
);
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
$title
,
$sp
->
msg
(
'globalblocking-goto-status'
)->
text
()
);
}
if
(
$pagetype
===
'GlobalBlock'
&&
$sp
->
getAuthority
()->
isAllowed
(
'editinterface'
)
)
{
$title
=
Title
::
makeTitle
(
NS_MEDIAWIKI
,
'Globalblocking-block-reason-dropdown'
);
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
$title
,
$sp
->
msg
(
'globalblocking-block-edit-dropdown'
)->
text
(),
[],
[
'action'
=>
'edit'
]
);
}
if
(
count
(
$links
)
)
{
return
$sp
->
msg
(
'parentheses'
)
->
rawParams
(
$sp
->
getLanguage
()->
pipeList
(
$links
)
)
->
escaped
();
}
return
''
;
}
/**
* If possible, build a link to the user page of the given user on the given wiki.
*
* @param string $wikiID
* @param string $user
* @param LinkTarget $currentPage
* @return string HTML which is the link to the user page, or plaintext if no URL could be generated.
*/
public
function
maybeLinkUserpage
(
string
$wikiID
,
string
$user
,
LinkTarget
$currentPage
):
string
{
$wiki
=
WikiMap
::
getWiki
(
$wikiID
);
if
(
$wiki
)
{
return
$this
->
linkRenderer
->
makeExternalLink
(
$wiki
->
getFullUrl
(
"User:$user"
),
$user
,
$currentPage
);
}
return
$user
;
}
/**
* Get a link for the central wiki for the given special page.
* This is protected to allow mocking in tests.
*
* @param string $globalBlockingCentralWiki The wiki ID of the central wiki
* @param string $specialPageName The localised name of the special page (or in English as appropriate)
* @return string|false
*/
protected
function
getForeignURL
(
string
$globalBlockingCentralWiki
,
string
$specialPageName
)
{
return
WikiMap
::
getForeignURL
(
$globalBlockingCentralWiki
,
$specialPageName
);
}
/**
* Attempt to generate a link to the global blocking central wiki for the given special page.
*
* @param string $specialPageName The name of the special page, which will be localised
* @return string|null The URL to the central wiki, or null if no URL could be generated
*/
private
function
getCentralUrl
(
string
$specialPageName
):
?
string
{
$globalBlockingCentralWiki
=
$this
->
options
->
get
(
'GlobalBlockingCentralWiki'
);
if
(
$globalBlockingCentralWiki
===
false
)
{
return
null
;
}
$centralGlobalBlockingUrl
=
$this
->
getForeignURL
(
$globalBlockingCentralWiki
,
Title
::
makeName
(
NS_SPECIAL
,
$specialPageName
,
''
,
''
,
true
)
);
if
(
$centralGlobalBlockingUrl
===
false
)
{
return
null
;
}
return
$centralGlobalBlockingUrl
;
}
/**
* Generate a link to a given special page name which where possible should be on the central wiki.
*
* @param string $specialPageName The name of the special page, which will be localised
* @param string|HtmlArmor $linkText The display text for the link
* @param LinkTarget $currentPage The current page, to be passed to LinkRenderer::makeExternalLink
* @param array $queryParameters The query parameters for the link. optional.
* @return string The HTML of the generated link
*/
public
function
getLinkToCentralWikiSpecialPage
(
string
$specialPageName
,
$linkText
,
LinkTarget
$currentPage
,
array
$queryParameters
=
[]
):
string
{
$centralWikiLogUrl
=
$this
->
getCentralUrl
(
$specialPageName
);
if
(
$centralWikiLogUrl
)
{
$centralWikiLogUrl
=
wfAppendQuery
(
$centralWikiLogUrl
,
$queryParameters
);
return
$this
->
linkRenderer
->
makeExternalLink
(
$centralWikiLogUrl
,
$linkText
,
$currentPage
);
}
else
{
return
$this
->
linkRenderer
->
makeKnownLink
(
SpecialPage
::
getTitleFor
(
$specialPageName
),
$linkText
,
[],
$queryParameters
);
}
}
/**
* Get action links to be displayed after the log entry or block list entry.
*
* @param Authority $authority The authority object for the user
* @param string $target The target of the block for the given log entry / block list entry.
* @param IContextSource $context The context to use to decide the language and format the
* action links.
* @param bool $checkBlockStatus Whether to actually check if the given target is blocked.
* If false, then assume that the user is blocked. Used to avoid repeated lookups for block
* status on Special:Log.
* @return string The action links to be displayed
*/
public
function
getActionLinks
(
Authority
$authority
,
string
$target
,
IContextSource
$context
,
bool
$checkBlockStatus
=
false
):
string
{
$links
=
[];
$canBlock
=
$authority
->
isAllowed
(
'globalblock'
);
if
(
$checkBlockStatus
)
{
$targetIsBlocked
=
$this
->
globalBlockLookup
->
getGlobalBlockId
(
$target
);
}
else
{
$targetIsBlocked
=
true
;
}
if
(
$canBlock
&&
$targetIsBlocked
)
{
$links
[]
=
$this
->
getLinkToCentralWikiSpecialPage
(
'RemoveGlobalBlock'
,
new
HtmlArmor
(
$context
->
msg
(
'globalblocking-list-unblock'
)->
parse
()
),
$context
->
getTitle
(),
[
'address'
=>
$target
]
);
}
if
(
$this
->
options
->
get
(
'ApplyGlobalBlocks'
)
&&
$authority
->
isAllowed
(
'globalblock-whitelist'
)
&&
$targetIsBlocked
)
{
$links
[]
=
$this
->
linkRenderer
->
makeKnownLink
(
SpecialPage
::
getTitleFor
(
'GlobalBlockStatus'
),
new
HtmlArmor
(
$context
->
msg
(
'globalblocking-list-whitelist'
)->
parse
()
),
[],
[
'address'
=>
$target
]
);
}
// Special:GlobalBlock does not support global block IDs, so don't display the link if the target is a
// global block ID. This also hides the link for global autoblocks (which are only ever referenced by
// their global block ID), which is good because we don't support modifying global autoblocks at all.
if
(
$canBlock
&&
!
GlobalBlockLookup
::
isAGlobalBlockId
(
$target
)
)
{
$globalBlockLinkMessage
=
$targetIsBlocked
?
'globalblocking-list-modify'
:
'globalblocking-list-block'
;
$links
[]
=
$this
->
getLinkToCentralWikiSpecialPage
(
'GlobalBlock'
,
new
HtmlArmor
(
$context
->
msg
(
$globalBlockLinkMessage
)->
parse
()
),
$context
->
getTitle
(),
[
'wpAddress'
=>
$target
]
);
}
if
(
count
(
$links
)
)
{
return
$context
->
msg
(
'parentheses'
)
->
rawParams
(
$context
->
getLanguage
()->
pipeList
(
$links
)
)
->
escaped
();
}
return
''
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Jul 3, 21:53 (16 h, 33 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
e6/e3/0c4d9ebb99546cef5bf28f036090
Default Alt Text
GlobalBlockingLinkBuilder.php (8 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment