Linux anchor 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64
Apache/2.4.18 (Ubuntu)
Server IP : 10.10.100.4 & Your IP : 216.73.217.150
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
wiki.bernardino.org /
includes /
Delete
Unzip
Name
Size
Permission
Date
Action
actions
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
api
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
auth
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
cache
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
changes
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
changetags
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
clientpool
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
collation
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
compat
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
composer
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
config
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
content
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
context
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
dao
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
db
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
debug
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
deferred
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
diff
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
exception
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
export
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
extauth
[ DIR ]
drwxr-xr-x
2012-03-22 16:23
externalstore
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
filebackend
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
filerepo
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
gallery
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
htmlform
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
http
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
import
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
installer
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
interwiki
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
job
[ DIR ]
drwxr-xr-x
2012-03-22 16:23
jobqueue
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
json
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
libs
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
linker
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
logging
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
mail
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
media
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
normal
[ DIR ]
drwxr-xr-x
2012-03-22 16:23
objectcache
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
page
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
pager
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
parser
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
password
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
poolcounter
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
profiler
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
rcfeed
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
registration
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
resourceloader
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
revisiondelete
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
search
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
services
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
session
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
site
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
skins
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
specialpage
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
specials
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
templates
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
tidy
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
title
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
upload
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
user
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
utils
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
widget
[ DIR ]
drwxr-xr-x
2016-11-28 20:20
zhtable
[ DIR ]
drwxr-xr-x
2012-03-22 16:23
.htaccess
197
B
-r--r--r--
2026-08-22 08:29
Action.php
12.43
KB
-rw-r--r--
2011-09-16 17:01
AjaxDispatcher.php
4.03
KB
-rw-r--r--
2016-11-28 20:20
AjaxResponse.php
8.15
KB
-rw-r--r--
2016-11-28 20:20
Article.php
58.64
KB
-rw-r--r--
2011-11-15 20:46
AuthPlugin.php
9.2
KB
-rw-r--r--
2016-11-28 20:20
AutoLoader.php
3
KB
-rw-r--r--
2016-11-28 20:20
Autopromote.php
6.77
KB
-rw-r--r--
2016-11-28 20:20
BacklinkCache.php
9.03
KB
-rw-r--r--
2011-06-30 01:09
Block.php
41.97
KB
-rw-r--r--
2016-11-28 20:20
Category.php
10.34
KB
-rw-r--r--
2016-11-28 20:20
CategoryFinder.php
6.2
KB
-rw-r--r--
2016-11-28 20:20
CategoryPage.php
21.84
KB
-rw-r--r--
2011-10-28 23:20
CategoryViewer.php
22.5
KB
-rw-r--r--
2016-11-28 20:20
Categoryfinder.php
5.13
KB
-rw-r--r--
2011-05-19 02:03
Cdb.php
3.57
KB
-rw-r--r--
2011-05-28 20:58
Cdb_PHP.php
10.11
KB
-rw-r--r--
2011-05-28 19:51
ChangeTags.php
6.66
KB
-rw-r--r--
2011-07-09 11:01
ChangesFeed.php
5.82
KB
-rw-r--r--
2011-06-19 07:45
ChangesList.php
35.52
KB
-rw-r--r--
2011-10-25 23:51
Collation.php
9.86
KB
-rw-r--r--
2011-09-21 00:36
ConfEditor.php
29.16
KB
-rw-r--r--
2011-08-27 21:28
Cookie.php
6.17
KB
-rw-r--r--
2011-06-02 00:35
CryptRand.php
16.96
KB
-rw-r--r--
2012-03-21 11:43
DefaultSettings.php
265.47
KB
-rw-r--r--
2016-11-28 20:20
Defines.php
7.85
KB
-rw-r--r--
2016-11-28 20:20
DeprecatedGlobal.php
1.9
KB
-rw-r--r--
2016-11-28 20:20
DerivativeRequest.php
2.46
KB
-rw-r--r--
2016-11-28 20:20
DjVuImage.php
10.58
KB
-rw-r--r--
2011-05-18 00:03
DummyLinker.php
9.01
KB
-rw-r--r--
2016-11-28 20:20
EditPage.php
136.53
KB
-rw-r--r--
2016-11-28 20:20
EventRelayerGroup.php
1.27
KB
-rw-r--r--
2016-11-28 20:20
Exception.php
11.5
KB
-rw-r--r--
2011-10-22 04:34
Export.php
32.27
KB
-rw-r--r--
2011-11-24 02:29
ExternalEdit.php
2.45
KB
-rw-r--r--
2011-09-07 22:14
ExternalStore.php
4.29
KB
-rw-r--r--
2011-05-29 16:24
ExternalStoreDB.php
4.44
KB
-rw-r--r--
2011-10-17 00:24
ExternalStoreHttp.php
463
B
-rw-r--r--
2010-01-08 22:35
ExternalUser.php
8.96
KB
-rw-r--r--
2011-05-26 21:52
FakeTitle.php
6.6
KB
-rw-r--r--
2011-05-26 22:38
Fallback.php
5.49
KB
-rw-r--r--
2011-05-28 20:58
FauxRequest.php
5.66
KB
-rw-r--r--
2016-11-28 20:20
Feed.php
10.58
KB
-rw-r--r--
2016-11-28 20:20
FeedUtils.php
8.64
KB
-rw-r--r--
2016-11-28 20:20
FileDeleteForm.php
11.7
KB
-rw-r--r--
2016-11-28 20:20
ForkController.php
5.4
KB
-rw-r--r--
2016-11-28 20:20
FormOptions.php
11.08
KB
-rw-r--r--
2016-11-28 20:20
GenderCache.php
3.35
KB
-rw-r--r--
2011-09-19 14:58
GitInfo.php
10.74
KB
-rw-r--r--
2016-11-28 20:20
GlobalFunctions.php
106.76
KB
-rw-r--r--
2016-11-28 20:20
HTMLForm.php
49.55
KB
-rw-r--r--
2011-11-09 18:04
HistoryBlob.php
16.15
KB
-rw-r--r--
2016-11-28 20:20
HistoryPage.php
21.66
KB
-rw-r--r--
2011-09-16 16:12
Hooks.php
6.47
KB
-rw-r--r--
2016-11-28 20:20
Html.php
31.91
KB
-rw-r--r--
2016-11-28 20:20
HtmlFormatter.php
1015
B
-rw-r--r--
2016-11-28 20:20
HttpFunctions.old.php
319
B
-rw-r--r--
2011-05-28 17:59
HttpFunctions.php
21.28
KB
-rw-r--r--
2011-09-16 15:19
IP.php
21.58
KB
-rw-r--r--
2011-11-09 16:00
ImageFunctions.php
2.58
KB
-rw-r--r--
2011-05-29 16:24
ImageGallery.php
10.46
KB
-rw-r--r--
2011-07-16 01:18
ImagePage.php
36
KB
-rw-r--r--
2011-07-11 02:39
ImageQueryPage.php
1.5
KB
-rw-r--r--
2011-05-26 21:21
Import.php
33.63
KB
-rw-r--r--
2011-10-28 23:20
Init.php
4.67
KB
-rw-r--r--
2011-06-17 01:40
Licenses.php
4.89
KB
-rw-r--r--
2016-11-28 20:20
LinkFilter.php
6.08
KB
-rw-r--r--
2016-11-28 20:20
Linker.php
72.71
KB
-rw-r--r--
2016-11-28 20:20
LinksUpdate.php
23.7
KB
-rw-r--r--
2011-11-14 21:58
ListToggle.php
2.02
KB
-rw-r--r--
2016-11-28 20:20
LocalisationCache.php
29.31
KB
-rw-r--r--
2011-09-12 17:03
LogEventsList.php
32.56
KB
-rw-r--r--
2011-07-10 20:12
LogPage.php
16.09
KB
-rw-r--r--
2011-07-10 20:12
MWFunction.php
1.96
KB
-rw-r--r--
2011-03-22 21:23
MWGrants.php
5.85
KB
-rw-r--r--
2016-11-28 20:20
MWNamespace.php
13.76
KB
-rw-r--r--
2016-11-28 20:20
MWTimestamp.php
6.1
KB
-rw-r--r--
2016-11-28 20:20
MagicWord.php
15.1
KB
-rw-r--r--
2016-11-28 20:20
MagicWordArray.php
7.86
KB
-rw-r--r--
2016-11-28 20:20
MediaWiki.php
35.29
KB
-rw-r--r--
2016-11-28 20:20
MediaWikiServices.php
18.8
KB
-rw-r--r--
2016-11-28 20:20
MediaWikiVersionFetcher.php
746
B
-rw-r--r--
2016-11-28 20:20
MergeHistory.php
10.41
KB
-rw-r--r--
2016-11-28 20:20
Message.php
32.49
KB
-rw-r--r--
2016-11-28 20:20
MessageBlobStore.php
10.5
KB
-rw-r--r--
2011-05-28 00:42
Metadata.php
5.53
KB
-rw-r--r--
2011-06-30 00:09
MimeMagic.php
2.87
KB
-rw-r--r--
2016-11-28 20:20
MovePage.php
18.08
KB
-rw-r--r--
2016-11-28 20:20
Namespace.php
7.78
KB
-rw-r--r--
2011-05-21 21:07
NoLocalSettings.php
2.03
KB
-rw-r--r--
2016-11-28 20:20
OutputHandler.php
6.19
KB
-rw-r--r--
2016-11-28 20:20
OutputPage.php
113
KB
-rw-r--r--
2016-11-28 20:20
PHPVersionCheck.php
8.52
KB
-rw-r--r--
2016-11-28 20:20
PHPVersionError.php
2.96
KB
-rw-r--r--
2011-07-19 01:06
PageProps.php
8.52
KB
-rw-r--r--
2016-11-28 20:20
PageQueryPage.php
680
B
-rw-r--r--
2010-12-22 15:16
Pager.php
30.89
KB
-rw-r--r--
2011-07-06 04:26
PathRouter.php
12.43
KB
-rw-r--r--
2016-11-28 20:20
PatrolLog.php
2.53
KB
-rw-r--r--
2011-07-10 20:12
Pingback.php
7.31
KB
-rw-r--r--
2016-11-28 20:20
PoolCounter.php
5.65
KB
-rw-r--r--
2011-05-28 21:00
Preferences.php
51.21
KB
-rw-r--r--
2016-11-28 20:20
PrefixSearch.php
12.36
KB
-rw-r--r--
2016-11-28 20:20
ProtectionForm.php
19.56
KB
-rw-r--r--
2016-11-28 20:20
ProxyLookup.php
2.12
KB
-rw-r--r--
2016-11-28 20:20
ProxyTools.php
4.6
KB
-rw-r--r--
2011-09-07 22:14
QueryPage.php
22.76
KB
-rw-r--r--
2011-10-17 00:24
RawPage.php
6.2
KB
-rw-r--r--
2011-07-05 23:28
RecentChange.php
23.52
KB
-rw-r--r--
2011-08-27 21:28
RequestContext.php
7.85
KB
-rw-r--r--
2012-01-04 02:07
Revision.php
54.61
KB
-rw-r--r--
2016-11-28 20:20
RevisionList.php
9.25
KB
-rw-r--r--
2016-11-28 20:20
Sanitizer.php
58.04
KB
-rw-r--r--
2016-11-28 20:20
SeleniumWebSettings.php
6.3
KB
-rw-r--r--
2011-06-26 01:27
ServiceWiring.php
11.72
KB
-rw-r--r--
2016-11-28 20:20
Setup.php
27.89
KB
-rw-r--r--
2016-11-28 20:20
SiteConfiguration.php
18.34
KB
-rw-r--r--
2016-11-28 20:20
SiteStats.php
9.85
KB
-rw-r--r--
2016-11-28 20:20
Skin.php
42.13
KB
-rw-r--r--
2012-02-25 16:23
SkinLegacy.php
22.82
KB
-rw-r--r--
2011-10-20 22:50
SkinTemplate.php
64.93
KB
-rw-r--r--
2011-12-09 21:31
SpecialPage.php
31.23
KB
-rw-r--r--
2012-01-04 02:07
SpecialPageFactory.php
17.68
KB
-rw-r--r--
2011-10-28 23:20
SquidPurgeClient.php
10.02
KB
-rw-r--r--
2011-05-21 21:54
Status.php
12.63
KB
-rw-r--r--
2016-11-28 20:20
StreamFile.php
4.66
KB
-rw-r--r--
2016-11-28 20:20
StringUtils.php
11.32
KB
-rw-r--r--
2011-05-21 21:54
StubObject.php
6.4
KB
-rw-r--r--
2016-11-28 20:20
TemplateParser.php
6.46
KB
-rw-r--r--
2016-11-28 20:20
TemplatesOnThisPageFormatter.php
5.36
KB
-rw-r--r--
2016-11-28 20:20
Title.php
140.81
KB
-rw-r--r--
2016-11-28 20:20
TitleArray.php
1.83
KB
-rw-r--r--
2016-11-28 20:20
TitleArrayFromResult.php
1.95
KB
-rw-r--r--
2016-11-28 20:20
User.php
114.26
KB
-rw-r--r--
2012-03-21 11:43
UserArray.php
1.9
KB
-rw-r--r--
2011-05-28 17:59
UserMailer.php
20.52
KB
-rw-r--r--
2012-02-02 15:15
UserRightsProxy.php
5.38
KB
-rw-r--r--
2010-10-14 01:11
ViewCountUpdate.php
3.4
KB
-rw-r--r--
2011-06-25 21:13
WatchedItem.php
5.04
KB
-rw-r--r--
2016-11-28 20:20
WatchedItemQueryService.php
20.4
KB
-rw-r--r--
2016-11-28 20:20
WatchedItemStore.php
25.57
KB
-rw-r--r--
2016-11-28 20:20
WebRequest.php
37.68
KB
-rw-r--r--
2016-11-28 20:20
WebRequestUpload.php
3.4
KB
-rw-r--r--
2016-11-28 20:20
WebResponse.php
9.2
KB
-rw-r--r--
2016-11-28 20:20
WebStart.php
5.54
KB
-rw-r--r--
2016-11-28 20:20
Wiki.php
20.05
KB
-rw-r--r--
2012-01-03 18:34
WikiCategoryPage.php
898
B
-rw-r--r--
2011-08-27 21:28
WikiError.php
3.84
KB
-rw-r--r--
2011-05-06 23:09
WikiFilePage.php
3.34
KB
-rw-r--r--
2011-07-01 22:07
WikiMap.php
8.19
KB
-rw-r--r--
2016-11-28 20:20
WikiPage.php
78.59
KB
-rw-r--r--
2012-01-12 23:09
Xml.php
26.47
KB
-rw-r--r--
2016-11-28 20:20
XmlSelect.php
3.46
KB
-rw-r--r--
2016-11-28 20:20
XmlTypeCheck.php
2.45
KB
-rw-r--r--
2011-05-21 21:36
ZhClient.php
2.92
KB
-rw-r--r--
2011-05-29 16:25
ZhConversion.php
415
KB
-rw-r--r--
2011-10-27 23:40
ZipDirectoryReader.php
20.35
KB
-rw-r--r--
2011-05-13 18:16
limit.sh
2.86
KB
-rwxr-xr-x
2016-11-28 20:20
mime.info
3.82
KB
-rw-r--r--
2011-06-29 22:31
mime.types
5.18
KB
-rw-r--r--
2011-06-29 22:31
tidy.conf
413
B
-rw-r--r--
2009-10-25 14:43
wp-blog-header.php
2.74
KB
-r--r--r--
2026-08-22 08:29
wp-cron.php
2.74
KB
-rw-r--r--
2026-08-22 08:29
Save
Rename
<?php /** * SpecialPage: handling special pages and lists thereof. * * To add a special page in an extension, add to $wgSpecialPages either * an object instance or an array containing the name and constructor * parameters. The latter is preferred for performance reasons. * * The object instantiated must be either an instance of SpecialPage or a * sub-class thereof. It must have an execute() method, which sends the HTML * for the special page to $wgOut. The parent class has an execute() method * which distributes the call to the historical global functions. Additionally, * execute() also checks if the user has the necessary access privileges * and bails out if not. * * To add a core special page, use the similar static list in * SpecialPage::$mList. To remove a core static special page at runtime, use * a SpecialPage_initList hook. * * @file * @ingroup SpecialPage * @defgroup SpecialPage SpecialPage */ /** * Factory for handling the special page list and generating SpecialPage objects * @ingroup SpecialPage * @since 1.17 */ class SpecialPageFactory { /** * List of special page names to the subclass of SpecialPage which handles them. */ private static $mList = array( // Maintenance Reports 'BrokenRedirects' => 'BrokenRedirectsPage', 'Deadendpages' => 'DeadendpagesPage', 'DoubleRedirects' => 'DoubleRedirectsPage', 'Longpages' => 'LongpagesPage', 'Ancientpages' => 'AncientpagesPage', 'Lonelypages' => 'LonelypagesPage', 'Fewestrevisions' => 'FewestrevisionsPage', 'Withoutinterwiki' => 'WithoutinterwikiPage', 'Protectedpages' => 'SpecialProtectedpages', 'Protectedtitles' => 'SpecialProtectedtitles', 'Shortpages' => 'ShortpagesPage', 'Uncategorizedcategories' => 'UncategorizedcategoriesPage', 'Uncategorizedimages' => 'UncategorizedimagesPage', 'Uncategorizedpages' => 'UncategorizedpagesPage', 'Uncategorizedtemplates' => 'UncategorizedtemplatesPage', 'Unusedcategories' => 'UnusedcategoriesPage', 'Unusedimages' => 'UnusedimagesPage', 'Unusedtemplates' => 'UnusedtemplatesPage', 'Unwatchedpages' => 'UnwatchedpagesPage', 'Wantedcategories' => 'WantedcategoriesPage', 'Wantedfiles' => 'WantedfilesPage', 'Wantedpages' => 'WantedpagesPage', 'Wantedtemplates' => 'WantedtemplatesPage', // List of pages 'Allpages' => 'SpecialAllpages', 'Prefixindex' => 'SpecialPrefixindex', 'Categories' => 'SpecialCategories', 'Disambiguations' => 'DisambiguationsPage', 'Listredirects' => 'ListredirectsPage', // Login/create account 'Userlogin' => 'LoginForm', 'CreateAccount' => 'SpecialCreateAccount', // Users and rights 'Block' => 'SpecialBlock', 'Unblock' => 'SpecialUnblock', 'BlockList' => 'SpecialBlockList', 'ChangePassword' => 'SpecialChangePassword', 'PasswordReset' => 'SpecialPasswordReset', 'DeletedContributions' => 'DeletedContributionsPage', 'Preferences' => 'SpecialPreferences', 'Contributions' => 'SpecialContributions', 'Listgrouprights' => 'SpecialListGroupRights', 'Listusers' => 'SpecialListUsers' , 'Listadmins' => 'SpecialListAdmins', 'Listbots' => 'SpecialListBots', 'Activeusers' => 'SpecialActiveUsers', 'Userrights' => 'UserrightsPage', 'EditWatchlist' => 'SpecialEditWatchlist', // Recent changes and logs 'Newimages' => 'SpecialNewFiles', 'Log' => 'SpecialLog', 'Watchlist' => 'SpecialWatchlist', 'Newpages' => 'SpecialNewpages', 'Recentchanges' => 'SpecialRecentchanges', 'Recentchangeslinked' => 'SpecialRecentchangeslinked', 'Tags' => 'SpecialTags', // Media reports and uploads 'Listfiles' => 'SpecialListFiles', 'Filepath' => 'SpecialFilepath', 'MIMEsearch' => 'MIMEsearchPage', 'FileDuplicateSearch' => 'FileDuplicateSearchPage', 'Upload' => 'SpecialUpload', 'UploadStash' => 'SpecialUploadStash', // Wiki data and tools 'Statistics' => 'SpecialStatistics', 'Allmessages' => 'SpecialAllmessages', 'Version' => 'SpecialVersion', 'Lockdb' => 'SpecialLockdb', 'Unlockdb' => 'SpecialUnlockdb', // Redirecting special pages 'LinkSearch' => 'LinkSearchPage', 'Randompage' => 'Randompage', 'Randomredirect' => 'SpecialRandomredirect', // High use pages 'Mostlinkedcategories' => 'MostlinkedCategoriesPage', 'Mostimages' => 'MostimagesPage', 'Mostlinked' => 'MostlinkedPage', 'Mostlinkedtemplates' => 'MostlinkedTemplatesPage', 'Mostcategories' => 'MostcategoriesPage', 'Mostrevisions' => 'MostrevisionsPage', // Page tools 'ComparePages' => 'SpecialComparePages', 'Export' => 'SpecialExport', 'Import' => 'SpecialImport', 'Undelete' => 'SpecialUndelete', 'Whatlinkshere' => 'SpecialWhatlinkshere', 'MergeHistory' => 'SpecialMergeHistory', // Other 'Booksources' => 'SpecialBookSources', // Unlisted / redirects 'Blankpage' => 'SpecialBlankpage', 'Blockme' => 'SpecialBlockme', 'Emailuser' => 'SpecialEmailUser', 'Movepage' => 'MovePageForm', 'Mycontributions' => 'SpecialMycontributions', 'Mypage' => 'SpecialMypage', 'Mytalk' => 'SpecialMytalk', 'Myuploads' => 'SpecialMyuploads', 'PermanentLink' => 'SpecialPermanentLink', 'Revisiondelete' => 'SpecialRevisionDelete', 'Specialpages' => 'SpecialSpecialpages', 'Userlogout' => 'SpecialUserlogout', ); private static $mAliases; /** * Initialise the special page list * This must be called before accessing SpecialPage::$mList * * @return array */ static function getList() { global $wgSpecialPages; global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication; if ( !is_object( self::$mList ) ) { wfProfileIn( __METHOD__ ); if ( !$wgDisableCounters ) { self::$mList['Popularpages'] = 'PopularpagesPage'; } if ( !$wgDisableInternalSearch ) { self::$mList['Search'] = 'SpecialSearch'; } if ( $wgEmailAuthentication ) { self::$mList['Confirmemail'] = 'EmailConfirmation'; self::$mList['Invalidateemail'] = 'EmailInvalidation'; } // Add extension special pages self::$mList = array_merge( self::$mList, $wgSpecialPages ); // Run hooks // This hook can be used to remove undesired built-in special pages wfRunHooks( 'SpecialPage_initList', array( &self::$mList ) ); // Cast to object: func()[$key] doesn't work, but func()->$key does settype( self::$mList, 'object' ); wfProfileOut( __METHOD__ ); } return self::$mList; } /** * Initialise and return the list of special page aliases. Returns an object with * properties which can be accessed $obj->pagename - each property is an array of * aliases; the first in the array is the cannonical alias. All registered special * pages are guaranteed to have a property entry, and for that property array to * contain at least one entry (English fallbacks will be added if necessary). * @return Object */ static function getAliasList() { if ( !is_object( self::$mAliases ) ) { global $wgContLang; $aliases = $wgContLang->getSpecialPageAliases(); // Objects are passed by reference by default, need to create a copy $missingPages = clone self::getList(); self::$mAliases = array(); foreach ( $aliases as $realName => $aliasList ) { foreach ( $aliasList as $alias ) { self::$mAliases[$wgContLang->caseFold( $alias )] = $realName; } unset( $missingPages->$realName ); } foreach ( $missingPages as $name => $stuff ) { self::$mAliases[$wgContLang->caseFold( $name )] = $name; } // Cast to object: func()[$key] doesn't work, but func()->$key does self::$mAliases = (object)self::$mAliases; } return self::$mAliases; } /** * Given a special page name with a possible subpage, return an array * where the first element is the special page name and the second is the * subpage. * * @param $alias String * @return Array( String, String|null ), or array( null, null ) if the page is invalid */ public static function resolveAlias( $alias ) { global $wgContLang; $bits = explode( '/', $alias, 2 ); $caseFoldedAlias = $wgContLang->caseFold( $bits[0] ); $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias ); if ( isset( self::getAliasList()->$caseFoldedAlias ) ) { $name = self::getAliasList()->$caseFoldedAlias; } else { return array( null, null ); } if ( !isset( $bits[1] ) ) { // bug 2087 $par = null; } else { $par = $bits[1]; } return array( $name, $par ); } /** * Add a page to a certain display group for Special:SpecialPages * * @param $page Mixed: SpecialPage or string * @param $group String */ public static function setGroup( $page, $group ) { global $wgSpecialPageGroups; $name = is_object( $page ) ? $page->mName : $page; $wgSpecialPageGroups[$name] = $group; } /** * Get the group that the special page belongs in on Special:SpecialPage * * @param $page SpecialPage */ public static function getGroup( &$page ) { global $wgSpecialPageGroups; static $specialPageGroupsCache = array(); if ( isset( $specialPageGroupsCache[$page->mName] ) ) { return $specialPageGroupsCache[$page->mName]; } $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $page->mName ) ); if ( !$msg->isBlank() ) { $group = $msg->text(); } else { $group = isset( $wgSpecialPageGroups[$page->mName] ) ? $wgSpecialPageGroups[$page->mName] : '-'; } if ( $group == '-' ) { $group = 'other'; } $specialPageGroupsCache[$page->mName] = $group; return $group; } /** * Check if a given name exist as a special page or as a special page alias * * @param $name String: name of a special page * @return Boolean: true if a special page exists with this name */ public static function exists( $name ) { list( $title, /*...*/ ) = self::resolveAlias( $name ); return property_exists( self::getList(), $title ); } /** * Find the object with a given name and return it (or NULL) * * @param $name String Special page name, may be localised and/or an alias * @return SpecialPage object or null if the page doesn't exist */ public static function getPage( $name ) { list( $realName, /*...*/ ) = self::resolveAlias( $name ); if ( property_exists( self::getList(), $realName ) ) { $rec = self::getList()->$realName; if ( is_string( $rec ) ) { $className = $rec; return new $className; } elseif ( is_array( $rec ) ) { // @deprecated, officially since 1.18, unofficially since forever wfDebug( "Array syntax for \$wgSpecialPages is deprecated, define a subclass of SpecialPage instead." ); $className = array_shift( $rec ); self::getList()->$realName = MWFunction::newObj( $className, $rec ); } return self::getList()->$realName; } else { return null; } } /** * Return categorised listable special pages which are available * for the current user, and everyone. * * @return Array( String => Specialpage ) */ public static function getUsablePages() { global $wgUser; $pages = array(); foreach ( self::getList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page // not null && $page->isListed() && ( !$page->isRestricted() || $page->userCanExecute( $wgUser ) ) ) { $pages[$name] = $page; } } return $pages; } /** * Return categorised listable special pages for all users * * @return Array( String => Specialpage ) */ public static function getRegularPages() { $pages = array(); foreach ( self::getList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page->isListed() && !$page->isRestricted() ) { $pages[$name] = $page; } } return $pages; } /** * Return categorised listable special pages which are available * for the current user, but not for everyone * * @return Array( String => Specialpage ) */ public static function getRestrictedPages() { global $wgUser; $pages = array(); foreach ( self::getList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page->isListed() && $page->isRestricted() && $page->userCanExecute( $wgUser ) ) { $pages[$name] = $page; } } return $pages; } /** * Execute a special page path. * The path may contain parameters, e.g. Special:Name/Params * Extracts the special page name and call the execute method, passing the parameters * * Returns a title object if the page is redirected, false if there was no such special * page, and true if it was successful. * * @param $title Title object * @param $context IContextSource * @param $including Bool output is being captured for use in {{special:whatever}} * * @return bool */ public static function executePath( Title &$title, IContextSource &$context, $including = false ) { wfProfileIn( __METHOD__ ); // @todo FIXME: Redirects broken due to this call $bits = explode( '/', $title->getDBkey(), 2 ); $name = $bits[0]; if ( !isset( $bits[1] ) ) { // bug 2087 $par = null; } else { $par = $bits[1]; } $page = self::getPage( $name ); // Nonexistent? if ( !$page ) { $context->getOutput()->setArticleRelated( false ); $context->getOutput()->setRobotPolicy( 'noindex,nofollow' ); $context->getOutput()->setStatusCode( 404 ); $context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' ); wfProfileOut( __METHOD__ ); return false; } // Page exists, set the context $page->setContext( $context ); if ( !$including ) { // Redirect to canonical alias for GET commands // Not for POST, we'd lose the post data, so it's best to just distribute // the request. Such POST requests are possible for old extensions that // generate self-links without being aware that their default name has // changed. if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) { $query = $context->getRequest()->getQueryValues(); unset( $query['title'] ); $query = wfArrayToCGI( $query ); $title = $page->getTitle( $par ); $url = $title->getFullUrl( $query ); $context->getOutput()->redirect( $url ); wfProfileOut( __METHOD__ ); return $title; } else { $context->setTitle( $page->getTitle( $par ) ); } } elseif ( !$page->isIncludable() ) { wfProfileOut( __METHOD__ ); return false; } $page->including( $including ); // Execute special page $profName = 'Special:' . $page->getName(); wfProfileIn( $profName ); $page->execute( $par ); wfProfileOut( $profName ); wfProfileOut( __METHOD__ ); return true; } /** * Just like executePath() except it returns the HTML instead of outputting it * Returns false if there was no such special page, or a title object if it was * a redirect. * * Also saves the current $wgTitle, $wgOut, and $wgRequest variables so that * the special page will get the context it'd expect on a normal request, * and then restores them to their previous values after. * * @param $title Title * * @return String: HTML fragment */ static function capturePath( &$title ) { global $wgOut, $wgTitle, $wgRequest; $oldTitle = $wgTitle; $oldOut = $wgOut; $oldRequest = $wgRequest; // Don't want special pages interpreting ?feed=atom parameters. $wgRequest = new FauxRequest( array() ); $context = new RequestContext; $context->setTitle( $title ); $context->setRequest( $wgRequest ); $wgOut = $context->getOutput(); $ret = self::executePath( $title, $context, true ); if ( $ret === true ) { $ret = $wgOut->getHTML(); } $wgTitle = $oldTitle; $wgOut = $oldOut; $wgRequest = $oldRequest; return $ret; } /** * Get the local name for a specified canonical name * * @param $name String * @param $subpage String|Bool * * @return String */ static function getLocalNameFor( $name, $subpage = false ) { global $wgContLang; $aliases = $wgContLang->getSpecialPageAliases(); if ( isset( $aliases[$name][0] ) ) { $name = $aliases[$name][0]; } else { // Try harder in case someone misspelled the correct casing $found = false; foreach ( $aliases as $n => $values ) { if ( strcasecmp( $name, $n ) === 0 ) { wfWarn( "Found alias defined for $n when searching for " . "special page aliases for $name. Case mismatch?" ); $name = $values[0]; $found = true; break; } } if ( !$found ) { wfWarn( "Did not find alias for special page '$name'. " . "Perhaps no aliases are defined for it?" ); } } if ( $subpage !== false && !is_null( $subpage ) ) { $name = "$name/$subpage"; } return $wgContLang->ucfirst( $name ); } /** * Get a title for a given alias * * @param $alias String * * @return Title or null if there is no such alias */ static function getTitleForAlias( $alias ) { $name = self::resolveAlias( $alias ); if ( $name ) { return SpecialPage::getTitleFor( $name ); } else { return null; } } }