MediaWiki REL1_34
SpecialBlockList.php
Go to the documentation of this file.
1<?php
27
34 protected $target;
35
36 protected $options;
37
38 protected $blockType;
39
40 function __construct() {
41 parent::__construct( 'BlockList' );
42 }
43
47 public function execute( $par ) {
48 $this->setHeaders();
49 $this->outputHeader();
50 $this->addHelpLink( 'Help:Blocking_users' );
51 $out = $this->getOutput();
52 $out->setPageTitle( $this->msg( 'ipblocklist' ) );
53 $out->addModuleStyles( [ 'mediawiki.special' ] );
54
55 $request = $this->getRequest();
56 $par = $request->getVal( 'ip', $par );
57 $this->target = trim( $request->getVal( 'wpTarget', $par ) );
58
59 $this->options = $request->getArray( 'wpOptions', [] );
60 $this->blockType = $request->getVal( 'blockType' );
61
62 $action = $request->getText( 'action' );
63
64 if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
65 # B/C @since 1.18: Unblock interface is now at Special:Unblock
66 $title = SpecialPage::getTitleFor( 'Unblock', $this->target );
67 $out->redirect( $title->getFullURL() );
68
69 return;
70 }
71
72 # setup BlockListPager here to get the actual default Limit
73 $pager = $this->getBlockListPager();
74
75 # Just show the block list
76 $fields = [
77 'Target' => [
78 'type' => 'user',
79 'label-message' => 'ipaddressorusername',
80 'tabindex' => '1',
81 'size' => '45',
82 'default' => $this->target,
83 ],
84 'Options' => [
85 'type' => 'multiselect',
86 'options-messages' => [
87 'blocklist-tempblocks' => 'tempblocks',
88 'blocklist-indefblocks' => 'indefblocks',
89 'blocklist-userblocks' => 'userblocks',
90 'blocklist-addressblocks' => 'addressblocks',
91 'blocklist-rangeblocks' => 'rangeblocks',
92 ],
93 'flatlist' => true,
94 ],
95 ];
96
97 if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
98 $fields['BlockType'] = [
99 'type' => 'select',
100 'label-message' => 'blocklist-type',
101 'options' => [
102 $this->msg( 'blocklist-type-opt-all' )->escaped() => '',
103 $this->msg( 'blocklist-type-opt-sitewide' )->escaped() => 'sitewide',
104 $this->msg( 'blocklist-type-opt-partial' )->escaped() => 'partial',
105 ],
106 'name' => 'blockType',
107 'cssclass' => 'mw-field-block-type',
108 ];
109 }
110
111 $fields['Limit'] = [
112 'type' => 'limitselect',
113 'label-message' => 'table_pager_limit_label',
114 'options' => $pager->getLimitSelectList(),
115 'name' => 'limit',
116 'default' => $pager->getLimit(),
117 'cssclass' => $this->getConfig()->get( 'EnablePartialBlocks' ) ?
118 'mw-field-limit mw-has-field-block-type' :
119 'mw-field-limit',
120 ];
121
122 $context = new DerivativeContext( $this->getContext() );
123 $context->setTitle( $this->getPageTitle() ); // Remove subpage
124 $form = HTMLForm::factory( 'ooui', $fields, $context );
125 $form
126 ->setMethod( 'get' )
127 ->setFormIdentifier( 'blocklist' )
128 ->setWrapperLegendMsg( 'ipblocklist-legend' )
129 ->setSubmitTextMsg( 'ipblocklist-submit' )
130 ->prepareForm()
131 ->displayForm( false );
132
133 $this->showList( $pager );
134 }
135
140 protected function getBlockListPager() {
141 $conds = [];
142 $db = $this->getDB();
143 # Is the user allowed to see hidden blocks?
144 if ( !MediaWikiServices::getInstance()
146 ->userHasRight( $this->getUser(), 'hideuser' )
147 ) {
148 $conds['ipb_deleted'] = 0;
149 }
150
151 if ( $this->target !== '' ) {
152 list( $target, $type ) = DatabaseBlock::parseTarget( $this->target );
153
154 switch ( $type ) {
155 case DatabaseBlock::TYPE_ID:
156 case DatabaseBlock::TYPE_AUTO:
157 $conds['ipb_id'] = $target;
158 break;
159
160 case DatabaseBlock::TYPE_IP:
161 case DatabaseBlock::TYPE_RANGE:
162 list( $start, $end ) = IP::parseRange( $target );
163 $conds[] = $db->makeList(
164 [
165 'ipb_address' => $target,
166 DatabaseBlock::getRangeCond( $start, $end )
167 ],
168 LIST_OR
169 );
170 $conds['ipb_auto'] = 0;
171 break;
172
173 case DatabaseBlock::TYPE_USER:
174 $conds['ipb_address'] = $target->getName();
175 $conds['ipb_auto'] = 0;
176 break;
177 }
178 }
179
180 # Apply filters
181 if ( in_array( 'userblocks', $this->options ) ) {
182 $conds['ipb_user'] = 0;
183 }
184 if ( in_array( 'addressblocks', $this->options ) ) {
185 $conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
186 }
187 if ( in_array( 'rangeblocks', $this->options ) ) {
188 $conds[] = "ipb_range_end = ipb_range_start";
189 }
190
191 $hideTemp = in_array( 'tempblocks', $this->options );
192 $hideIndef = in_array( 'indefblocks', $this->options );
193 if ( $hideTemp && $hideIndef ) {
194 // If both types are hidden, ensure query doesn't produce any results
195 $conds[] = '1=0';
196 } elseif ( $hideTemp ) {
197 $conds['ipb_expiry'] = $db->getInfinity();
198 } elseif ( $hideIndef ) {
199 $conds[] = "ipb_expiry != " . $db->addQuotes( $db->getInfinity() );
200 }
201
202 if ( $this->blockType === 'sitewide' ) {
203 $conds['ipb_sitewide'] = 1;
204 } elseif ( $this->blockType === 'partial' ) {
205 $conds['ipb_sitewide'] = 0;
206 }
207
208 return new BlockListPager( $this, $conds );
209 }
210
215 protected function showList( BlockListPager $pager ) {
216 $out = $this->getOutput();
217
218 # Check for other blocks, i.e. global/tor blocks
219 $otherBlockLink = [];
220 Hooks::run( 'OtherBlockLogLink', [ &$otherBlockLink, $this->target ] );
221
222 # Show additional header for the local block only when other blocks exists.
223 # Not necessary in a standard installation without such extensions enabled
224 if ( count( $otherBlockLink ) ) {
225 $out->addHTML(
226 Html::element( 'h2', [], $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
227 );
228 }
229
230 if ( $pager->getNumRows() ) {
231 $out->addParserOutputContent( $pager->getFullOutput() );
232 } elseif ( $this->target ) {
233 $out->addWikiMsg( 'ipblocklist-no-results' );
234 } else {
235 $out->addWikiMsg( 'ipblocklist-empty' );
236 }
237
238 if ( count( $otherBlockLink ) ) {
239 $out->addHTML(
240 Html::rawElement(
241 'h2',
242 [],
243 $this->msg( 'ipblocklist-otherblocks', count( $otherBlockLink ) )->parse()
244 ) . "\n"
245 );
246 $list = '';
247 foreach ( $otherBlockLink as $link ) {
248 $list .= Html::rawElement( 'li', [], $link ) . "\n";
249 }
250 $out->addHTML( Html::rawElement(
251 'ul',
252 [ 'class' => 'mw-ipblocklist-otherblocks' ],
253 $list
254 ) . "\n" );
255 }
256 }
257
258 protected function getGroupName() {
259 return 'users';
260 }
261
267 protected function getDB() {
268 return wfGetDB( DB_REPLICA );
269 }
270}
getPermissionManager()
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
An IContextSource implementation which will inherit context from another source but allow individual ...
getNumRows()
Get the number of rows in the result set.
A DatabaseBlock (unlike a SystemBlock) is stored in the database, may give rise to autoblocks and may...
MediaWikiServices is the service locator for the application scope of MediaWiki.
A special page that lists existing blocks.
getDB()
Return a IDatabase object for reading.
showList(BlockListPager $pager)
Show the list of blocked accounts matching the actual filter.
getBlockListPager()
Setup a new BlockListPager instance.
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
Parent class for all special pages.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!
getOutput()
Get the OutputPage being used for this instance.
getUser()
Shortcut to get the User executing this instance.
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don't need a full Title object,...
getContext()
Gets the context this SpecialPage is executed in.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getConfig()
Shortcut to get main config object.
getRequest()
Get the WebRequest being used for this instance.
getPageTitle( $subpage=false)
Get a self-referential title object.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
getFullOutput()
Get the formatted result list, with navigation bars.
const LIST_OR
Definition Defines.php:51
Basic database interface for live and lazy-loaded relation database handles.
Definition IDatabase.php:38
$context
Definition load.php:45
const DB_REPLICA
Definition defines.php:25