summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
committerPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
commit222b01f5169f1c7e69762e0e8904c24f78f71882 (patch)
tree8e932e12546bb991357ec48eb1638d1770be7a35
parent00ab76a6b686e98a914afc1975812d2b1aaa7016 (diff)
update to MediaWiki 1.16.0
-rw-r--r--.gitignore1
-rw-r--r--AdminSettings.sample32
-rw-r--r--CREDITS41
-rw-r--r--FAQ7
-rw-r--r--HISTORY410
-rw-r--r--Makefile28
-rw-r--r--RELEASE-NOTES1376
-rw-r--r--StartProfiler.sample (renamed from StartProfiler.php)3
-rw-r--r--UPGRADE23
-rw-r--r--api.php87
-rw-r--r--cache/.htaccess (renamed from t/.htaccess)0
-rw-r--r--config/Installer.php2350
-rw-r--r--config/index.php2191
-rw-r--r--config/index.php52
-rw-r--r--docs/design.txt2
-rw-r--r--docs/distributors.txt192
-rw-r--r--docs/export-0.4.xsd212
-rw-r--r--docs/export-demo.xml21
-rw-r--r--docs/hooks.txt755
-rw-r--r--docs/maintenance.txt57
-rw-r--r--docs/memcached.txt15
-rw-r--r--docs/php-memcached/ChangeLog65
-rw-r--r--docs/php-memcached/README1
-rw-r--r--docs/scripts.txt7
-rw-r--r--docs/skin.txt2
-rw-r--r--docs/upload.txt42
-rw-r--r--extensions/FluxBBAuthPlugin.php15
-rw-r--r--img_auth.php128
-rw-r--r--includes/AjaxDispatcher.php35
-rw-r--r--includes/AjaxFunctions.php96
-rw-r--r--includes/AjaxResponse.php44
-rw-r--r--includes/Article.php2217
-rw-r--r--includes/AuthPlugin.php47
-rw-r--r--includes/AutoLoader.php217
-rw-r--r--includes/Autopromote.php7
-rw-r--r--includes/BacklinkCache.php73
-rw-r--r--includes/BagOStuff.php660
-rw-r--r--includes/Block.php185
-rw-r--r--includes/CacheDependency.php43
-rw-r--r--includes/Category.php80
-rw-r--r--includes/CategoryPage.php233
-rw-r--r--includes/Categoryfinder.php142
-rw-r--r--includes/Cdb.php149
-rw-r--r--includes/Cdb_PHP.php374
-rw-r--r--includes/ChangeTags.php98
-rw-r--r--includes/ChangesFeed.php68
-rw-r--r--includes/ChangesList.php519
-rw-r--r--includes/ConfEditor.php1058
-rw-r--r--includes/Credits.php70
-rw-r--r--includes/DatabaseFunctions.php2
-rw-r--r--includes/DefaultSettings.php850
-rw-r--r--includes/Defines.php5
-rw-r--r--includes/DjVuImage.php26
-rw-r--r--includes/DoubleRedirectJob.php12
-rw-r--r--includes/EditPage.php1575
-rw-r--r--includes/Exception.php18
-rw-r--r--includes/Exif.php18
-rw-r--r--includes/Export.php73
-rw-r--r--includes/ExternalStore.php48
-rw-r--r--includes/ExternalStoreDB.php49
-rw-r--r--includes/ExternalStoreHttp.php18
-rw-r--r--includes/ExternalUser.php304
-rw-r--r--includes/FakeTitle.php83
-rw-r--r--includes/Feed.php111
-rw-r--r--includes/FeedUtils.php76
-rw-r--r--includes/FileDeleteForm.php60
-rw-r--r--includes/FileRevertForm.php13
-rw-r--r--includes/FileStore.php360
-rw-r--r--includes/ForkController.php24
-rw-r--r--includes/GlobalFunctions.php847
-rw-r--r--includes/HTMLCacheUpdate.php143
-rw-r--r--includes/HTMLFileCache.php21
-rw-r--r--includes/HTMLForm.php1391
-rw-r--r--includes/HistoryPage.php730
-rw-r--r--includes/Hooks.php80
-rw-r--r--includes/Html.php539
-rw-r--r--includes/HttpFunctions.php929
-rw-r--r--includes/IP.php160
-rw-r--r--includes/ImageFunctions.php6
-rw-r--r--includes/ImageGallery.php37
-rw-r--r--includes/ImagePage.php361
-rw-r--r--includes/ImageQueryPage.php18
-rw-r--r--includes/Import.php63
-rw-r--r--includes/Interwiki.php133
-rw-r--r--includes/JSMin.php290
-rw-r--r--includes/JobQueue.php42
-rw-r--r--includes/Licenses.php79
-rw-r--r--includes/LinkCache.php22
-rw-r--r--includes/LinkFilter.php84
-rw-r--r--includes/Linker.php1135
-rw-r--r--includes/LinksUpdate.php7
-rw-r--r--includes/LocalisationCache.php999
-rw-r--r--includes/LogEventsList.php628
-rw-r--r--includes/LogPage.php115
-rw-r--r--includes/MagicWord.php91
-rw-r--r--includes/Math.php39
-rw-r--r--includes/MediaTransformOutput.php30
-rw-r--r--includes/MessageCache.php295
-rw-r--r--includes/MimeMagic.php40
-rw-r--r--includes/Namespace.php47
-rw-r--r--includes/ObjectCache.php13
-rw-r--r--includes/OutputHandler.php22
-rw-r--r--includes/OutputPage.php1738
-rw-r--r--includes/PageHistory.php630
-rw-r--r--includes/Pager.php213
-rw-r--r--includes/PatrolLog.php36
-rw-r--r--includes/PoolCounter.php64
-rw-r--r--includes/Preferences.php1389
-rw-r--r--includes/PrefixSearch.php53
-rw-r--r--includes/Profiler.php15
-rw-r--r--includes/ProfilerSimpleText.php4
-rw-r--r--includes/ProtectionForm.php104
-rw-r--r--includes/ProxyTools.php29
-rw-r--r--includes/QueryPage.php174
-rw-r--r--includes/RawPage.php35
-rw-r--r--includes/RecentChange.php273
-rw-r--r--includes/RefreshLinksJob.php3
-rw-r--r--includes/Revision.php356
-rw-r--r--includes/Sanitizer.php392
-rw-r--r--includes/SearchMySQL.php270
-rw-r--r--includes/Setup.php100
-rw-r--r--includes/SiteConfiguration.php17
-rw-r--r--includes/SiteStats.php168
-rw-r--r--includes/Skin.php1064
-rw-r--r--includes/SkinTemplate.php593
-rw-r--r--includes/SpecialPage.php104
-rw-r--r--includes/SquidPurgeClient.php380
-rw-r--r--includes/SquidUpdate.php137
-rw-r--r--includes/Status.php16
-rw-r--r--includes/StreamFile.php7
-rw-r--r--includes/StubObject.php16
-rw-r--r--includes/Title.php740
-rw-r--r--includes/User.php829
-rw-r--r--includes/UserMailer.php19
-rw-r--r--includes/UserRightsProxy.php73
-rw-r--r--includes/WatchedItem.php4
-rw-r--r--includes/WatchlistEditor.php37
-rw-r--r--includes/WebRequest.php190
-rw-r--r--includes/WebResponse.php30
-rw-r--r--includes/WebStart.php7
-rw-r--r--includes/Wiki.php96
-rw-r--r--includes/WikiMap.php161
-rw-r--r--includes/Xml.php75
-rw-r--r--includes/ZhConversion.php1781
-rw-r--r--includes/api/ApiBase.php955
-rw-r--r--includes/api/ApiBlock.php105
-rw-r--r--includes/api/ApiDelete.php203
-rw-r--r--includes/api/ApiDisabled.php23
-rw-r--r--includes/api/ApiEditPage.php385
-rw-r--r--includes/api/ApiEmailUser.php34
-rw-r--r--includes/api/ApiExpandTemplates.php17
-rw-r--r--includes/api/ApiFeedWatchlist.php80
-rw-r--r--includes/api/ApiFormatBase.php115
-rw-r--r--includes/api/ApiFormatDbg.php18
-rw-r--r--includes/api/ApiFormatJson.php44
-rw-r--r--includes/api/ApiFormatPhp.php12
-rw-r--r--includes/api/ApiFormatRaw.php28
-rw-r--r--includes/api/ApiFormatTxt.php18
-rw-r--r--includes/api/ApiFormatWddx.php77
-rw-r--r--includes/api/ApiFormatXml.php117
-rw-r--r--includes/api/ApiFormatYaml.php12
-rw-r--r--includes/api/ApiFormatYaml_spyc.php98
-rw-r--r--includes/api/ApiHelp.php12
-rw-r--r--includes/api/ApiImport.php98
-rw-r--r--includes/api/ApiLogin.php99
-rw-r--r--includes/api/ApiLogout.php12
-rw-r--r--includes/api/ApiMain.php347
-rw-r--r--includes/api/ApiMove.php159
-rw-r--r--includes/api/ApiOpenSearch.php38
-rw-r--r--includes/api/ApiPageSet.php257
-rw-r--r--includes/api/ApiParamInfo.php134
-rw-r--r--includes/api/ApiParse.php194
-rw-r--r--includes/api/ApiPatrol.php50
-rw-r--r--includes/api/ApiProtect.php146
-rw-r--r--includes/api/ApiPurge.php41
-rw-r--r--includes/api/ApiQuery.php243
-rw-r--r--includes/api/ApiQueryAllCategories.php92
-rw-r--r--includes/api/ApiQueryAllLinks.php135
-rw-r--r--includes/api/ApiQueryAllUsers.php148
-rw-r--r--includes/api/ApiQueryAllimages.php121
-rw-r--r--includes/api/ApiQueryAllmessages.php118
-rw-r--r--includes/api/ApiQueryAllpages.php162
-rw-r--r--includes/api/ApiQueryBacklinks.php338
-rw-r--r--includes/api/ApiQueryBase.php196
-rw-r--r--includes/api/ApiQueryBlocks.php205
-rw-r--r--includes/api/ApiQueryCategories.php179
-rw-r--r--includes/api/ApiQueryCategoryInfo.php66
-rw-r--r--includes/api/ApiQueryCategoryMembers.php186
-rw-r--r--includes/api/ApiQueryDeletedrevs.php257
-rw-r--r--includes/api/ApiQueryDisabled.php12
-rw-r--r--includes/api/ApiQueryDuplicateFiles.php97
-rw-r--r--includes/api/ApiQueryExtLinksUsage.php125
-rw-r--r--includes/api/ApiQueryExternalLinks.php50
-rw-r--r--includes/api/ApiQueryImageInfo.php229
-rw-r--r--includes/api/ApiQueryImages.php101
-rw-r--r--includes/api/ApiQueryInfo.php447
-rw-r--r--includes/api/ApiQueryLangLinks.php75
-rw-r--r--includes/api/ApiQueryLinks.php120
-rw-r--r--includes/api/ApiQueryLogEvents.php274
-rw-r--r--includes/api/ApiQueryProtectedTitles.php112
-rw-r--r--includes/api/ApiQueryRandom.php82
-rw-r--r--includes/api/ApiQueryRecentChanges.php383
-rw-r--r--includes/api/ApiQueryRevisions.php435
-rw-r--r--includes/api/ApiQuerySearch.php129
-rw-r--r--includes/api/ApiQuerySiteinfo.php198
-rw-r--r--includes/api/ApiQueryTags.php181
-rw-r--r--includes/api/ApiQueryUserContributions.php305
-rw-r--r--includes/api/ApiQueryUserInfo.php99
-rw-r--r--includes/api/ApiQueryUsers.php202
-rw-r--r--includes/api/ApiQueryWatchlist.php316
-rw-r--r--includes/api/ApiQueryWatchlistRaw.php118
-rw-r--r--includes/api/ApiResult.php168
-rw-r--r--includes/api/ApiRollback.php76
-rw-r--r--includes/api/ApiUnblock.php59
-rw-r--r--includes/api/ApiUndelete.php87
-rw-r--r--includes/api/ApiUpload.php325
-rw-r--r--includes/api/ApiUserrights.php128
-rw-r--r--includes/api/ApiWatch.php46
-rw-r--r--includes/cbt/CBTCompiler.php366
-rw-r--r--includes/cbt/CBTProcessor.php539
-rw-r--r--includes/cbt/README108
-rw-r--r--includes/db/Database.php812
-rw-r--r--includes/db/DatabaseIbm_db2.php908
-rw-r--r--includes/db/DatabaseMssql.php86
-rw-r--r--includes/db/DatabaseMysql.php453
-rw-r--r--includes/db/DatabaseOracle.php1049
-rw-r--r--includes/db/DatabasePostgres.php184
-rw-r--r--includes/db/DatabaseSqlite.php432
-rw-r--r--includes/db/LBFactory.php14
-rw-r--r--includes/db/LoadBalancer.php21
-rw-r--r--includes/diff/DifferenceEngine.php933
-rw-r--r--includes/diff/DifferenceInterface.php1021
-rw-r--r--includes/diff/HTMLDiff.php1009
-rw-r--r--includes/diff/Nodes.php439
-rw-r--r--includes/extauth/Hardcoded.php79
-rw-r--r--includes/extauth/MediaWiki.php141
-rw-r--r--includes/extauth/vB.php140
-rw-r--r--includes/filerepo/ArchivedFile.php68
-rw-r--r--includes/filerepo/FSRepo.php103
-rw-r--r--includes/filerepo/File.php76
-rw-r--r--includes/filerepo/FileCache.php156
-rw-r--r--includes/filerepo/FileRepo.php175
-rw-r--r--includes/filerepo/ForeignAPIFile.php11
-rw-r--r--includes/filerepo/ForeignAPIRepo.php114
-rw-r--r--includes/filerepo/ForeignDBFile.php10
-rw-r--r--includes/filerepo/ForeignDBRepo.php15
-rw-r--r--includes/filerepo/ForeignDBViaLBRepo.php15
-rw-r--r--includes/filerepo/Image.php4
-rw-r--r--includes/filerepo/LocalFile.php224
-rw-r--r--includes/filerepo/LocalRepo.php97
-rw-r--r--includes/filerepo/NullRepo.php8
-rw-r--r--includes/filerepo/OldLocalFile.php24
-rw-r--r--includes/filerepo/RepoGroup.php124
-rw-r--r--includes/json/FormatJson.php32
-rw-r--r--includes/json/Services_JSON.php (renamed from includes/api/ApiFormatJson_json.php)20
-rw-r--r--includes/media/Bitmap.php121
-rw-r--r--includes/media/DjVu.php48
-rw-r--r--includes/media/GIF.php72
-rw-r--r--includes/media/GIFMetadataExtractor.php175
-rw-r--r--includes/media/Generic.php44
-rw-r--r--includes/media/SVG.php2
-rw-r--r--includes/memcached-client.php1990
-rw-r--r--includes/mime.types6
-rw-r--r--includes/normal/RandomTest.php2
-rw-r--r--includes/normal/Utf8CaseGenerate.php2
-rw-r--r--includes/normal/Utf8Test.php2
-rw-r--r--includes/normal/UtfNormal.php8
-rw-r--r--includes/normal/UtfNormalData.inc10
-rw-r--r--includes/normal/UtfNormalDataK.inc4
-rw-r--r--includes/normal/UtfNormalGenerate.php8
-rw-r--r--includes/parser/CoreParserFunctions.php148
-rw-r--r--includes/parser/CoreTagHooks.php49
-rw-r--r--includes/parser/DateFormatter.php10
-rw-r--r--includes/parser/LinkHolderArray.php3
-rw-r--r--includes/parser/Parser.php1121
-rw-r--r--includes/parser/ParserCache.php75
-rw-r--r--includes/parser/ParserOptions.php27
-rw-r--r--includes/parser/ParserOutput.php31
-rw-r--r--includes/parser/Preprocessor.php15
-rw-r--r--includes/parser/Preprocessor_DOM.php31
-rw-r--r--includes/parser/Preprocessor_Hash.php18
-rw-r--r--includes/search/SearchEngine.php (renamed from includes/SearchEngine.php)325
-rw-r--r--includes/search/SearchIBM_DB2.php (renamed from includes/SearchIBM_DB2.php)89
-rw-r--r--includes/search/SearchMySQL.php412
-rw-r--r--includes/search/SearchMySQL4.php (renamed from includes/SearchMySQL4.php)0
-rw-r--r--includes/search/SearchOracle.php (renamed from includes/SearchOracle.php)136
-rw-r--r--includes/search/SearchPostgres.php (renamed from includes/SearchPostgres.php)21
-rw-r--r--includes/search/SearchSqlite.php344
-rw-r--r--includes/search/SearchUpdate.php (renamed from includes/SearchUpdate.php)6
-rw-r--r--includes/specials/SpecialActiveusers.php195
-rw-r--r--includes/specials/SpecialAllmessages.php581
-rw-r--r--includes/specials/SpecialAllpages.php180
-rw-r--r--includes/specials/SpecialAncientpages.php28
-rw-r--r--includes/specials/SpecialBlankpage.php19
-rw-r--r--includes/specials/SpecialBlockip.php433
-rw-r--r--includes/specials/SpecialBooksources.php4
-rw-r--r--includes/specials/SpecialBrokenRedirects.php42
-rw-r--r--includes/specials/SpecialCategories.php13
-rw-r--r--includes/specials/SpecialConfirmemail.php14
-rw-r--r--includes/specials/SpecialContributions.php318
-rw-r--r--includes/specials/SpecialDeletedContributions.php243
-rw-r--r--includes/specials/SpecialDisambiguations.php2
-rw-r--r--includes/specials/SpecialDoubleRedirects.php28
-rw-r--r--includes/specials/SpecialEmailuser.php23
-rw-r--r--includes/specials/SpecialExport.php69
-rw-r--r--includes/specials/SpecialFewestrevisions.php21
-rw-r--r--includes/specials/SpecialFileDuplicateSearch.php23
-rw-r--r--includes/specials/SpecialFilepath.php4
-rw-r--r--includes/specials/SpecialImport.php15
-rw-r--r--includes/specials/SpecialIpblocklist.php64
-rw-r--r--includes/specials/SpecialLinkSearch.php18
-rw-r--r--includes/specials/SpecialListUserRestrictions.php162
-rw-r--r--includes/specials/SpecialListfiles.php22
-rw-r--r--includes/specials/SpecialListgrouprights.php74
-rw-r--r--includes/specials/SpecialListredirects.php9
-rw-r--r--includes/specials/SpecialListusers.php34
-rw-r--r--includes/specials/SpecialLockdb.php6
-rw-r--r--includes/specials/SpecialLog.php12
-rw-r--r--includes/specials/SpecialMIMEsearch.php20
-rw-r--r--includes/specials/SpecialMergeHistory.php38
-rw-r--r--includes/specials/SpecialMostlinked.php37
-rw-r--r--includes/specials/SpecialMostlinkedcategories.php2
-rw-r--r--includes/specials/SpecialMostlinkedtemplates.php33
-rw-r--r--includes/specials/SpecialMostrevisions.php9
-rw-r--r--includes/specials/SpecialMovepage.php138
-rw-r--r--includes/specials/SpecialNewimages.php81
-rw-r--r--includes/specials/SpecialNewpages.php38
-rw-r--r--includes/specials/SpecialPopularpages.php12
-rw-r--r--includes/specials/SpecialPreferences.php1315
-rw-r--r--includes/specials/SpecialPrefixindex.php28
-rw-r--r--includes/specials/SpecialProtectedpages.php47
-rw-r--r--includes/specials/SpecialProtectedtitles.php6
-rw-r--r--includes/specials/SpecialRandompage.php61
-rw-r--r--includes/specials/SpecialRandomredirect.php5
-rw-r--r--includes/specials/SpecialRecentchanges.php112
-rw-r--r--includes/specials/SpecialRecentchangeslinked.php72
-rw-r--r--includes/specials/SpecialRemoveRestrictions.php10
-rw-r--r--includes/specials/SpecialResetpass.php76
-rw-r--r--includes/specials/SpecialRestrictUser.php190
-rw-r--r--includes/specials/SpecialRevisiondelete.php2801
-rw-r--r--includes/specials/SpecialSearch.php1417
-rw-r--r--includes/specials/SpecialShortpages.php11
-rw-r--r--includes/specials/SpecialSpecialpages.php6
-rw-r--r--includes/specials/SpecialStatistics.php70
-rw-r--r--includes/specials/SpecialTags.php12
-rw-r--r--includes/specials/SpecialUncategorizedtemplates.php2
-rw-r--r--includes/specials/SpecialUndelete.php366
-rw-r--r--includes/specials/SpecialUnlockdb.php6
-rw-r--r--includes/specials/SpecialUnusedcategories.php2
-rw-r--r--includes/specials/SpecialUnusedimages.php16
-rw-r--r--includes/specials/SpecialUnusedtemplates.php13
-rw-r--r--includes/specials/SpecialUnwatchedpages.php12
-rw-r--r--includes/specials/SpecialUpload.php2374
-rw-r--r--includes/specials/SpecialUploadMogile.php135
-rw-r--r--includes/specials/SpecialUserlogin.php215
-rw-r--r--includes/specials/SpecialUserlogout.php10
-rw-r--r--includes/specials/SpecialUserrights.php390
-rw-r--r--includes/specials/SpecialVersion.php312
-rw-r--r--includes/specials/SpecialWantedcategories.php39
-rw-r--r--includes/specials/SpecialWantedfiles.php59
-rw-r--r--includes/specials/SpecialWantedpages.php93
-rw-r--r--includes/specials/SpecialWantedtemplates.php59
-rw-r--r--includes/specials/SpecialWatchlist.php120
-rw-r--r--includes/specials/SpecialWhatlinkshere.php84
-rw-r--r--includes/specials/SpecialWithoutinterwiki.php11
-rw-r--r--includes/templates/NoLocalSettings.php4
-rw-r--r--includes/templates/PHP4.php4
-rw-r--r--includes/templates/Userlogin.php111
-rw-r--r--includes/upload/UploadBase.php1091
-rw-r--r--includes/upload/UploadFromFile.php32
-rw-r--r--includes/upload/UploadFromStash.php84
-rw-r--r--includes/upload/UploadFromUrl.php137
-rw-r--r--includes/zhtable/Makefile2
-rw-r--r--includes/zhtable/Makefile.py83
-rw-r--r--includes/zhtable/simp2trad.manual459
-rw-r--r--includes/zhtable/simpphrases.manual122
-rw-r--r--includes/zhtable/simpphrases_exclude.manual4
-rw-r--r--includes/zhtable/toCN.manual12
-rw-r--r--includes/zhtable/toHK.manual206
-rw-r--r--includes/zhtable/toSimp.manual25
-rw-r--r--includes/zhtable/toTW.manual59
-rw-r--r--includes/zhtable/toTrad.manual77
-rw-r--r--includes/zhtable/trad2simp.manual265
-rw-r--r--includes/zhtable/tradphrases.manual972
-rw-r--r--includes/zhtable/tradphrases_exclude.manual53
-rw-r--r--index.php7
-rw-r--r--languages/Language.php1075
-rw-r--r--languages/LanguageConverter.php1533
-rw-r--r--languages/Names.php84
-rw-r--r--languages/classes/LanguageAm.php16
-rw-r--r--languages/classes/LanguageAr.php31
-rw-r--r--languages/classes/LanguageBe.php3
-rw-r--r--languages/classes/LanguageBe_tarask.php3
-rw-r--r--languages/classes/LanguageBh.php16
-rw-r--r--languages/classes/LanguageBs.php2
-rw-r--r--languages/classes/LanguageCy.php3
-rw-r--r--languages/classes/LanguageEo.php3
-rw-r--r--languages/classes/LanguageGa.php16
-rw-r--r--languages/classes/LanguageGan.php30
-rw-r--r--languages/classes/LanguageGd.php35
-rw-r--r--languages/classes/LanguageHi.php16
-rw-r--r--languages/classes/LanguageHr.php2
-rw-r--r--languages/classes/LanguageJa.php27
-rw-r--r--languages/classes/LanguageKk.php13
-rw-r--r--languages/classes/LanguageKu.php10
-rw-r--r--languages/classes/LanguageLn.php18
-rw-r--r--languages/classes/LanguageLv.php3
-rw-r--r--languages/classes/LanguageMg.php16
-rw-r--r--languages/classes/LanguageMk.php21
-rw-r--r--languages/classes/LanguageMl.php22
-rw-r--r--languages/classes/LanguageMo.php23
-rw-r--r--languages/classes/LanguageNso.php16
-rw-r--r--languages/classes/LanguagePl.php8
-rw-r--r--languages/classes/LanguageRo.php23
-rw-r--r--languages/classes/LanguageRu.php2
-rw-r--r--languages/classes/LanguageSe.php22
-rw-r--r--languages/classes/LanguageSh.php29
-rw-r--r--languages/classes/LanguageSma.php22
-rw-r--r--languages/classes/LanguageSr.php36
-rw-r--r--languages/classes/LanguageTi.php16
-rw-r--r--languages/classes/LanguageTl.php16
-rw-r--r--languages/classes/LanguageTr.php2
-rw-r--r--languages/classes/LanguageUk.php2
-rw-r--r--languages/classes/LanguageWa.php12
-rw-r--r--languages/classes/LanguageYue.php31
-rw-r--r--languages/classes/LanguageZh.php39
-rw-r--r--languages/classes/LanguageZh_hans.php43
-rw-r--r--languages/messages/MessagesAb.php45
-rw-r--r--languages/messages/MessagesAce.php107
-rw-r--r--languages/messages/MessagesAf.php1034
-rw-r--r--languages/messages/MessagesAk.php2
-rw-r--r--languages/messages/MessagesAln.php457
-rw-r--r--languages/messages/MessagesAls.php3
-rw-r--r--languages/messages/MessagesAm.php268
-rw-r--r--languages/messages/MessagesAn.php987
-rw-r--r--languages/messages/MessagesAng.php260
-rw-r--r--languages/messages/MessagesAr.php1175
-rw-r--r--languages/messages/MessagesArc.php437
-rw-r--r--languages/messages/MessagesArn.php89
-rw-r--r--languages/messages/MessagesArz.php1290
-rw-r--r--languages/messages/MessagesAs.php394
-rw-r--r--languages/messages/MessagesAst.php376
-rw-r--r--languages/messages/MessagesAv.php17
-rw-r--r--languages/messages/MessagesAvk.php217
-rw-r--r--languages/messages/MessagesAy.php22
-rw-r--r--languages/messages/MessagesAz.php533
-rw-r--r--languages/messages/MessagesBa.php608
-rw-r--r--languages/messages/MessagesBar.php110
-rw-r--r--languages/messages/MessagesBat_smg.php232
-rw-r--r--languages/messages/MessagesBcc.php713
-rw-r--r--languages/messages/MessagesBcl.php423
-rw-r--r--languages/messages/MessagesBe.php509
-rw-r--r--languages/messages/MessagesBe_tarask.php964
-rw-r--r--languages/messages/MessagesBe_x_old.php3
-rw-r--r--languages/messages/MessagesBg.php923
-rw-r--r--languages/messages/MessagesBh.php119
-rw-r--r--languages/messages/MessagesBi.php10
-rw-r--r--languages/messages/MessagesBm.php15
-rw-r--r--languages/messages/MessagesBn.php612
-rw-r--r--languages/messages/MessagesBo.php24
-rw-r--r--languages/messages/MessagesBpy.php359
-rw-r--r--languages/messages/MessagesBqi.php104
-rw-r--r--languages/messages/MessagesBr.php971
-rw-r--r--languages/messages/MessagesBs.php1054
-rw-r--r--languages/messages/MessagesBug.php72
-rw-r--r--languages/messages/MessagesCa.php958
-rw-r--r--languages/messages/MessagesCbk_zam.php9
-rw-r--r--languages/messages/MessagesCdo.php213
-rw-r--r--languages/messages/MessagesCe.php200
-rw-r--r--languages/messages/MessagesCeb.php485
-rw-r--r--languages/messages/MessagesCh.php197
-rw-r--r--languages/messages/MessagesChr.php14
-rw-r--r--languages/messages/MessagesCkb.php12
-rw-r--r--languages/messages/MessagesCkb_arab.php2997
-rw-r--r--languages/messages/MessagesCkb_latn.php12
-rw-r--r--languages/messages/MessagesCo.php55
-rw-r--r--languages/messages/MessagesCps.php946
-rw-r--r--languages/messages/MessagesCrh.php3
-rw-r--r--languages/messages/MessagesCrh_cyrl.php555
-rw-r--r--languages/messages/MessagesCrh_latn.php556
-rw-r--r--languages/messages/MessagesCs.php1116
-rw-r--r--languages/messages/MessagesCsb.php117
-rw-r--r--languages/messages/MessagesCu.php125
-rw-r--r--languages/messages/MessagesCv.php224
-rw-r--r--languages/messages/MessagesCy.php1039
-rw-r--r--languages/messages/MessagesDa.php968
-rw-r--r--languages/messages/MessagesDe.php1084
-rw-r--r--languages/messages/MessagesDe_ch.php5
-rw-r--r--languages/messages/MessagesDe_formal.php125
-rw-r--r--languages/messages/MessagesDiq.php933
-rw-r--r--languages/messages/MessagesDk.php3
-rw-r--r--languages/messages/MessagesDsb.php963
-rw-r--r--languages/messages/MessagesDv.php50
-rw-r--r--languages/messages/MessagesDz.php95
-rw-r--r--languages/messages/MessagesEe.php134
-rw-r--r--languages/messages/MessagesEl.php974
-rw-r--r--languages/messages/MessagesEml.php12
-rw-r--r--languages/messages/MessagesEn.php1192
-rw-r--r--languages/messages/MessagesEnRTL.php3
-rw-r--r--languages/messages/MessagesEn_gb.php2
-rw-r--r--languages/messages/MessagesEo.php964
-rw-r--r--languages/messages/MessagesEs.php1112
-rw-r--r--languages/messages/MessagesEt.php1134
-rw-r--r--languages/messages/MessagesEu.php922
-rw-r--r--languages/messages/MessagesExt.php327
-rw-r--r--languages/messages/MessagesFa.php984
-rw-r--r--languages/messages/MessagesFf.php2
-rw-r--r--languages/messages/MessagesFi.php956
-rw-r--r--languages/messages/MessagesFiu_vro.php3
-rw-r--r--languages/messages/MessagesFj.php18
-rw-r--r--languages/messages/MessagesFo.php151
-rw-r--r--languages/messages/MessagesFr.php1186
-rw-r--r--languages/messages/MessagesFrc.php245
-rw-r--r--languages/messages/MessagesFrp.php1235
-rw-r--r--languages/messages/MessagesFrr.php1213
-rw-r--r--languages/messages/MessagesFur.php603
-rw-r--r--languages/messages/MessagesFy.php496
-rw-r--r--languages/messages/MessagesGa.php438
-rw-r--r--languages/messages/MessagesGag.php184
-rw-r--r--languages/messages/MessagesGan.php2179
-rw-r--r--languages/messages/MessagesGan_hans.php347
-rw-r--r--languages/messages/MessagesGan_hant.php372
-rw-r--r--languages/messages/MessagesGd.php151
-rw-r--r--languages/messages/MessagesGl.php1090
-rw-r--r--languages/messages/MessagesGlk.php8
-rw-r--r--languages/messages/MessagesGn.php43
-rw-r--r--languages/messages/MessagesGot.php44
-rw-r--r--languages/messages/MessagesGrc.php746
-rw-r--r--languages/messages/MessagesGsw.php966
-rw-r--r--languages/messages/MessagesGu.php420
-rw-r--r--languages/messages/MessagesGv.php175
-rw-r--r--languages/messages/MessagesHa.php721
-rw-r--r--languages/messages/MessagesHak.php272
-rw-r--r--languages/messages/MessagesHaw.php287
-rw-r--r--languages/messages/MessagesHe.php1321
-rw-r--r--languages/messages/MessagesHi.php758
-rw-r--r--languages/messages/MessagesHif.php3
-rw-r--r--languages/messages/MessagesHif_latn.php949
-rw-r--r--languages/messages/MessagesHil.php52
-rw-r--r--languages/messages/MessagesHr.php967
-rw-r--r--languages/messages/MessagesHsb.php951
-rw-r--r--languages/messages/MessagesHt.php178
-rw-r--r--languages/messages/MessagesHu.php1022
-rw-r--r--languages/messages/MessagesHy.php699
-rw-r--r--languages/messages/MessagesIa.php960
-rw-r--r--languages/messages/MessagesId.php1366
-rw-r--r--languages/messages/MessagesIe.php36
-rw-r--r--languages/messages/MessagesIg.php274
-rw-r--r--languages/messages/MessagesIke_cans.php57
-rw-r--r--languages/messages/MessagesIke_latn.php53
-rw-r--r--languages/messages/MessagesIlo.php225
-rw-r--r--languages/messages/MessagesInh.php28
-rw-r--r--languages/messages/MessagesIo.php496
-rw-r--r--languages/messages/MessagesIs.php501
-rw-r--r--languages/messages/MessagesIt.php1006
-rw-r--r--languages/messages/MessagesIu.php3
-rw-r--r--languages/messages/MessagesJa.php1096
-rw-r--r--languages/messages/MessagesJbo.php25
-rw-r--r--languages/messages/MessagesJut.php130
-rw-r--r--languages/messages/MessagesJv.php733
-rw-r--r--languages/messages/MessagesKa.php958
-rw-r--r--languages/messages/MessagesKaa.php248
-rw-r--r--languages/messages/MessagesKab.php238
-rw-r--r--languages/messages/MessagesKg.php12
-rw-r--r--languages/messages/MessagesKiu.php1411
-rw-r--r--languages/messages/MessagesKk_arab.php564
-rw-r--r--languages/messages/MessagesKk_cn.php3
-rw-r--r--languages/messages/MessagesKk_cyrl.php595
-rw-r--r--languages/messages/MessagesKk_kz.php3
-rw-r--r--languages/messages/MessagesKk_latn.php562
-rw-r--r--languages/messages/MessagesKk_tr.php3
-rw-r--r--languages/messages/MessagesKl.php197
-rw-r--r--languages/messages/MessagesKm.php943
-rw-r--r--languages/messages/MessagesKn.php389
-rw-r--r--languages/messages/MessagesKo.php1029
-rw-r--r--languages/messages/MessagesKo_kp.php33
-rw-r--r--languages/messages/MessagesKoi.php630
-rw-r--r--languages/messages/MessagesKrc.php3219
-rw-r--r--languages/messages/MessagesKri.php41
-rw-r--r--languages/messages/MessagesKrj.php33
-rw-r--r--languages/messages/MessagesKs.php3
-rw-r--r--languages/messages/MessagesKsh.php975
-rw-r--r--languages/messages/MessagesKu.php3
-rw-r--r--languages/messages/MessagesKu_arab.php1065
-rw-r--r--languages/messages/MessagesKu_latn.php239
-rw-r--r--languages/messages/MessagesKv.php4
-rw-r--r--languages/messages/MessagesKw.php355
-rw-r--r--languages/messages/MessagesKy.php78
-rw-r--r--languages/messages/MessagesLa.php510
-rw-r--r--languages/messages/MessagesLad.php112
-rw-r--r--languages/messages/MessagesLb.php1015
-rw-r--r--languages/messages/MessagesLbe.php13
-rw-r--r--languages/messages/MessagesLez.php15
-rw-r--r--languages/messages/MessagesLfn.php148
-rw-r--r--languages/messages/MessagesLg.php76
-rw-r--r--languages/messages/MessagesLi.php745
-rw-r--r--languages/messages/MessagesLij.php192
-rw-r--r--languages/messages/MessagesLld.php9
-rw-r--r--languages/messages/MessagesLmo.php425
-rw-r--r--languages/messages/MessagesLn.php88
-rw-r--r--languages/messages/MessagesLo.php97
-rw-r--r--languages/messages/MessagesLoz.php304
-rw-r--r--languages/messages/MessagesLt.php989
-rw-r--r--languages/messages/MessagesLtg.php746
-rw-r--r--languages/messages/MessagesLv.php472
-rw-r--r--languages/messages/MessagesLzh.php891
-rw-r--r--languages/messages/MessagesLzz.php78
-rw-r--r--languages/messages/MessagesMai.php11
-rw-r--r--languages/messages/MessagesMap_bms.php4
-rw-r--r--languages/messages/MessagesMdf.php387
-rw-r--r--languages/messages/MessagesMg.php876
-rw-r--r--languages/messages/MessagesMhr.php260
-rw-r--r--languages/messages/MessagesMi.php12
-rw-r--r--languages/messages/MessagesMk.php974
-rw-r--r--languages/messages/MessagesMl.php1336
-rw-r--r--languages/messages/MessagesMn.php556
-rw-r--r--languages/messages/MessagesMo.php13
-rw-r--r--languages/messages/MessagesMr.php419
-rw-r--r--languages/messages/MessagesMrj.php716
-rw-r--r--languages/messages/MessagesMs.php762
-rw-r--r--languages/messages/MessagesMt.php718
-rw-r--r--languages/messages/MessagesMwl.php184
-rw-r--r--languages/messages/MessagesMy.php43
-rw-r--r--languages/messages/MessagesMyv.php533
-rw-r--r--languages/messages/MessagesMzn.php301
-rw-r--r--languages/messages/MessagesNa.php14
-rw-r--r--languages/messages/MessagesNah.php324
-rw-r--r--languages/messages/MessagesNan.php154
-rw-r--r--languages/messages/MessagesNap.php54
-rw-r--r--languages/messages/MessagesNb.php3
-rw-r--r--languages/messages/MessagesNds.php691
-rw-r--r--languages/messages/MessagesNds_nl.php1076
-rw-r--r--languages/messages/MessagesNe.php630
-rw-r--r--languages/messages/MessagesNew.php47
-rw-r--r--languages/messages/MessagesNiu.php24
-rw-r--r--languages/messages/MessagesNl.php1032
-rw-r--r--languages/messages/MessagesNn.php931
-rw-r--r--languages/messages/MessagesNo.php985
-rw-r--r--languages/messages/MessagesNov.php54
-rw-r--r--languages/messages/MessagesNso.php221
-rw-r--r--languages/messages/MessagesNv.php41
-rw-r--r--languages/messages/MessagesOc.php1074
-rw-r--r--languages/messages/MessagesOr.php4
-rw-r--r--languages/messages/MessagesOs.php289
-rw-r--r--languages/messages/MessagesPa.php218
-rw-r--r--languages/messages/MessagesPag.php66
-rw-r--r--languages/messages/MessagesPam.php309
-rw-r--r--languages/messages/MessagesPap.php43
-rw-r--r--languages/messages/MessagesPcd.php856
-rw-r--r--languages/messages/MessagesPdc.php254
-rw-r--r--languages/messages/MessagesPdt.php80
-rw-r--r--languages/messages/MessagesPfl.php41
-rw-r--r--languages/messages/MessagesPih.php4
-rw-r--r--languages/messages/MessagesPl.php975
-rw-r--r--languages/messages/MessagesPms.php1006
-rw-r--r--languages/messages/MessagesPnb.php269
-rw-r--r--languages/messages/MessagesPnt.php286
-rw-r--r--languages/messages/MessagesPrg.php2846
-rw-r--r--languages/messages/MessagesPs.php472
-rw-r--r--languages/messages/MessagesPt.php1262
-rw-r--r--languages/messages/MessagesPt_br.php1123
-rw-r--r--languages/messages/MessagesQqq.php1096
-rw-r--r--languages/messages/MessagesQu.php1116
-rw-r--r--languages/messages/MessagesRgn.php683
-rw-r--r--languages/messages/MessagesRif.php114
-rw-r--r--languages/messages/MessagesRm.php358
-rw-r--r--languages/messages/MessagesRmy.php136
-rw-r--r--languages/messages/MessagesRo.php1111
-rw-r--r--languages/messages/MessagesRoa_rup.php22
-rw-r--r--languages/messages/MessagesRoa_tara.php940
-rw-r--r--languages/messages/MessagesRu.php1052
-rw-r--r--languages/messages/MessagesRue.php2069
-rw-r--r--languages/messages/MessagesRuq.php3
-rw-r--r--languages/messages/MessagesRuq_cyrl.php10
-rw-r--r--languages/messages/MessagesRuq_grek.php9
-rw-r--r--languages/messages/MessagesRuq_latn.php10
-rw-r--r--languages/messages/MessagesSa.php115
-rw-r--r--languages/messages/MessagesSah.php977
-rw-r--r--languages/messages/MessagesSc.php352
-rw-r--r--languages/messages/MessagesScn.php743
-rw-r--r--languages/messages/MessagesSco.php228
-rw-r--r--languages/messages/MessagesSd.php157
-rw-r--r--languages/messages/MessagesSdc.php323
-rw-r--r--languages/messages/MessagesSe.php195
-rw-r--r--languages/messages/MessagesSei.php197
-rw-r--r--languages/messages/MessagesSg.php6
-rw-r--r--languages/messages/MessagesSh.php584
-rw-r--r--languages/messages/MessagesShi.php177
-rw-r--r--languages/messages/MessagesSi.php941
-rw-r--r--languages/messages/MessagesSimple.php3
-rw-r--r--languages/messages/MessagesSk.php1034
-rw-r--r--languages/messages/MessagesSl.php1125
-rw-r--r--languages/messages/MessagesSli.php2856
-rw-r--r--languages/messages/MessagesSm.php6
-rw-r--r--languages/messages/MessagesSma.php115
-rw-r--r--languages/messages/MessagesSn.php16
-rw-r--r--languages/messages/MessagesSo.php86
-rw-r--r--languages/messages/MessagesSq.php552
-rw-r--r--languages/messages/MessagesSr_ec.php1020
-rw-r--r--languages/messages/MessagesSr_el.php1014
-rw-r--r--languages/messages/MessagesSrn.php359
-rw-r--r--languages/messages/MessagesSs.php60
-rw-r--r--languages/messages/MessagesSt.php4
-rw-r--r--languages/messages/MessagesStq.php954
-rw-r--r--languages/messages/MessagesSu.php608
-rw-r--r--languages/messages/MessagesSv.php993
-rw-r--r--languages/messages/MessagesSw.php792
-rw-r--r--languages/messages/MessagesSzl.php286
-rw-r--r--languages/messages/MessagesTa.php278
-rw-r--r--languages/messages/MessagesTcy.php85
-rw-r--r--languages/messages/MessagesTe.php1059
-rw-r--r--languages/messages/MessagesTet.php158
-rw-r--r--languages/messages/MessagesTg.php3
-rw-r--r--languages/messages/MessagesTg_cyrl.php416
-rw-r--r--languages/messages/MessagesTg_latn.php2417
-rw-r--r--languages/messages/MessagesTh.php910
-rw-r--r--languages/messages/MessagesTi.php21
-rw-r--r--languages/messages/MessagesTk.php972
-rw-r--r--languages/messages/MessagesTl.php999
-rw-r--r--languages/messages/MessagesTlh.php28
-rw-r--r--languages/messages/MessagesTn.php8
-rw-r--r--languages/messages/MessagesTo.php113
-rw-r--r--languages/messages/MessagesTokipona.php11
-rw-r--r--languages/messages/MessagesTp.php3
-rw-r--r--languages/messages/MessagesTpi.php16
-rw-r--r--languages/messages/MessagesTr.php1137
-rw-r--r--languages/messages/MessagesTs.php40
-rw-r--r--languages/messages/MessagesTt.php5
-rw-r--r--languages/messages/MessagesTt_cyrl.php500
-rw-r--r--languages/messages/MessagesTt_latn.php222
-rw-r--r--languages/messages/MessagesTy.php23
-rw-r--r--languages/messages/MessagesTyv.php177
-rw-r--r--languages/messages/MessagesUdm.php17
-rw-r--r--languages/messages/MessagesUg.php3
-rw-r--r--languages/messages/MessagesUg_arab.php3212
-rw-r--r--languages/messages/MessagesUg_latn.php27
-rw-r--r--languages/messages/MessagesUk.php1074
-rw-r--r--languages/messages/MessagesUr.php522
-rw-r--r--languages/messages/MessagesUz.php96
-rw-r--r--languages/messages/MessagesVe.php2
-rw-r--r--languages/messages/MessagesVec.php983
-rw-r--r--languages/messages/MessagesVep.php913
-rw-r--r--languages/messages/MessagesVi.php1002
-rw-r--r--languages/messages/MessagesVls.php34
-rw-r--r--languages/messages/MessagesVmf.php985
-rw-r--r--languages/messages/MessagesVo.php480
-rw-r--r--languages/messages/MessagesVot.php642
-rw-r--r--languages/messages/MessagesVro.php315
-rw-r--r--languages/messages/MessagesWa.php381
-rw-r--r--languages/messages/MessagesWar.php105
-rw-r--r--languages/messages/MessagesWo.php555
-rw-r--r--languages/messages/MessagesWuu.php458
-rw-r--r--languages/messages/MessagesXal.php363
-rw-r--r--languages/messages/MessagesXh.php15
-rw-r--r--languages/messages/MessagesXmf.php61
-rw-r--r--languages/messages/MessagesYdd.php10
-rw-r--r--languages/messages/MessagesYi.php880
-rw-r--r--languages/messages/MessagesYo.php623
-rw-r--r--languages/messages/MessagesYue.php982
-rw-r--r--languages/messages/MessagesZa.php33
-rw-r--r--languages/messages/MessagesZea.php384
-rw-r--r--languages/messages/MessagesZh.php16
-rw-r--r--languages/messages/MessagesZh_classical.php3
-rw-r--r--languages/messages/MessagesZh_cn.php4
-rw-r--r--languages/messages/MessagesZh_hans.php1011
-rw-r--r--languages/messages/MessagesZh_hant.php1068
-rw-r--r--languages/messages/MessagesZh_hk.php111
-rw-r--r--languages/messages/MessagesZh_min_nan.php3
-rw-r--r--languages/messages/MessagesZh_mo.php3
-rw-r--r--languages/messages/MessagesZh_my.php3
-rw-r--r--languages/messages/MessagesZh_sg.php3
-rw-r--r--languages/messages/MessagesZh_tw.php1748
-rw-r--r--languages/messages/MessagesZh_yue.php3
-rw-r--r--languages/messages/MessagesZu.php33
-rw-r--r--maintenance/7zip.inc69
-rw-r--r--maintenance/Doxyfile2
-rw-r--r--maintenance/FiveUpgrade.inc2
-rw-r--r--maintenance/Maintenance.php860
-rw-r--r--maintenance/README6
-rw-r--r--maintenance/addwiki.php412
-rw-r--r--maintenance/apache-ampersand.diff53
-rw-r--r--maintenance/archives/patch-change_tag-indexes.sql21
-rw-r--r--maintenance/archives/patch-eu_local_id.sql3
-rw-r--r--maintenance/archives/patch-external_user.sql9
-rw-r--r--maintenance/archives/patch-filearchive-user-index.sql (renamed from maintenance/archives/patch-filearhive-user-index.sql)0
-rw-r--r--maintenance/archives/patch-job.sql18
-rw-r--r--maintenance/archives/patch-l10n_cache.sql8
-rw-r--r--maintenance/archives/patch-log_search-rename-index.sql7
-rw-r--r--maintenance/archives/patch-log_search.sql10
-rw-r--r--maintenance/archives/patch-log_user_text.sql5
-rw-r--r--maintenance/archives/patch-mime_minor_length.sql10
-rw-r--r--maintenance/archives/patch-rd_interwiki.sql6
-rw-r--r--maintenance/archives/patch-tc-timestamp.sql4
-rw-r--r--maintenance/archives/patch-transcache.sql2
-rw-r--r--maintenance/archives/patch-user_properties.sql22
-rw-r--r--maintenance/archives/populateSha1.php59
-rw-r--r--maintenance/archives/rebuildRecentchanges.inc123
-rw-r--r--maintenance/archives/upgradeWatchlist.php67
-rw-r--r--maintenance/attachLatest.php96
-rw-r--r--maintenance/attribute.php106
-rw-r--r--maintenance/backup.inc18
-rw-r--r--maintenance/benchmarkPurge.php157
-rw-r--r--maintenance/changePassword.php78
-rw-r--r--maintenance/checkAutoLoader.php70
-rw-r--r--maintenance/checkBadRedirects.php75
-rw-r--r--maintenance/checkImages.php121
-rw-r--r--maintenance/checkSyntax.php296
-rw-r--r--maintenance/checkUsernames.php44
-rw-r--r--maintenance/cleanupCaps.php57
-rw-r--r--maintenance/cleanupImages.php88
-rw-r--r--maintenance/cleanupSpam.php211
-rw-r--r--maintenance/cleanupTable.inc161
-rw-r--r--maintenance/cleanupTitles.php67
-rw-r--r--maintenance/cleanupWatchlist.php60
-rw-r--r--maintenance/clear_interwiki_cache.php56
-rw-r--r--maintenance/clear_stats.php71
-rw-r--r--maintenance/commandLine.inc269
-rw-r--r--maintenance/convertLinks.inc6
-rw-r--r--maintenance/convertLinks.php239
-rw-r--r--maintenance/convertUserOptions.php72
-rw-r--r--maintenance/counter.php12
-rw-r--r--maintenance/createAndPromote.php111
-rw-r--r--maintenance/deleteArchivedFiles.inc56
-rw-r--r--maintenance/deleteArchivedFiles.php85
-rw-r--r--maintenance/deleteArchivedRevisions.inc34
-rw-r--r--maintenance/deleteArchivedRevisions.php71
-rw-r--r--maintenance/deleteBatch.php172
-rw-r--r--maintenance/deleteDefaultMessages.php90
-rw-r--r--maintenance/deleteImageMemcached.php73
-rw-r--r--maintenance/deleteOldRevisions.inc68
-rw-r--r--maintenance/deleteOldRevisions.php102
-rw-r--r--maintenance/deleteOrphanedRevisions.inc.php32
-rw-r--r--maintenance/deleteOrphanedRevisions.php118
-rw-r--r--maintenance/deleteRevision.php104
-rw-r--r--maintenance/deleteSelfExternals.php54
-rw-r--r--maintenance/doMaintenance.php102
-rw-r--r--maintenance/dumpBackup.php20
-rw-r--r--maintenance/dumpInterwiki.inc3
-rw-r--r--maintenance/dumpInterwiki.php7
-rw-r--r--maintenance/dumpLinks.php60
-rw-r--r--maintenance/dumpSisterSites.php47
-rw-r--r--maintenance/dumpTextPass.php80
-rw-r--r--maintenance/dumpUploads.php87
-rw-r--r--maintenance/edit.php144
-rw-r--r--maintenance/fetchInterwiki.pl102
-rw-r--r--maintenance/fetchText.php82
-rw-r--r--maintenance/findhooks.php285
-rw-r--r--maintenance/fixSlaveDesync.php335
-rw-r--r--maintenance/fixTimestamps.php200
-rw-r--r--maintenance/fixUserRegistration.php61
-rw-r--r--maintenance/fuzz-tester.php8
-rw-r--r--maintenance/gearman/gearman.inc2
-rw-r--r--maintenance/gearman/gearmanWorker.php2
-rw-r--r--maintenance/generateSitemap.php158
-rw-r--r--maintenance/getLagTimes.php59
-rw-r--r--maintenance/getSlaveServer.php60
-rw-r--r--maintenance/getText.php58
-rw-r--r--maintenance/httpSessionDownload.php57
-rw-r--r--maintenance/ibm_db2/README40
-rw-r--r--maintenance/ibm_db2/tables.sql551
-rw-r--r--maintenance/importDump.php13
-rw-r--r--maintenance/importImages.inc (renamed from maintenance/importImages.inc.php)30
-rw-r--r--maintenance/importImages.php168
-rw-r--r--maintenance/importLogs.inc144
-rw-r--r--maintenance/importLogs.php27
-rw-r--r--maintenance/importTextFile.php4
-rw-r--r--maintenance/importUseModWiki.php16
-rw-r--r--maintenance/initEditCount.php161
-rw-r--r--maintenance/initStats.inc57
-rw-r--r--maintenance/initStats.php87
-rw-r--r--maintenance/install-utils.inc (renamed from install-utils.inc)124
-rw-r--r--maintenance/installExtension.php2
-rw-r--r--maintenance/interwiki.sql18
-rw-r--r--maintenance/lag.php51
-rw-r--r--maintenance/language/StatOutputs.php14
-rw-r--r--maintenance/language/alltrans.php40
-rw-r--r--maintenance/language/checkDupeMessages.php118
-rw-r--r--maintenance/language/checkExtensions.php4
-rw-r--r--maintenance/language/checkLanguage.inc39
-rw-r--r--maintenance/language/countMessages.php87
-rw-r--r--maintenance/language/date-formats.php102
-rw-r--r--maintenance/language/diffLanguage.php6
-rw-r--r--maintenance/language/digit2html.php68
-rw-r--r--maintenance/language/dumpMessages.php48
-rw-r--r--maintenance/language/generateNormalizerData.php137
-rw-r--r--maintenance/language/lang2po.php225
-rw-r--r--maintenance/language/langmemusage.php58
-rw-r--r--maintenance/language/languages.inc18
-rw-r--r--maintenance/language/makeMessageDB.php45
-rw-r--r--maintenance/language/messageTypes.inc25
-rw-r--r--maintenance/language/messages.inc520
-rw-r--r--maintenance/language/rebuildLanguage.php55
-rw-r--r--maintenance/language/transstat.php71
-rw-r--r--maintenance/language/writeMessagesArray.inc25
-rw-r--r--maintenance/mcc.php84
-rw-r--r--maintenance/mctest.php112
-rw-r--r--maintenance/mergeMessageFileList.php72
-rw-r--r--maintenance/migrateUserGroup.php70
-rw-r--r--maintenance/minify.php111
-rw-r--r--maintenance/moveBatch.php157
-rw-r--r--maintenance/mwdocgen.php15
-rw-r--r--maintenance/namespace2sql.php18
-rw-r--r--maintenance/namespaceDupes.php244
-rw-r--r--maintenance/nextJobDB.php127
-rw-r--r--maintenance/nukeNS.php158
-rw-r--r--maintenance/nukePage.inc91
-rw-r--r--maintenance/nukePage.php114
-rw-r--r--maintenance/ora/patch_seq_names_pre1.16.sql8
-rw-r--r--maintenance/ora/tables.sql1129
-rw-r--r--maintenance/ora/user.sql16
-rw-r--r--maintenance/orphans.php371
-rw-r--r--maintenance/ourusers.php1
-rw-r--r--maintenance/parserTests.inc731
-rw-r--r--maintenance/parserTests.php15
-rw-r--r--maintenance/parserTests.txt972
-rw-r--r--maintenance/patchSql.php69
-rw-r--r--maintenance/populateCategory.php128
-rw-r--r--maintenance/populateLogSearch.inc80
-rw-r--r--maintenance/populateLogSearch.php153
-rw-r--r--maintenance/populateLogUsertext.php82
-rw-r--r--maintenance/populateParentId.php119
-rw-r--r--maintenance/populateSha1.php101
-rw-r--r--maintenance/postgres/archives/patch-l10n_cache.sql8
-rw-r--r--maintenance/postgres/archives/patch-log_search.sql9
-rw-r--r--maintenance/postgres/archives/patch-update_sequences.sql20
-rw-r--r--maintenance/postgres/archives/patch-user_properties.sql8
-rw-r--r--maintenance/postgres/compare_schemas.pl15
-rw-r--r--maintenance/postgres/mediawiki_mysql2postgres.pl6
-rw-r--r--maintenance/postgres/tables.sql71
-rw-r--r--maintenance/preprocessorFuzzTest.php5
-rw-r--r--maintenance/protect.php68
-rw-r--r--maintenance/purgeList.php74
-rw-r--r--maintenance/purgeOldText.inc4
-rw-r--r--maintenance/purgeOldText.php46
-rw-r--r--maintenance/reassignEdits.inc.php143
-rw-r--r--maintenance/reassignEdits.php197
-rw-r--r--maintenance/rebuildFileCache.php179
-rw-r--r--maintenance/rebuildImages.php8
-rw-r--r--maintenance/rebuildInterwiki.inc1
-rw-r--r--maintenance/rebuildInterwiki.php3
-rw-r--r--maintenance/rebuildLocalisationCache.php133
-rw-r--r--maintenance/rebuildall.php78
-rw-r--r--maintenance/rebuildmessages.php56
-rw-r--r--maintenance/rebuildrecentchanges.inc246
-rw-r--r--maintenance/rebuildrecentchanges.php292
-rw-r--r--maintenance/rebuildtextindex.inc66
-rw-r--r--maintenance/rebuildtextindex.php132
-rw-r--r--maintenance/refreshImageCount.php65
-rw-r--r--maintenance/refreshLinks.inc202
-rw-r--r--maintenance/refreshLinks.php313
-rw-r--r--maintenance/removeUnusedAccounts.inc46
-rw-r--r--maintenance/removeUnusedAccounts.php150
-rw-r--r--maintenance/renameDbPrefix.php129
-rw-r--r--maintenance/renamewiki.php115
-rw-r--r--maintenance/renderDump.php75
-rw-r--r--maintenance/rollbackEdits.php97
-rw-r--r--maintenance/runBatchedQuery.php60
-rw-r--r--maintenance/runJobs.php141
-rw-r--r--maintenance/showJobs.php49
-rw-r--r--maintenance/showStats.php78
-rw-r--r--maintenance/sql.php108
-rw-r--r--maintenance/sqlite.php113
-rw-r--r--maintenance/sqlite/archives/initial-indexes.sql39
-rw-r--r--maintenance/sqlite/archives/patch-log_user_text.sql5
-rw-r--r--maintenance/sqlite/archives/patch-rd_interwiki.sql5
-rw-r--r--maintenance/sqlite/archives/patch-tc-timestamp.sql3
-rw-r--r--maintenance/sqlite/archives/searchindex-fts3.sql18
-rw-r--r--maintenance/sqlite/archives/searchindex-no-fts.sql25
-rw-r--r--maintenance/stats.php127
-rw-r--r--maintenance/storage/compressOld.inc6
-rw-r--r--maintenance/storage/compressOld.php2
-rw-r--r--maintenance/storage/dumpRev.php111
-rw-r--r--maintenance/storage/fixBug20757.php314
-rwxr-xr-xmaintenance/storage/make-blobs11
-rw-r--r--maintenance/storage/moveToExternal.php2
-rw-r--r--maintenance/storage/orphanStats.php43
-rw-r--r--maintenance/storage/recompressTracked.php57
-rw-r--r--maintenance/storage/resolveStubs.php10
-rw-r--r--maintenance/storage/storageTypeStats.php98
-rw-r--r--maintenance/storage/trackBlobs.php28
-rw-r--r--maintenance/tables.sql99
-rw-r--r--maintenance/testRunner.ora.sql37
-rw-r--r--maintenance/tests/.svnignore (renamed from tests/.svnignore)0
-rw-r--r--maintenance/tests/ApiSetup.php39
-rw-r--r--maintenance/tests/ApiTest.php164
-rw-r--r--maintenance/tests/CdbTest.php79
-rw-r--r--maintenance/tests/DatabaseSqliteTest.php57
-rw-r--r--maintenance/tests/DatabaseTest.php (renamed from tests/DatabaseTest.php)32
-rw-r--r--maintenance/tests/GlobalTest.php (renamed from tests/GlobalTest.php)0
-rw-r--r--maintenance/tests/HttpTest.php567
-rw-r--r--maintenance/tests/IPTest.php52
-rw-r--r--maintenance/tests/ImageFunctionsTest.php (renamed from tests/ImageFunctionsTest.php)0
-rw-r--r--maintenance/tests/LanguageConverterTest.php148
-rw-r--r--maintenance/tests/LicensesTest.php17
-rw-r--r--maintenance/tests/LocalFileTest.php (renamed from tests/LocalFileTest.php)15
-rw-r--r--maintenance/tests/Makefile23
-rw-r--r--maintenance/tests/MediaWikiParserTest.php283
-rw-r--r--maintenance/tests/MediaWiki_Setup.php28
-rw-r--r--maintenance/tests/README24
-rw-r--r--maintenance/tests/RevisionTest.php (renamed from tests/ArticleTest.php)6
-rw-r--r--maintenance/tests/SanitizerTest.php73
-rw-r--r--maintenance/tests/SearchEngineTest.php (renamed from tests/SearchEngineTest.php)98
-rw-r--r--maintenance/tests/SearchMySQLTest.php (renamed from tests/SearchMySQL4Test.php)13
-rw-r--r--maintenance/tests/SearchUpdateTest.php103
-rw-r--r--maintenance/tests/SiteConfigurationTest.php311
-rw-r--r--maintenance/tests/TimeAdjustTest.php40
-rw-r--r--maintenance/tests/TitleTest.php17
-rw-r--r--maintenance/tests/XmlTest.php115
-rw-r--r--maintenance/tests/bootstrap.php15
-rw-r--r--maintenance/tests/phpunit.xml17
-rw-r--r--maintenance/tests/test-prefetch-current.xml (renamed from tests/test-prefetch-current.xml)0
-rw-r--r--maintenance/tests/test-prefetch-previous.xml (renamed from tests/test-prefetch-previous.xml)0
-rw-r--r--maintenance/tests/test-prefetch-stub.xml (renamed from tests/test-prefetch-stub.xml)0
-rw-r--r--maintenance/undelete.php51
-rw-r--r--maintenance/update.php56
-rw-r--r--maintenance/updateArticleCount.inc.php61
-rw-r--r--maintenance/updateArticleCount.php113
-rw-r--r--maintenance/updateRestrictions.php160
-rw-r--r--maintenance/updateSearchIndex.inc115
-rw-r--r--maintenance/updateSearchIndex.php186
-rw-r--r--maintenance/updateSpecialPages.php215
-rw-r--r--maintenance/updaters.inc532
-rw-r--r--maintenance/upgrade1_5.php2
-rw-r--r--maintenance/userOptions.inc10
-rw-r--r--maintenance/users.sql6
-rw-r--r--maintenance/waitForSlave.php35
-rw-r--r--maintenance/wikipedia-interwiki.sql7
-rw-r--r--math/README4
-rw-r--r--math/render.ml6
-rw-r--r--math/texutil.ml4
-rw-r--r--math/texvc.ml6
-rw-r--r--php5.php52
-rw-r--r--profileinfo.php132
-rw-r--r--redirect.phtml1
-rw-r--r--serialized/Makefile16
-rw-r--r--serialized/README37
-rw-r--r--serialized/normalize-ar.ser1
-rw-r--r--serialized/normalize-ml.ser1
-rw-r--r--serialized/serialize-localisation.php35
-rw-r--r--skins/ArchLinux.php199
-rw-r--r--skins/Chick.php16
-rw-r--r--skins/CologneBlue.php274
-rw-r--r--skins/Modern.php107
-rw-r--r--skins/MonoBook.php154
-rw-r--r--skins/MySkin.php14
-rw-r--r--skins/Nostalgia.php29
-rw-r--r--skins/Simple.php31
-rw-r--r--skins/Skin.sample19
-rw-r--r--skins/Standard.php182
-rw-r--r--skins/Vector.deps.php11
-rw-r--r--skins/Vector.php767
-rw-r--r--skins/archlinux/IEMacFixes.css44
-rw-r--r--skins/archlinux/discussionitem_icon.gifbin949 -> 549 bytes
-rw-r--r--skins/archlinux/file_icon.gifbin921 -> 323 bytes
-rw-r--r--skins/archlinux/link_icon.gifbin942 -> 342 bytes
-rw-r--r--skins/archlinux/lock_icon.gifbin918 -> 918 bytes
-rw-r--r--skins/archlinux/magnify-clip.pngbin237 -> 170 bytes
-rw-r--r--skins/archlinux/mail_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/archlinux/main.css318
-rw-r--r--skins/archlinux/rtl.css18
-rw-r--r--skins/archlinux/user.gifbin923 -> 325 bytes
-rw-r--r--skins/archlinux/video.pngbin215 -> 169 bytes
-rw-r--r--skins/archlinux/wiki.pngbin23064 -> 22987 bytes
-rw-r--r--skins/chick/main.css390
-rw-r--r--skins/common/IE80Fixes.css15
-rw-r--r--skins/common/IEFixes.js205
-rw-r--r--skins/common/Makefile2
-rw-r--r--skins/common/ajaxwatch.js53
-rw-r--r--skins/common/allmessages.js83
-rw-r--r--skins/common/block.js37
-rw-r--r--skins/common/commonPrint.css36
-rw-r--r--skins/common/common_rtl.css7
-rw-r--r--skins/common/edit.js209
-rw-r--r--skins/common/history.js11
-rw-r--r--skins/common/htmlform.js40
-rw-r--r--skins/common/images/Arr_.pngbin918 -> 246 bytes
-rw-r--r--skins/common/images/Arr_r.xcfbin1437 -> 0 bytes
-rw-r--r--skins/common/images/Arr_u.pngbin1044 -> 425 bytes
-rw-r--r--skins/common/images/Zoom_sans.gifbin901 -> 901 bytes
-rw-r--r--skins/common/images/add.pngbin0 -> 3329 bytes
-rw-r--r--skins/common/images/ajax-loader.gifbin0 -> 3208 bytes
-rw-r--r--skins/common/images/arrow_first.svg85
-rw-r--r--skins/common/images/arrow_left.svg78
-rw-r--r--skins/common/images/be-tarask/button_bold.pngbin575 -> 554 bytes
-rw-r--r--skins/common/images/be-tarask/button_italic.pngbin638 -> 592 bytes
-rw-r--r--skins/common/images/be-tarask/button_link.pngbin550 -> 466 bytes
-rw-r--r--skins/common/images/button_bold.pngbin978 -> 288 bytes
-rw-r--r--skins/common/images/button_extlink.pngbin1093 -> 494 bytes
-rw-r--r--skins/common/images/button_headline.pngbin497 -> 465 bytes
-rw-r--r--skins/common/images/button_hr.pngbin372 -> 251 bytes
-rw-r--r--skins/common/images/button_image.pngbin1110 -> 584 bytes
-rw-r--r--skins/common/images/button_italic.pngbin975 -> 292 bytes
-rw-r--r--skins/common/images/button_link.pngbin434 -> 337 bytes
-rw-r--r--skins/common/images/button_math.pngbin730 -> 617 bytes
-rw-r--r--skins/common/images/button_media.pngbin1155 -> 780 bytes
-rw-r--r--skins/common/images/button_nowiki.pngbin375 -> 352 bytes
-rw-r--r--skins/common/images/button_sig.pngbin1217 -> 953 bytes
-rw-r--r--skins/common/images/button_template.pngbin362 -> 233 bytes
-rw-r--r--skins/common/images/cyrl/button_italic.pngbin461 -> 460 bytes
-rw-r--r--skins/common/images/cyrl/button_link.pngbin353 -> 347 bytes
-rw-r--r--skins/common/images/de/button_bold.pngbin1013 -> 328 bytes
-rw-r--r--skins/common/images/de/button_italic.pngbin1021 -> 351 bytes
-rw-r--r--skins/common/images/fa/button_bold.pngbin504 -> 500 bytes
-rw-r--r--skins/common/images/fa/button_headline.pngbin438 -> 434 bytes
-rw-r--r--skins/common/images/fa/button_italic.pngbin577 -> 573 bytes
-rw-r--r--skins/common/images/fa/button_link.pngbin538 -> 535 bytes
-rw-r--r--skins/common/images/fileicon.xcfbin26160 -> 0 bytes
-rw-r--r--skins/common/images/gnu-fdl.pngbin1748 -> 1730 bytes
-rw-r--r--skins/common/images/gnu-fdl.xcfbin5578 -> 0 bytes
-rw-r--r--skins/common/images/icons/fileicon-c.pngbin2995 -> 2211 bytes
-rw-r--r--skins/common/images/icons/fileicon-cpp.pngbin2250 -> 1882 bytes
-rw-r--r--skins/common/images/icons/fileicon-deb.pngbin5528 -> 4801 bytes
-rw-r--r--skins/common/images/icons/fileicon-djvu.pngbin11137 -> 10752 bytes
-rw-r--r--skins/common/images/icons/fileicon-dvi.pngbin13042 -> 12778 bytes
-rw-r--r--skins/common/images/icons/fileicon-exe.pngbin5864 -> 5680 bytes
-rw-r--r--skins/common/images/icons/fileicon-h.pngbin1195 -> 1191 bytes
-rw-r--r--skins/common/images/icons/fileicon-html.pngbin7601 -> 7422 bytes
-rw-r--r--skins/common/images/icons/fileicon-iso.pngbin6673 -> 6450 bytes
-rw-r--r--skins/common/images/icons/fileicon-java.pngbin6825 -> 5989 bytes
-rw-r--r--skins/common/images/icons/fileicon-mid.pngbin7191 -> 6657 bytes
-rw-r--r--skins/common/images/icons/fileicon-mov.pngbin7946 -> 7716 bytes
-rw-r--r--skins/common/images/icons/fileicon-o.pngbin2893 -> 2204 bytes
-rw-r--r--skins/common/images/icons/fileicon-ogg.pngbin6143 -> 3750 bytes
-rw-r--r--skins/common/images/icons/fileicon-pdf.pngbin5138 -> 4976 bytes
-rw-r--r--skins/common/images/icons/fileicon-ps.pngbin3293 -> 3012 bytes
-rw-r--r--skins/common/images/icons/fileicon-rm.pngbin4977 -> 2851 bytes
-rw-r--r--skins/common/images/icons/fileicon-rpm.pngbin4753 -> 4103 bytes
-rw-r--r--skins/common/images/icons/fileicon-svg.pngbin5193 -> 5094 bytes
-rw-r--r--skins/common/images/icons/fileicon-tar.pngbin6544 -> 6347 bytes
-rw-r--r--skins/common/images/icons/fileicon-tex.pngbin4203 -> 3997 bytes
-rw-r--r--skins/common/images/icons/fileicon-ttf.pngbin3625 -> 3469 bytes
-rw-r--r--skins/common/images/icons/fileicon-txt.pngbin6801 -> 3638 bytes
-rw-r--r--skins/common/images/ksh/button_S_italic.pngbin3812 -> 3206 bytes
-rw-r--r--skins/common/images/link_icon.gifbin942 -> 342 bytes
-rw-r--r--skins/common/images/magnify-clip.pngbin267 -> 204 bytes
-rw-r--r--skins/common/images/mediawiki-small.xcfbin36011 -> 0 bytes
-rw-r--r--skins/common/images/mediawiki.pngbin23064 -> 22987 bytes
-rw-r--r--skins/common/images/poweredby_mediawiki_88x31.pngbin1933 -> 1927 bytes
-rw-r--r--skins/common/images/public-domain.pngbin2892 -> 2251 bytes
-rw-r--r--skins/common/images/redirectltr.pngbin1024 -> 381 bytes
-rw-r--r--skins/common/images/redirectrtl.pngbin1017 -> 381 bytes
-rw-r--r--skins/common/images/remove.pngbin0 -> 3346 bytes
-rw-r--r--skins/common/images/sort_down.gifbin879 -> 464 bytes
-rw-r--r--skins/common/images/sort_none.gifbin877 -> 462 bytes
-rw-r--r--skins/common/images/sort_up.gifbin881 -> 466 bytes
-rw-r--r--skins/common/images/spinner.gifbin586 -> 4648 bytes
-rw-r--r--skins/common/images/wiki.pngbin24954 -> 24801 bytes
-rw-r--r--skins/common/jquery.js4384
-rw-r--r--skins/common/jquery.min.js433
-rw-r--r--skins/common/metadata.js36
-rw-r--r--skins/common/mwsuggest.js1312
-rw-r--r--skins/common/oldshared.css61
-rw-r--r--skins/common/prefs.js205
-rw-r--r--skins/common/preview.js208
-rw-r--r--skins/common/protect.js2
-rw-r--r--skins/common/search.js50
-rw-r--r--skins/common/shared.css587
-rw-r--r--skins/common/sticky.js124
-rw-r--r--skins/common/upload.js203
-rw-r--r--skins/common/wikibits.js782
-rw-r--r--skins/disabled/MonoBook.tpl200
-rw-r--r--skins/disabled/MonoBookCBT.php1389
-rw-r--r--skins/modern/discussionitem_icon.gifbin949 -> 549 bytes
-rw-r--r--skins/modern/file_icon.gifbin921 -> 323 bytes
-rw-r--r--skins/modern/link_icon.gifbin942 -> 342 bytes
-rw-r--r--skins/modern/lock_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/modern/mail_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/modern/main.css193
-rw-r--r--skins/modern/rtl.css6
-rw-r--r--skins/monobook/IEMacFixes.css44
-rw-r--r--skins/monobook/discussionitem_icon.gifbin949 -> 549 bytes
-rw-r--r--skins/monobook/file_icon.gifbin921 -> 323 bytes
-rw-r--r--skins/monobook/link_icon.gifbin942 -> 342 bytes
-rw-r--r--skins/monobook/lock_icon.gifbin918 -> 918 bytes
-rw-r--r--skins/monobook/magnify-clip.pngbin237 -> 170 bytes
-rw-r--r--skins/monobook/mail_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/monobook/main.css318
-rw-r--r--skins/monobook/rtl.css18
-rw-r--r--skins/monobook/user.gifbin923 -> 325 bytes
-rw-r--r--skins/monobook/video.pngbin215 -> 169 bytes
-rw-r--r--skins/monobook/wiki.pngbin23064 -> 22987 bytes
-rw-r--r--skins/simple/discussionitem_icon.gifbin949 -> 549 bytes
-rw-r--r--skins/simple/file_icon.gifbin921 -> 323 bytes
-rw-r--r--skins/simple/link_icon.gifbin942 -> 342 bytes
-rw-r--r--skins/simple/lock_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/simple/mail_icon.gifbin918 -> 321 bytes
-rw-r--r--skins/simple/main.css11
-rw-r--r--skins/simple/rtl.css6
-rw-r--r--skins/vector/Makefile18
-rw-r--r--skins/vector/csshover.htc262
-rw-r--r--skins/vector/cssjanus/COPYING13
-rw-r--r--skins/vector/cssjanus/LICENSE202
-rw-r--r--skins/vector/cssjanus/README91
-rw-r--r--skins/vector/cssjanus/cssjanus.py574
-rw-r--r--skins/vector/cssjanus/csslex.py114
-rw-r--r--skins/vector/experiments/babaco-colors-a.css109
-rw-r--r--skins/vector/experiments/babaco-colors-b.css67
-rw-r--r--skins/vector/experiments/babaco-colors-c.css91
-rw-r--r--skins/vector/experiments/images/new-border.pngbin0 -> 124 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-ltr.pngbin0 -> 891 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-rtl.pngbin0 -> 891 bytes
-rw-r--r--skins/vector/experiments/images/page-base-fade.pngbin0 -> 306 bytes
-rw-r--r--skins/vector/experiments/images/page-base-updated.pngbin0 -> 124 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-first.pngbin0 -> 981 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-last.pngbin0 -> 980 bytes
-rw-r--r--skins/vector/experiments/images/tab-fade.pngbin0 -> 226 bytes
-rw-r--r--skins/vector/experiments/images/tab-first.pngbin0 -> 1057 bytes
-rw-r--r--skins/vector/experiments/images/tab-last.pngbin0 -> 1057 bytes
-rw-r--r--skins/vector/experiments/images/tab-new-fade.pngbin0 -> 216 bytes
-rw-r--r--skins/vector/experiments/new-tabs.css322
-rw-r--r--skins/vector/images/arrow-down-icon.pngbin0 -> 181 bytes
-rw-r--r--skins/vector/images/audio-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/border.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/bullet-icon.pngbin0 -> 152 bytes
-rw-r--r--skins/vector/images/document-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/edit-icon.pngbin0 -> 358 bytes
-rw-r--r--skins/vector/images/external-link-ltr-icon.pngbin0 -> 279 bytes
-rw-r--r--skins/vector/images/external-link-rtl-icon.pngbin0 -> 277 bytes
-rw-r--r--skins/vector/images/file-icon.pngbin0 -> 402 bytes
-rw-r--r--skins/vector/images/link-icon.pngbin0 -> 429 bytes
-rw-r--r--skins/vector/images/lock-icon.pngbin0 -> 370 bytes
-rw-r--r--skins/vector/images/magnify-clip.pngbin0 -> 204 bytes
-rw-r--r--skins/vector/images/mail-icon.pngbin0 -> 375 bytes
-rw-r--r--skins/vector/images/news-icon.pngbin0 -> 359 bytes
-rw-r--r--skins/vector/images/page-base.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/page-fade.pngbin0 -> 253 bytes
-rw-r--r--skins/vector/images/portal-break-ltr.pngbin0 -> 287 bytes
-rw-r--r--skins/vector/images/portal-break-rtl.pngbin0 -> 280 bytes
-rw-r--r--skins/vector/images/portal-break.pngbin0 -> 242 bytes
-rw-r--r--skins/vector/images/preferences-base.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/preferences-break.pngbin0 -> 286 bytes
-rw-r--r--skins/vector/images/preferences-edge.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/preferences-fade.pngbin0 -> 248 bytes
-rw-r--r--skins/vector/images/search-fade.pngbin0 -> 185 bytes
-rw-r--r--skins/vector/images/search-ltr.pngbin0 -> 214 bytes
-rw-r--r--skins/vector/images/search-rtl.pngbin0 -> 214 bytes
-rw-r--r--skins/vector/images/tab-break.pngbin0 -> 263 bytes
-rw-r--r--skins/vector/images/tab-current-fade.pngbin0 -> 121 bytes
-rw-r--r--skins/vector/images/tab-normal-fade.pngbin0 -> 254 bytes
-rw-r--r--skins/vector/images/talk-icon.pngbin0 -> 377 bytes
-rw-r--r--skins/vector/images/user-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/video-icon.pngbin0 -> 395 bytes
-rw-r--r--skins/vector/images/watch-icon-loading.gifbin0 -> 840 bytes
-rw-r--r--skins/vector/images/watch-icons.pngbin0 -> 1745 bytes
-rw-r--r--skins/vector/main-ltr.css1128
-rw-r--r--skins/vector/main-rtl.css1128
-rw-r--r--skins/vector/wiki-indexed.pngbin0 -> 8205 bytes
-rw-r--r--skins/vector/wiki.pngbin0 -> 22987 bytes
-rw-r--r--t/00-test.t10
-rw-r--r--t/README52
-rw-r--r--t/Search.inc161
-rw-r--r--t/Test.php496
-rw-r--r--t/inc/Database.t53
-rw-r--r--t/inc/Global.t154
-rw-r--r--t/inc/IP.t60
-rw-r--r--t/inc/ImageFunctions.t56
-rw-r--r--t/inc/Language.t58
-rw-r--r--t/inc/Licenses.t26
-rw-r--r--t/inc/LocalFile.t77
-rw-r--r--t/inc/Parser.t39
-rw-r--r--t/inc/Revision.t79
-rw-r--r--t/inc/Sanitizer.t64
-rw-r--r--t/inc/Search.t14
-rw-r--r--t/inc/Title.t32
-rw-r--r--t/inc/Xml.t56
-rw-r--r--t/maint/bom.t38
-rw-r--r--t/maint/eol-style.t35
-rw-r--r--t/maint/php-lint.t33
-rw-r--r--t/maint/php-tag.t29
-rw-r--r--t/maint/unix-newlines.t33
-rw-r--r--tests/.htaccess1
-rw-r--r--tests/Makefile19
-rw-r--r--tests/MediaWiki_TestCase.php51
-rw-r--r--tests/README9
-rw-r--r--tests/run-test.php7
-rw-r--r--wiki.phtml1
1276 files changed, 191230 insertions, 107703 deletions
diff --git a/.gitignore b/.gitignore
index 9e90d89e..a94ae0af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/images/
+/cache/
*~
/LocalSettings.php
/AdminSettings.php
diff --git a/AdminSettings.sample b/AdminSettings.sample
deleted file mode 100644
index 8b6fe993..00000000
--- a/AdminSettings.sample
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * This file should be copied to AdminSettings.php, and modified
- * to reflect local settings. It is required for the maintenance
- * scripts which run on the command line, as an extra security
- * measure to allow using a separate user account with higher
- * privileges to do maintenance work.
- *
- * Developers: Do not check AdminSettings.php into Subversion
- */
-
-/*
- * This data is used by all database maintenance scripts
- * (see directory maintenance/). The SQL user MUST BE
- * MANUALLY CREATED or set to an existing user with
- * necessary permissions.
- *
- * This is not to be confused with sysop accounts for the
- * wiki.
- *
- * NOTE: for PostgreSQL this should be set to the same user and
- * password as the web user, that is, the same as $wgDBuser and
- * $wgDBpassword in LocalSettings.php. This is necessary to
- * ensure that the owner for new tables is set correctly.
- */
-$wgDBadminuser = 'wikiadmin';
-$wgDBadminpassword = 'adminpass';
-
-/*
- * Whether to enable the profileinfo.php script.
- */
-$wgEnableProfileInfo = false;
diff --git a/CREDITS b/CREDITS
index 5d407aad..2205032b 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.15 is a collaborative project released under the
+MediaWiki 1.16 is a collaborative project released under the
GNU General Public License v2. We would like to recognize the
following names for their contribution to the product.
@@ -14,24 +14,30 @@ following names for their contribution to the product.
* Bryan Tong Minh
* Chad Horohoe
* Charles Melbye
+* church of emacs
* Daniel Friesen
* Daniel Kinzler
* Danny B.
* David McCabe
* Derk-Jan Hartman
* Domas Mituzas
+* Emufarmers
* Fran Rogers
* Greg Sabino Mullane
* Guy Van den Broeck
+* Happy-melon
* Hojjat
* Ilmari Karonen
* Jack D. Pond
* Jack Phoenix
* Jason Richey
* Jon Harald Søby
+* Juliano F. Ravasi
* Leon Weber
* Marco Schuster
+* Matěj Grabovský
* Matt Johnston
+* Max Semenik
* Meno25
* MinuteElectron
* Mohamed Magdy
@@ -41,55 +47,76 @@ following names for their contribution to the product.
* Platonides
* Purodha Blissenbach
* Raimond Spekking
+* Remember the dot
* Roan Kattouw
* Robert Stojnić
* Rotem Liss
* Ryan Lane
* Ryan Schmidt
+* Sam Reed
* Shinjiman
* Siebrand Mazeland
* SQL
* Soxred93
* Thomas Bleher
* Tim Starling
+* Tom Gries
* Victor Vasiliev
== Patch Contributors ==
* Agbad
+* Ahmad Sherif
+* Antonio Ospite
+* Azliq7
+* Borislav Manolov
* Brad Jorsch
* Brent G
* Brianna Laugher
* Carlin
-* church of emacs
+* Conrad Irwin
+* Dan Nessett
* Daniel Arnold
-* Danny B.
+* Denny Vrandecic
+* Derk-Jan Hartman
* FunPika
-* Happy-melon
+* Ireas
* Jeremy Baron
* Jidanni
-* Juliano F. Ravasi
+* Jimmy Xu
+* Karun Dambietz
+* Kim Hyun-Joon
+* liangent
* Lucas Garczewski
* Louperivois
* Luigi Corsaro
* Manuel Menal
* Marcin Cieślak
+* Marcus Buck
* Marooned
-* Max Semenik
+* Matthew Britton
+* mati
+* Max Sikström
* Michael De La Rue
* Michael Walsh
* Mike Horvath
* Mormegil
+* MrPete
* Nakon
* Nathan Larson
+* nephele
* Nikolaos S. Karastathis
* Olaf Lenz
* Paul Copperman
-* RememberTheDot
+* PieRRoMaN
* René Kijewski
+* Robert Treat
+* RockMFR
* ST47
+* Scott Colcord
* Simon Walker
* Stefano Codari
* Str4nd
+* svip
== Translators ==
* Anders Wegge Jakobsen
diff --git a/FAQ b/FAQ
index ea1d6243..0aedb7e3 100644
--- a/FAQ
+++ b/FAQ
@@ -1,5 +1,2 @@
-The original MediaWiki FAQ can be found at
-http://meta.wikimedia.org/wiki/MediaWiki_FAQ.
-
-A newer version is available at
-http://www.mediawiki.org/wiki/Manual:FAQ.
+The MediaWiki FAQ can be found at:
+http://www.mediawiki.org/wiki/Manual:FAQ
diff --git a/HISTORY b/HISTORY
index 6851fcf5..05ad1b29 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,14 +1,404 @@
Change notes from older releases. For current info see RELEASE-NOTES.
-== MediaWiki 1.14 ==
-
-=== Changes since 1.14.0rc1 ===
-
-* Fixed the performance of the backlinks API module
+== MediaWiki 1.15 ==
+
+=== Changes since 1.15.1 ===
+
+* The installer now includes a check for a data corruption issue with certain
+ versions of libxml2 2.7 and PHP earlier than 5.2.9, and also for a PHP bug
+ present in the official release of PHP 5.3.1.
+* (bug 20239) MediaWiki:Imagemaxsize does not contain anymore a <br /> tag which
+ was displayed to the user
+* (bug 21150) SQLite no longer raise an error when deleting files
+* (bug 20880) Fixed updater failure on SQLite backend
+* upgrade1_5.php now requires to be run --update option to prevent confusion
+* Fixed a CSS validation issue which allowed external images to be included
+ into wikis where that is disallowed by configuration.
+* Fixed a data leakage vulnerability for private wikis using img_auth.php or
+ similar image access authentication schemes. Check user permissions before
+ streaming out scaled images from thumb.php.
+
+=== Changes since 1.15.0 ===
+
+* Fixed fatal errors for unusual file repository configurations, such as
+ ForeignAPIRepo.
+* Fixed the "change password" link on Special:Preferences to have the correct
+ returnto parameter.
+* (bug 19693) Fixed cross-site scripting vulnerability in Special:Block
+
+=== Changes since 1.15.0rc1 ===
+
+* Removed category redirect feature, implementation was incomplete.
+* (bug 18846) Remove update_password_format(), unnecessary, destroys all
+ passwords if a wiki with $wgPasswordSalt=false is upgraded with the web
+ installer.
+* (bug 19127) Documentation warning for PostgreSQL users who run update.php:
+ use the same user in AdminSettings.php as in LocalSettings.php.
+* Fixed possible web invocation of some maintenance scripts, due to the use of
+ include() instead of require(). A full exploit would require a very strange
+ web server configuration.
+* Localisation updates.
+
+=== Configuration changes in 1.15 ===
+
+* Added $wgNewPasswordExpiry, to specify an expiry time (in seconds) to
+ temporary passwords
+* Added $wgUseTwoButtonsSearchForm to choose the Search form behavior/look
+* Added $wgNoFollowDomainExceptions to allow exempting particular domain names
+ from rel="nofollow" on external links
+* (bug 12970) Brought back $wgUseImageResize.
+* Added $wgRedirectOnLogin to allow specifying a specifc page to redirect users
+ to upon logging in (ex: "Main Page")
+* Add $wgExportFromNamespaces for enabling/disabling the "export all from
+ namespace" option (disabled by default)
+
+=== New features in 1.15 ===
+
+* (bug 2242) Add an expiry time to temporary passwords
+* (bug 9947) Add PROTECTIONLEVEL parser function to return the protection level
+ for the current page for a given action
+* (bug 17002) Add &minor= and &summary= as parameters in the url when editing,
+ to automatically add a summary or a minor edit.
+* (bug 16852) padleft and padright now accept multiletter pad characters
+* When using 'UserCreateForm' hook to add new checkboxes into
+ Special:UserLogin/signup, the messages can now contain HTML to allow
+ hyperlinking to the site's Terms of Service page, for example
+* Add new hook 'UserLoadFromDatabase' that is called while loading a user
+ from the database.
+* (bug 17045) Options on the block form are prefilled with the options of the
+ existing block when modifying an existing block.
+* (bug 17055) "(show/hide)" links to Special:RevisionDelete now use a CSS class
+ rather than hardcoded HTML tags
+* Added new hook 'WantedPages::getSQL' into SpecialWantedpages.php to allow
+ extensions to alter the SQL query which is used to get the list of wanted
+ pages
+* (bugs 16957/16969) Add show/hide to preferences for RC patrol options on
+ specialpages
+* (bug 11443) Auto-noindex user/user talk pages for blocked user
+* (bug 11644) Add $wgMaxRedirects variable to control how many redirects are
+ recursed through until the "destination" page is reached.
+* Add $wgInvalidRedirectTargets variable to prevent redirects to certain
+ special pages.
+* Use HTML5 rel attributes for some links, where appropriate
+* Added optional alternative Search form look - Go button & Advanced search
+ link instead of Go button & Search button
+* (bug 2314) Add links to user custom CSS and JS to Special:Preferences
+* More helpful error message on raw page access if PHP_SELF isn't set
+* (bug 13040) Gender switch in user preferences
+* (bug 13040) {{GENDER:}} magic word for interface messages
+* (bug 3301) Optionally sort user list according to account creation time
+* Remote description pages for foreign file repos are now fetched in the
+ content language.
+* (bug 17180) If $wgUseFileCache is enabled, $wgShowIPinHeader is automatically
+ set to false.
+* (bug 16604) Mark non-patrolled edits in feeds with "!"
+* (bug 16604) Show title/rev in IRC for patrol log
+* (bug 16854) Whether a page is being parsed as a preview or section preview
+ can now be determined and set with ParserOptions.
+* Wrap message 'confirmemail_pending' into a div with CSS classes "error" and
+ "mw-confirmemail-pending"
+* (bug 8249) The magic words for namespaces and pagenames can now be used as
+ parser functions to return the desired namespace or normalized title/title
+ part for a given title.
+* (bug 17110) Styled #mw-data-after-content in cologneblue.css to match the
+ rest of the font
+* (bug 7556) Time zone names in signatures lack i18n
+* (bug 3311) Automatic category redirects
+* (bug 17236) Suppress 'watch user page link' for IP range blocks
+* Wrap message 'searchresulttext' (Special:Search) into a div with
+ class "mw-searchresult"
+* (bug 15283) Interwiki imports can now fetch included templates
+* Treat svn:// URLs as external links by default
+* New function to convert namespace text for display (only applies on wiki with
+ LanguageConverter class)
+* (bug 17379) Contributions-title is now parsed for magic words.
+* Preprocessor output now cached in memcached.
+* (bug 14468) Lines in classic RecentChanges and Watchlist have classes
+ "mw-line-odd" and "mw-line-even" to make styling using css possible.
+* (bug 17311) Add a note beside the gender selection menu to tell users that
+ this information will be public
+* Localize time zone regions in Special:Preferences
+* Add NUMBEROFACTIVEUSERS magic word, which is like NUMBEROFUSERS, but uses
+ the active users data from site_stats.
+* Add a <link rel="canonical"> tag on redirected page views
+* Replace hardcoded '...' as indication of a truncation with the
+ 'ellipsis' message
+* Wrap warning message 'editinginterface' into a div with class
+ 'mw-editinginterface'
+* (bug 17497) Oasis opendocument added to mime.types
+* Remove the link to Special:FileDuplicateSearch from the "file history" section
+ of image description pages as the list of duplicated files is shown in the
+ next section anyway.
+* Added $wgRateLimitsExcludedIPs, to allow specific IPs to be whitelisted from
+ rate limits.
+* (bug 14981) Shared repositories can now have display names, located at
+ Mediawiki:Shared-repo-name-REPONAME, where REPONAME is the name in
+ $wgForeignFileRepos
+* Special:ListUsers: Sort list of usergroups by alphabet
+* (bug 16762) Special:Movepage now shows a list of subpages when possible
+* (bug 17585) Hide legend on Special:Specialpages from non-privileged users
+* Added $wgUseTagFilter to control enabling of filter-by-change-tag
+* (bug 17291) MediaWiki:Nocontribs now has an optional $1 parameter for the
+ username
+* Wrap special page summary message '$specialPageName-summary' into a div
+ with class 'mw-specialpage-summary'
+* $wgSummarySpamRegex added to handle edit summary spam. This is used *instead*
+ of $wgSpamRegex for edit summary checks. Text checks still use $wgSpamRegex.
+* New function to convert content text to specified language (only applies on wiki with
+ LanguageConverter class)
+* (bug 17844) Redirect users to a specific page when they log in, see
+ $wgRedirectOnLogin
+* Added a link to Special:UserRights on Special:Contributions for privileged users
+* (bug 10336) Added new magic word {{REVISIONUSER}}, which displays the editor
+ of the displayed revision's author user name
+* LinkerMakeExternalLink now has an $attribs parameter for link attributes and
+ a $linkType parameter for the type of external link being made
+* (bug 17785) Dynamic dates surrounded with a <span> tag, fixing sortable tables with
+ dynamic dates.
+* (bug 4582) Provide preference-based autoformatting of unlinked dates with the dateformat
+ parser function.
+* (bug 17886) Special:Export now allows you to export a whole namespace (limited to 5000 pages)
+* (bug 17714) Limited TIFF upload support now built in if 'tif' extension is
+ enabled. Image width and height are now recognized, and when using ImageMagick,
+ optional flattening to PNG or JPEG for inline display can be enabled by setting
+ $wgTiffThumbnailType
+* Renamed two input IDs on Special:Log from 'page' and 'user' to 'mw-log-page' and
+ 'mw-log-user', respectively
+* Added $wgInvalidUsernameCharacters to disallow certain characters in
+ usernames during registration (such as "@")
+* Added $wgUserrightsInterwikiDelimiter to allow changing the delimiter
+ used in Special:UserRights to denote the user should be searched for
+ on a different database
+* Add a class if 'missingsummary' is triggered to allow styling of the summary
+ line
+* Title attributes are now always blank on framed and thumbnailed images, and default to blank
+ on inline images instead of defaulting to the image's filename. Additionally, the alt
+ attribute now defaults to the filename on framed and thumbnailed images if no caption or alt
+ attribute is specified.
+
+=== Bug fixes in 1.15 ===
+* (bug 16968) Special:Upload no longer throws useless warnings.
+* (bug 17000) Special:RevisionDelete now checks if the database is locked
+ before trying to delete the edit.
+* (bug 16852) padleft and padright now handle multibyte characters correctly
+* (bug 17010) maintenance/namespaceDupes.php now add the suffix recursively if
+ the destination page exists
+* (bug 17035) Special:Upload now fails gracefully if PHP's file_uploads has
+ been disabled
+* Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with
+ LanguageConverter class)
+* Improving the efficiency by using -{A|xxx}- syntax (only applies on wiki with
+ LanguageConverter class)
+* (bug 17054) Added more descriptive errors in Special:RevisionDelete
+* (bug 11527) Diff on page with one revision shows "Next" link to same diff
+* (bug 8065) Fix summary forcing for new pages
+* (bug 10569) redirects to Special:Mypage and Special:Mytalk are no longer
+ allowed by default. Change $wgInvalidRedirectTargets to re-enable.
+* (bug 3043) Feed links of given page are now preceded by standard feed icon
+* (bug 17150) escapeLike now escapes literal \ properly
+* Inconsistent use of sysop, admin, administrator in system messages changed
+ to 'administrator'
+* (bug 14423) Check block flag validity for block logging
+* DB transaction and slave-lag avoidance tweaks for Email Notifications
+* (bug 17104) Removed [Mark as patrolled] link for already patrolled revisions
+* (bug 17106) Added 'redirect=no' and 'mw-redirect' class to redirects at
+ "user contributions"
+* Rollback links on new pages removed from "user contributions"
+* (bug 15811) Re-upload form tweaks: license fields removed, destination locked,
+ comment label uses better message
+* Whole HTML validation ($wgValidateAllHtml) now works with external tidy
+* Parser tests no longer fail when $wgExternalLinkTarget is set in
+ LocalSettings
+* (bug 15391) catch DBQueryErrors on external storage insertion. This avoids
+ error messages on save were the edit in fact is saved.
+* (bug 17184) Remove duplicate "z" accesskey in MonoBook
+* Parser tests no longer fail when $wgAlwaysUseTidy is set in LocalSettings.php
+* Removed redundant dupe warnings on reupload for the same title. Dupe warnings
+ for identical files at different titles are still given.
+* Add 'change tagging' facility, where changes can be tagged internally with
+ certain designations, which are displayed on various summaries of changes,
+ and the entries can be styled with CSS.
+* (bug 17207) Fix regression breaking category page display on PHP 5.1
+* Categoryfinder utility class no longer fails on invalid input or gives wrong
+ results for category names that include pseudo-namespaces
+* (bug 17252) Galician numbering format
+* (bug 17146) Fix for UTF-8 and short word search for some possible MySQL
+ configs
+* (bug 7480) Internationalize database error message
+* (bug 16555) Number of links to mediawiki.org scaled back on post-installation
+* (bug 14938) Removing a section no longer leaves excess whitespace
+* (bug 17304) Fixed fatal error when thumbnails couldn't be generated for file
+ history
+* (bug 17283) Remove double URL escaping in show/hide links for log entries
+ and RevisionDeleteForm::__construct
+* (bug 17105) Numeric table sorting broken
+* (bug 17231) Transcluding special pages on wikis using language conversion no
+ longer affects the page title
+* (bug 6702) Default system messages updated/improved
+* (bug 17190) User ID on preference page no longer has delimeters
+* (bug 17341) "Powered by MediaWiki" should be on the left on RTL wikis
+* (bug 17404) "userrights-interwiki" right was missing in User::$mCoreRights
+* (bug 7509) Separation strings should be configurable
* (bug 17420) Send the correct content type from action=raw when the HTML file
cache is enabled.
+* (bug 12746) Do not allow new password e-mails when wiki is in read-only mode
+* (bug 17478) Fixed a PHP Strict standards error in
+ maintenance/cleanupWatchlist.php
+* (bug 17488) RSS/Atom links in left toolbar are now localized in classic skin
+* (bug 17472) use print <<<EOF in maintenance/importTextFile.php
+* Special:PrefixIndex: Move table styling to shared.css, add CSS IDs to tables
+ use correct message 'allpagesprefix' for input form label, replace _ with ' '
+ in next page link
+* (bug 17506) Exceptions within exceptions now respect $wgShowExceptionDetails
+* Fixed excessive job queue utilisation
+* File dupe messages for remote repos are now shown only once.
+* (bug 14980) Messages 'shareduploadwiki' and 'shareduploadwiki-desc' are now
+ used as a parameter in 'sharedupload' for easier styling and customization.
+* (bug 17482) Formatting error in Special:Preferences#Misc (Opera)
+* (bug 17556) <link> parameters in Special:Contributions feeds (RSS and Atom)
+ now point to the actual contributors' feed.
+* ForeignApiRepos now fetch MIME types, rather than trying to figure it locally
+* Special:Import: Do not show input field for import depth if
+ $wgExportMaxLinkDepth == 0
+* (bug 17570) $wgMaxRedirects is now correctly respected when following
+ redirects (was previously one more than $wgMaxRedirects)
+* (bug 16335) __NONEWSECTIONLINK__ magic word to suppress new section link.
+* (bug 17581) Wrong index name in PostgreSQL's updater: was rc_timestamp_nobot,
+ changed to rc_timestamp_bot
* (bug 17437) Fixed incorrect link to web-based installer
-* (bug 17527) Fixed missing MySQL-specific options in installer
+* (bug 17538) Use shorter URLs in <link> elements
+* (bug 13778) Hidden input added to the search form so that using the Enter key
+ on IE will do a fulltext search like clicking the button does
+* (bug 1061) CSS-added icons next to links display through the text and makes
+ it unreadable in RTL
+* Special:Wantedtemplates now works on PostgreSQL
+* (bug 14414) maintenance/updateSpecialPages.php no longer throws error with
+ PostgreSQL
+* (bug 17546) Correct Tongan language native name is "lea faka-Tonga"
+* (bug 17621) Special:WantedFiles has no link to Special:Whatlinkshere
+* (bug 17460) Client ecoding is now correctly set for PostgreSQL
+* (bug 17648) Prevent floats from intruding into edit area in previews if no
+ toolbar present
+* (bug 17692) Added (list of members) link to 'user' in Special:Listgrouprights
+* (bug 17707) Show file destination as plain text if &wpForReUpload=1
+* (bug 10172) Moved setting of "changed since last visit" flags out of the job
+ queue
+* (bug 17761) "show/hide" link in page history in now works for the first
+ displayed revision if it's not the current one
+* (bug 17722) Fix regression where users are unable to change temporary passwords
+* (bug 17799) Special:Random no longer throws a database error when a non-
+ namespace is given, silently falls back to NS_MAIN
+* (bug 17751) The message for bad titles in WantedPages is now localized
+* (bug 17860) Moving a page in the "MediaWiki" namespace using SuppressRedirect
+ no longer corrupts the message cache
+* (bug 17900) Fixed User Groups interface log display after saving groups.
+* (bug 17897) Fixed string offset error in <pre> tags
+* (bug 17778) MediaWiki:Catseparator can now have HTML entities
+* (bug 17676) Error on Special:ListFiles when using Postgres
+* Special:Export doesn't use raw SQL queries anymore
+* (bug 14771) Thumbnail links to individual DjVu pages have two no longer have
+ two "page" parameters
+* (bug 17972) Special:FileDuplicateSearch form now works correctly on wikis that
+ don't use PathInfo or short urls
+* (bug 17990) trackback.php now has a trackback.php5 alias and works with
+ $wgScriptExtension
+* (bug 14990) Parser tests works again with PostgreSQL
+* (bug 11487) Special:Protectedpages doesn't list protections with pr_expiry
+ IS NULL
+* (bug 18018) Deleting a file redirect leaves behind a malfunctioning redirect
+* (bug 17537) Disable bad zlib.output_compression output on HTTP 304 responses
+* (bug 11213) [edit] section links in printable version no longer appear when you cut-and-paste article text
+* (bug 17405) "Did you mean" to mirror Go/Search behavior of original request
+* (bug 18116) 'edittools' is now output identically on edit and upload pages
+* (bug 17241) The diffonly URI parameter should cascade to "Next edit" and "Previous edit" diff links
+* (bug 16823) 'Sidebar search form should not use Special:Search view URL as target'
+* (bug 16343) Non-existing, but in use, category pages can be "go" match hits
+* Fixed a CSS validation issue which allowed external images to be included
+ into wikis where that is disallowed by configuration.
+* Fixed a data leakage vulnerability for private wikis using img_auth.php or
+ similar image access authentication schemes. Check user permissions before
+ streaming out scaled images from thumb.php.
+
+== API changes in 1.15 ==
+* (bug 16858) Revamped list=deletedrevs to make listing deleted contributions
+ and listing all deleted pages possible
+* (bug 16844) Added clcategories parameter to prop=categories
+* (bug 17025) Add "fileextension" parameter to meta=siteinfo&siprop=
+* (bug 17048) Show the 'new' flag in list=usercontribs for the revision that
+ created the page, even if it's not the top revision
+* (bug 17069) Added ucshow=patrolled|!patrolled to list=usercontribs
+* action=delete respects $wgDeleteRevisionsLimit and the bigdelete user right
+* (bug 15949) Add undo functionality to action=edit
+* (bug 16483) Kill filesort in ApiQueryBacklinks caused by missing parentheses.
+ Building query properly now using makeList()
+* (bug 17182) Fix pretty printer so URLs with parentheses in them are
+ autolinked correctly
+* (bug 17224) Added siprop=rightsinfo to meta=siteinfo
+* (bug 17239) Added prop=displaytitle to action=parse
+* (bug 17317) Added watch parameter to action=protect
+* (bug 17007) Added export and exportnowrap parameters to action=query
+* (bug 17326) BREAKING CHANGE: Changed output format for iiprop=metadata
+* (bug 17355) Added auwitheditsonly parameter to list=allusers
+* (bug 17007) Added action=import
+* BREAKING CHANGE: Removed rctitles parameter from list=recentchanges because
+ of performance concerns
+* Listing (semi-)deleted revisions and log entries as well in prop=revisions
+ and list=logevents
+* (bug 11430) BREAKING CHANGE: Modules may return fewer results than the
+ limit and still set a query-continue in some cases
+* (bug 17357) Added movesubpages parameter to action=move
+* (bug 17433) Added bot flag to list=watchlist&wlprop=flags output
+* (bug 16740) Added list=protectedtitles
+* Added mainmodule and pagesetmodule parameters to action=paraminfo
+* (bug 17502) meta=siteinfo&siprop=namespacealiases no longer lists namespace
+ aliases already listed in siprop=namespaces
+* (bug 17529) rvend ignored when rvstartid is specified
+* (bug 17626) Added uiprop=email to list=userinfo
+* (bug 13209) Added rvdiffto parameter to prop=revisions
+* Manual language conversion improve: Now we can include both ";" and ":" in
+ conversion rules
+* (bug 17795) Don't report views count on meta=siteinfo if $wgDisableCounters
+ is set
+* (bug 17774) Don't hide read-restricted modules like action=query from users
+ without read rights, but throw an error when they try to use them.
+* Don't hide write modules when $wgEnableWriteAPI is false, but throw an error
+ when someone tries to use them
+* BREAKING CHANGE: action=purge requires write rights and, for anonymous users,
+ a POST request
+* (bug 18099) Using appendtext to edit a non-existent page causes an interface
+ message to be included in the page text
+* Fixed the circular template inclusion check, was broken when the loop
+ involved redirects. Without this, infinite recursion within the parser is
+ possible.
+* (bug 18601) generator=backlinks returns invalid continue parameter
+* (bug 18597) Internal error with empty generator= parameter
+* (bug 18617) Add xml:space="preserve" attribute to relevant tags in XML output
+* (bug 17611) Provide a sensible error message on install when the SQLite data
+ directory is wrong.
+
+=== Languages updated in 1.15 ===
+
+MediaWiki supports over 300 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of MediaZilla reports.
+
+* Austrian German (de-at) (new)
+* Swiss Standard German (de-ch) (new)
+* Simplified Gan Chinese (gan-hans) (new)
+* Traditional Gan Chinese (gan-hant) (new)
+* Literary Chinese (lzh) (new)
+* Uyghur (Latin script) (ug-latn) (renamed from 'ug')
+* Veps (vep) (new)
+* Võro (vro) (renamed from fiu-vro)
+* (bug 17151) Add magic word alias for #redirect for Vietnamese
+* (bug 17288) Messages improved for default language (English)
+* (bug 12937) Update native name for Afar
+* (bug 16909) 'histlegend' now reuses messages instead of copying them
+* (bug 17832) action=delete returns 'unknownerror' instead of 'permissiondenied' when
+ the user is blocked
+* Traditional/Simplified Gan Chinese conversion support
+
+== MediaWiki 1.14 ==
=== Configuration changes in 1.14 ===
@@ -5408,7 +5798,7 @@ User accounts:
groups. Note that this does *not* allow you to make pages which are only
accessible to certain groups.
- For details see: http://meta.wikimedia.org/wiki/Help:User_rights
+ For details see: http://www.mediawiki.org/wiki/Manual:User_rights
E-mail:
User-to-user e-mail can now be restricted to require a mail-back confirmation
@@ -5658,8 +6048,8 @@ Various bugfixes, small features, and a few experimental things:
* 'live preview' reduces preview reload burden on supported browsers
* support for external editors for files and wiki pages:
- http://meta.wikimedia.org/wiki/Help:External_editors
-* Schema reworking: http://meta.wikimedia.org/wiki/Proposed_Database_Schema_Changes/October_2004
+ http://www.mediawiki.org/wiki/Manual:External_editors
+* Schema reworking: http://www.mediawiki.org/wiki/Proposed_Database_Schema_Changes/October_2004
* (bug 15) Allow editors to view diff of their change before actually submitting an edit
* (bug 190) Hide your own edits on the watchlist
* (bug 510): Special:Randompage now works for other namespaces than NS_MAIN.
@@ -6342,7 +6732,7 @@ release for relevant bug fixes; see the changelog later in this file.
If you have trouble, remember to read this whole file and the online FAQ page
before asking for help:
-http://meta.wikimedia.org/wiki/MediaWiki_FAQ
+http://www.mediawiki.org/wiki/Manual:FAQ
=== READ THIS FIRST: Upgrading ===
diff --git a/Makefile b/Makefile
deleted file mode 100644
index b414ffa3..00000000
--- a/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# This Makefile is used to test some MediaWiki functions. If you
-# want to install MediaWiki, point your browser to ./config/
-#
-
-# Configuration:
-PROVE_BIN="prove"
-
-# Describe our tests:
-BASE_TEST=$(wildcard t/*.t)
-INCLUDES_TESTS=$(wildcard t/inc/*t)
-MAINTENANCE_TESTS=$(wildcard t/maint/*t)
-
-# Build groups:
-FAST_TESTS=$(BASE_TEST) $(INCLUDES_TESTS)
-ALL_TESTS=$(BASE_TEST) $(INCLUDES_TESTS) $(MAINTENANCE_TESTS)
-
-test: t/Test.php
- $(PROVE_BIN) $(ALL_TESTS)
-
-fast: t/Test.php
- $(PROVE_BIN) $(FAST_TESTS)
-
-maint:
- $(PROVE_BIN) $(MAINTENANCE_TESTS)
-
-verbose: t/Test.php
- $(PROVE_BIN) -v $(ALL_TESTS) | egrep -v '^ok'
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 4e5effb2..d3983380 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,461 +1,995 @@
= MediaWiki release notes =
-Security reminder: MediaWiki does not require PHP's register_globals
-setting since version 1.2.0. If you have it on, turn it *off* if you can.
-
-== MediaWiki 1.15.5 ==
+== MediaWiki 1.16.0 ==
2010-07-28
-This is a security and maintenance release.
+This is a stable release of the MediaWiki 1.16 branch.
+
+=== Summary of selected changes in 1.16 ===
+
+Selected changes since MediaWiki 1.15 that may be of interest:
+
+* Watchlists now have RSS/Atom feeds. RSS feeds generally are now hidden,
+ since Atom is a better protocol and is supported by virtually all clients.
+
+* It's now possible to block users from sending email via Special:Emailuser.
+
+* The maintenance script system was overhauled. Most maintenance scripts now
+ have a useful help page when you run them with --help.
-MediaWiki is now using a "continuous integration" development model with
-quarterly snapshot releases. The latest development code is always kept
-"ready to run", and in fact runs our own sites on Wikipedia.
+* AdminSettings.php is no longer required in order to run maintenance scripts.
+ You can just set $wgDBadminuser and $wgDBadminpassword in your
+ LocalSettings.php instead.
-Release branches will continue to receive security updates for about a year
-from first release, but nonessential bugfixes and feature developments
-will be made on the development trunk and appear in the next quarterly release.
+* The preferences system was overhauled. Preferences are stored in a more
+ compact format. Changes to site default preferences will automatically
+ affect all users who have not chosen a different preference.
-Those wishing to use the latest code instead of a branch release can obtain
-it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+* Support for SQLite was improved. Some broken features were fixed, and it
+ now has an efficient full-text search.
-== Changes since 1.15.4 ==
+* The user groups ACL system was improved by allowing rights to be revoked,
+ instead of just granted.
+* A new localisation caching system was introduced, which will make MediaWiki
+ faster for almost everyone, especially when lots of extensions are enabled.
+
+By default, this new system makes a lot of database queries. If your database
+is particularly slow, or if your system administrator limits your query count,
+or if you want to squeeze as much performance as possible out of Mediawiki,
+set $wgCacheDirectory to a writable path on the local filesystem. Make sure
+you have the DBA extension for PHP installed, this will improve performance
+further.
+
+== Changes since 1.16 beta 3 ==
+
+* (bug 23769) Disabled HTML 5 client-side form validation. Was introduced in
+ 1.16 beta 1, but is currently poorly supported by browsers.
+* (bug 23175) Re-added window.ta variable for backwards compatibility.
+* (bug 23264) Fixed breakage of various command line scripts due to extra line
+ endings being inserted by Maintenance::output().
+* Fixed HTTP client functionality with safe_mode=On.
+* Fixed parser tests broken in 1.16 beta 3.
+* For Oracle DB backend: fixed parser tests and table prefix feature.
+* (bug 23767) Fixed PHP warning when REQUEST_URI is blank (IIS issue).
+* Fixed plural function for Northern Sami (se)
+* (bug 23597) Fixed conflicts between ID attributes in the Vector skin and
+ parser-generated heading IDs. Renamed head, panel, head-base and page-base.
+* Disabled $wgHitcounterUpdateFreq>1 feature on SQLite, does not work yet.
+* (bug 23465) Don't ignore the predefined destination filename on
+ Special:Upload after following a red link to a file.
+* In SQLite full-text search feature: fixed "move page" feature, was non-
+ functional.
* (bug 24565) Fixed Cache-Control headers sent from API modules, to protect
user privacy in the case where an attacker can access the wiki through the
same HTTP proxy as a logged-in user.
-* Fixed a minor cookie header parsing issue causing incorrect Cache-Control
- headers to be sent.
* Fixed an XSS vulnerability in profileinfo.php for installations with
$wgEnableProfileInfo = true (false by default)
-* For backwards compatibility with extensions from 1.14.x or before, restored
- the original function ApiMain::requestWriteMode().
-* In API login "need token" responses, added the cookieprefix and sessionid
- fields, as in MediaWiki 1.16.x. This is an improvement to the CSRF fix
- introduced in 1.15.3.
+* Fixed a case where an X-Vary-Options header was sent despite $wgUseXVO being
+ false. Fixed a minor header parsing issue when $wgUseXVO = true.
+* Fixed a register_globals arbitrary inclusion vulnerability in
+ MediaWikiParserTest.php, introduced in 1.16 beta 1.
-== Changes since 1.15.3 ==
+== Changes since 1.16 beta 2 ==
+* Fixed bugs in the [[Special:Userlogin]] and [[Special:Emailuser]] handling of
+ invalid usernames.
+* Fixed sorting in [[Special:Allmessages]]
+* (bug 23113) Fixed title in the show/hide links on diff pages
+* (bug 23117) Fixed API rollback, was returning "badtoken" for valid requests
+* (bug 23127) Re-added missing $1 parameter to the uploadtext message
+* Fixed a bug in the Vector skin where personal tools display behind the logo
+* (bug 23139) Fixed a bug in edit conflict resolution, where both textboxes
+ showed the same text.
+* (bug 23115, bug 23124) Fixed various problems with <title> and <h1> elements
+ in page views and previews when the language converter is enabled.
+* (bug 23148) Fixed a local path disclosure vulnerability in ImageMagick image
+ scaling, which was introduced in 1.16 beta 1.
+* Improved error checking on installer.
+* (bug 22970) Fixed a JavaScript error in the upload destination conflict
+ check.
+* (bug 23167) Check the watch checkbox by default if the watchcreations
+ preference is set.
+* (bug 23171) Improve IE6 version check to avoid false positives.
+* (bug 23176) Fixed upload warning override feature "upload new version",
+ broken in 1.16 beta 1.
+* Fixed regression in unwatch links sent out in notification emails. When the
+ mailing job was deferred via the job queue, the title was incorrect.
* (bug 23534) Fixed SQL query error in API list=allusers.
+* Fixed a bug in uploads for non-JavaScript clients. An empty string was used
+ as the default destination filename, instead of the source filename as
+ expected.
* (bug 23371) Fixed CSRF vulnerability in "e-mail me my password", "create
account" and "create by e-mail" features of [[Special:Userlogin]]
* (bug 23687) Fixed XSS vulnerability affecting IE clients only, due to a CSS
validation issue.
+* Fixed a DoS vulnerability in ImageMagick image scaling. ImageMagick
+ expanded wildcard characters "?" and "*" in image filenames, potentially
+ causing large numbers of images to be scaled in response to a single request.
+ The fix for this involves breaking the scaling of such image filenames until
+ ImageMagick 6.6.1-5 or later is deployed, see bug 23361 for more details.
+* (bug 23608) Fixed invalid HTML in diff pages.
-=== Changes since 1.15.2 ===
+=== Changes since 1.16 beta 1 ===
-* (bug 22828) Fixed deletion on SQLite.
+* Fixed errors in maintenance/patchSql.php
+* (bug 19627) Fix regression from r57867 where HTMLForm would output
+ <element classes="foo bar"> rather than <element class="foo bar">
+* Fixed broken "-r" option to maintenance/lag.php
* (bug 23076) Fixed login CSRF vulnerability. Logins now require a token to
be submitted along with the user name and password.
-=== Changes since 1.15.1 ===
+=== Configuration changes in 1.16 ===
-* The installer now includes a check for a data corruption issue with certain
- versions of libxml2 2.7 and PHP earlier than 5.2.9, and also for a PHP bug
- present in the official release of PHP 5.3.1.
-* (bug 20239) MediaWiki:Imagemaxsize does not contain anymore a <br /> tag which
- was displayed to the user
-* (bug 21150) SQLite no longer raise an error when deleting files
-* (bug 20880) Fixed updater failure on SQLite backend
-* upgrade1_5.php now requires to be run --update option to prevent confusion
-* Fixed a CSS validation issue which allowed external images to be included
- into wikis where that is disallowed by configuration.
-* Fixed a data leakage vulnerability for private wikis using img_auth.php or
- similar image access authentication schemes. Check user permissions before
- streaming out scaled images from thumb.php.
-
-=== Changes since 1.15.0 ===
-
-* Fixed fatal errors for unusual file repository configurations, such as
- ForeignAPIRepo.
-* Fixed the "change password" link on Special:Preferences to have the correct
- returnto parameter.
-* (bug 19693) Fixed cross-site scripting vulnerability in Special:Block
-
-=== Changes since 1.15.0rc1 ===
-
-* Removed category redirect feature, implementation was incomplete.
-* (bug 18846) Remove update_password_format(), unnecessary, destroys all
- passwords if a wiki with $wgPasswordSalt=false is upgraded with the web
- installer.
-* (bug 19127) Documentation warning for PostgreSQL users who run update.php:
- use the same user in AdminSettings.php as in LocalSettings.php.
-* Fixed possible web invocation of some maintenance scripts, due to the use of
- include() instead of require(). A full exploit would require a very strange
- web server configuration.
-* Localisation updates.
-
-=== Configuration changes in 1.15 ===
-
-* Added $wgNewPasswordExpiry, to specify an expiry time (in seconds) to
- temporary passwords
-* Added $wgUseTwoButtonsSearchForm to choose the Search form behavior/look
-* Added $wgNoFollowDomainExceptions to allow exempting particular domain names
- from rel="nofollow" on external links
-* (bug 12970) Brought back $wgUseImageResize.
-* Added $wgRedirectOnLogin to allow specifying a specifc page to redirect users
- to upon logging in (ex: "Main Page")
-* Add $wgExportFromNamespaces for enabling/disabling the "export all from
- namespace" option (disabled by default)
-
-=== New features in 1.15 ===
-
-* (bug 2242) Add an expiry time to temporary passwords
-* (bug 9947) Add PROTECTIONLEVEL parser function to return the protection level
- for the current page for a given action
-* (bug 17002) Add &minor= and &summary= as parameters in the url when editing,
- to automatically add a summary or a minor edit.
-* (bug 16852) padleft and padright now accept multiletter pad characters
-* When using 'UserCreateForm' hook to add new checkboxes into
- Special:UserLogin/signup, the messages can now contain HTML to allow
- hyperlinking to the site's Terms of Service page, for example
-* Add new hook 'UserLoadFromDatabase' that is called while loading a user
- from the database.
-* (bug 17045) Options on the block form are prefilled with the options of the
- existing block when modifying an existing block.
-* (bug 17055) "(show/hide)" links to Special:RevisionDelete now use a CSS class
- rather than hardcoded HTML tags
-* Added new hook 'WantedPages::getSQL' into SpecialWantedpages.php to allow
- extensions to alter the SQL query which is used to get the list of wanted
- pages
-* (bugs 16957/16969) Add show/hide to preferences for RC patrol options on
- specialpages
-* (bug 11443) Auto-noindex user/user talk pages for blocked user
-* (bug 11644) Add $wgMaxRedirects variable to control how many redirects are
- recursed through until the "destination" page is reached.
-* Add $wgInvalidRedirectTargets variable to prevent redirects to certain
- special pages.
-* Use HTML5 rel attributes for some links, where appropriate
-* Added optional alternative Search form look - Go button & Advanced search
- link instead of Go button & Search button
-* (bug 2314) Add links to user custom CSS and JS to Special:Preferences
-* More helpful error message on raw page access if PHP_SELF isn't set
-* (bug 13040) Gender switch in user preferences
-* (bug 13040) {{GENDER:}} magic word for interface messages
-* (bug 3301) Optionally sort user list according to account creation time
-* Remote description pages for foreign file repos are now fetched in the
- content language.
-* (bug 17180) If $wgUseFileCache is enabled, $wgShowIPinHeader is automatically
- set to false.
-* (bug 16604) Mark non-patrolled edits in feeds with "!"
-* (bug 16604) Show title/rev in IRC for patrol log
-* (bug 16854) Whether a page is being parsed as a preview or section preview
- can now be determined and set with ParserOptions.
-* Wrap message 'confirmemail_pending' into a div with CSS classes "error" and
- "mw-confirmemail-pending"
-* (bug 8249) The magic words for namespaces and pagenames can now be used as
- parser functions to return the desired namespace or normalized title/title
- part for a given title.
-* (bug 17110) Styled #mw-data-after-content in cologneblue.css to match the
- rest of the font
-* (bug 7556) Time zone names in signatures lack i18n
-* (bug 3311) Automatic category redirects
-* (bug 17236) Suppress 'watch user page link' for IP range blocks
-* Wrap message 'searchresulttext' (Special:Search) into a div with
- class "mw-searchresult"
-* (bug 15283) Interwiki imports can now fetch included templates
-* Treat svn:// URLs as external links by default
-* New function to convert namespace text for display (only applies on wiki with
- LanguageConverter class)
-* (bug 17379) Contributions-title is now parsed for magic words.
-* Preprocessor output now cached in memcached.
-* (bug 14468) Lines in classic RecentChanges and Watchlist have classes
- "mw-line-odd" and "mw-line-even" to make styling using css possible.
-* (bug 17311) Add a note beside the gender selection menu to tell users that
- this information will be public
-* Localize time zone regions in Special:Preferences
-* Add NUMBEROFACTIVEUSERS magic word, which is like NUMBEROFUSERS, but uses
- the active users data from site_stats.
-* Add a <link rel="canonical"> tag on redirected page views
-* Replace hardcoded '...' as indication of a truncation with the
- 'ellipsis' message
-* Wrap warning message 'editinginterface' into a div with class
- 'mw-editinginterface'
-* (bug 17497) Oasis opendocument added to mime.types
-* Remove the link to Special:FileDuplicateSearch from the "file history" section
- of image description pages as the list of duplicated files is shown in the
- next section anyway.
+* (bug 18222) $wgMinimalPasswordLength default is now 1
+* $wgSessionHandler can be used to configure session.save_handler
+* $wgLocalFileRepo/$wgForeignFileRepos now have a 'fileMode' parameter to
+ be used when uploading/moving files
+* (bug 18761) $wgHiddenPrefs is a new array for specifying preferences not
+ to be shown to users
+* $wgAllowRealName and $wgAllowUserSkin were deprecated in favor of
+ $wgHiddenPrefs[] = 'realname', but the former are still retained
+ for backwards-compatibility
+* (bug 9257) $wgRCMaxAge now defaults to three months
+* $wgDevelopmentWarnings can be set to true to show warnings about deprecated
+ functions and other potential errors when developing.
+* Subpages are now enabled in the MediaWiki namespace by default. This is
+ mainly a cosmetic change, and does not in any way affect the MessageCache,
+ which was already effectively treating the namespace as if it had subpages.
+* Oracle: maintenance/ora/user.sql script for creating DB user on oracle with
+ appropriate privileges. Creating this user with web-install page requires
+ oci8.privileged_connect set to On in php.ini.
+* Removed UserrightsChangeableGroups hook introduced in 1.14
+* Added $wgCacheDirectory, to replace $wgFileCacheDirectory,
+ $wgLocalMessageCache, and any other local caches which need a place to put
+ files.
+* $wgFileCacheDirectory is no longer set to anything by default, and so either
+ needs to be set explicitly, or $wgCacheDirectory needs to be set instead.
+* $wgLocalMessageCache has been removed. Instead, set $wgUseLocalMessageCache
+ to true
+* Removed $wgEnableSerializedMessages and $wgCheckSerialized. Similar
+ functionality is now available via $wgLocalisationCacheConf.
+* $wgMessageCache->addMessages() is deprecated. Messages added via this
+ interface will not appear in Special:AllMessages.
+* $wgRegisterInternalExternals can be used to record external links pointing
+ to same server
+* (bug 19907) $wgCrossSiteAJAXdomains and $wgCrossSiteAJAXdomainExceptions added
+ to control which external domains may access the API via cross-site AJAX.
+* $wgMaintenanceScripts for extensions to add their scripts to the default list
+* $wgMemoryLimit has been added, default value '50M'
+* $wgExtraRandompageSQL is deprecated, the SpecialRandomGetRandomTitle hook
+ should be used instead
+* (bug 20489) $wgIllegalFileChars added to override the default list of illegal
+ characters in file names.
+* (bug 19646) $wgImgAuthDetails added to display reason access to uploaded file
+ was denied to users(img_auth only)
+* (bug 19646) $wgImgAuthPublicTest added to test to see if img_auth set up
+ correctly (img_auth only)
+* $wgUploadMaintenance added to disable file deletions and restorations during
+ maintenance
+* $wgCapitalLinkOverrides added to configure per-namespace capitalization
+* (bug 21172) $wgSorbsUrl can now be an array with multiple DNSBL and renamed
+ to $wgDnsBlacklistUrls (backward compatibility kept)
+* $wgEnableHtmlDiff has been removed
+* (bug 3340) $wgBlockCIDRLimit added (default: 16) to configure the low end of
+ CIDR ranges for blocking
+* $wgUseInstantCommons added for quick and easy enabling of Commons as a remote
+ file repository
+* $wgDBAhandler added to choose a DBA handler when using CACHE_DBA
+* $wgPreviewOnOpenNamespaces for extensions that create namespaces that behave
+ similarly to the category namespace.
+* $wgEnableSorbs renamed to $wgDnsBlacklistUrls ($wgEnableSorbs kept for
+ backward compatibility)
+* $wgUploadNavigationUrl now also affects images inline images that do not
+ exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
+ it as appropriate.
+* If $wgLocaltimezone is null, use the server's timezone as the default for
+ signatures. This was always the behaviour documented in DefaultSettings.php
+ but has not been the actual behaviour for some time: instead, UTC was used
+ by default.
+* Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
+ If not specified it will default to $wgScriptPath/extensions
+* Added $wgCountTotalSearchHits to make search UI display total number of hits
+ with some search engines.
+* Added $wgAdvertisedFeedTypes to decide what feed types (RSS, Atom, both, or
+ neither) MediaWiki advertises. Default is array( 'atom' ), so RSS is no
+ longer advertised by default (but it still works).
+* Added $wgMemCachedTimeout, controls how long to wait for data from the
+ memcached servers.
+* New configuration variables $wgDebugTimestamps and $wgDebugPrintHttpHeaders
+ for controlling debug output.
+* New $wgBlockDisablesLogin when set to true disallows blocked users from
+ logging in.
+* (bug 8790) Metadata edition ($wgUseMetadataEdit) has been moved to a separate
+ extension "MetadataEdit".
+
+=== New features in 1.16 ===
+
+* Add CSS defintion of the 'wikitable' class to shared.css
+* (bug 17163) Added MediaWiki:Talkpageheader which will be displayed when
+ viewing talk pages
+* Superfluous border="0" removed from images
+* Added new hook 'MessageCacheReplace' into MessageCache.php. For instance
+ to allow extensions to update caches in similar way as MediaWiki invalidates
+ a cached MonoBook sidebar
+* Special:AllPages: Move hardcoded styles from code to CSS
+* (bug 18529) New hook: SoftwareInfo for adding information about the software
+ to Special:Version
+* Added $wgExtPGAlteredFields to allow extensions to easily alter the data
+ type of columns when using the Postgres backend.
+* (bug 16950) Show move log when viewing/creating a deleted page
+* (bug 18242) Show the Subversion revision number per extensions in
+ Special:Version
+* (bug 18420) Missing file revisions are handled gracefully now
+* (bug 9219) Auth plugins can control editing RealName/Email/Nick preferences
+* (bug 18466) Add note or warning when overruling a move (semi-)protection
+* (bug 18342) insertTags works in edit summary box
+* (bug 18411) The upload form also checks post_max_size
+* Watchlist now has a specialized <div> tag that contains a unique class for
+ each page
+* Added Minguo calendar support for the Taiwan Chinese language
+* Database: unionQueries function to be used for UNION sql construction, so
+ it can be overloaded on DB abstraction level for DB specific functionality
+* (bug 18849) Implement Japanese and North Korean calendars
+* (bug 5755) Introduce {{CURRENTMONTH1}} and {{LOCALMONTH1}} to display the
+ month number without the leading zero
+* (bug 13456) categoriespagetext supports PLURAL
+* (bug 18860) Blocks of IPs affecting registered users can now block email
+* (bug 17093) Date and time are separate parameters in Special:BlockList
+* (bug 11484) Added ISO speed rating to default collapsed EXIF metadata view
+* (bug 14866) Messages 'recentchangeslinked-toolbox' and
+ 'recentchangeslinked-toolbox' were added to allow more fine grained
+ customisation of the user interface
+* DISPLAYTITLE now accepts a limited amount of wiki markup (the single-quote
+ items)
+* Special:Search now could search terms in all variant-forms. ONLY apply on
+ wikis enabled LanguageConverter.
+* Add autopromote condition APCOND_BLOCKED to autopromote blocked users to
+ various user groups.
+* Add $wgRevokePermissions as a means of restricting a group's rights. The
+ syntax is identical to $wgGroupPermissions, but users in these groups will
+ have these rights stripped from them.
+* Added a PHP port of CDB (constant database), for improved local caching when
+ the DBA extension is not available.
+* Introduced a new system for localisation caching. The system is based around
+ fast fetches of individual messages, minimising memory overhead and startup
+ time in the typical case. The database backend will be used by default, but
+ set $wgCacheDirectory to get a faster CDB-based implementation.
+* Expanded the number of variables which can be set in the extension messages
+ files.
+* Added a feature to allow per-article process pool size control for the parsing
+ task, to limit resource usage when the cache for a heavily-viewed article is
+ invalidated. Requires an external daemon.
+* (bug 19576) Moved the id attribues from the anchors accompanying section
+ headers to the <span class="mw-headline"> elements within the section headers,
+ removing the redundant anchor elements.
+* Parser::setFunctionTagHook now can be used to add a new tag which is parsed at
+ preprocesor level.
+* Added $wgShowArchiveThumbnails, allowing sysadmins to disable thumbnail
+ display for old versions of images.
+* In watchlists and Special:RecentChanges, the difference in page size now
+ appears in dark green if bytes were added and dark red if bytes were removed.
+* Added FSRepo configuration properties thumbUrl and thumbDir, to allow the
+ thumbnails to be stored in a separate location to the source images.
+* If config/ directory is not executable, the command to make it executable
+ now asks the user to cd to the correct directory
+* Add experimental new external authentication framework, ExternalAuth
+* (bug 18768) Remove AdminSettings requirements. Maintenance environment
+ will still load it if it exists, but it's not required for anything
+* (bug 19900) The "listgrouprights-key" message is now wrapped in a div with
+ class "mw-listgrouprights-key"
+* (bug 471) Allow RSS feeds for watchlist, using an opt-in security token
+* (bug 10812) Interwiki links can have names and descriptions, fetched from
+ message 'interwiki-desc-PREFIX', not really used anywhere yet though
+* (bug 9691) Add type (signup or login) parameter to
+ AuthPlugin::ModifyUITemplate()
+* (bug 14454) "Member of group(s)" in Special:Preferences causes language
+ difficulties
+* (bug 16697) Unicode combining characters are difficult to edit in some
+ browsers
+* Parser test supports uploading results to remote CodeReview instance
+* (bug 20013) Added CSS class "mw-version-ext-version" is wrapped on the
+ extension version in Special:Version
+* (bug 20014) Added CSS class "mw-listgrouprights-right-name" is wrapped on the
+ right name in Special:ListGroupRights
+* (bug 12920) New CoreParserFunction {{nse:...}} as an url-friendly equivalent
+ to {{ns:...}}
+* (bug 16322) Allow maintenance scripts to accept DB user/pass over input or
+ params
+* (bug 18566) Maintenance script to un/protect pages
+* (bug 671) The HTML <abbr> tag is now permitted.
+* RecentChanges now has a legend to explain what the Nmb! flags mean, and the
+ flags have tooltips.
+* (bug 15209) New hook BeforeInitialize called after everything has been setup
+ but before Mediawiki::performRequestForTitle()
+* wgMainPageTitle variable now available to JavaScript code to identify the main
+ page link, so it doesn't have to be extracted from the link URLs.
+* (bug 16836) Display preview of signature in user preferences and describe its
+ use
+* The default output format is now HTML 5 instead of XHTML 1.0 Transitional.
+ This can be disabled by setting $wgHtml5 = false;. Specific features enabled
+ if HTML 5 is used:
+** Some extra inputs will be autofocused, in supporting browsers.
+** The summary attribute has been removed from tables of contents. summary is
+ obsolete in HTML 5 and wasn't useful here anyway.
+** Unnecessary type="" attribute removed for CSS and JS.
+** If $wgWellFormedXml is set to false, some bytes will be shaved off of HTML
+ output by omitting some things like quotation marks where HTML 5 allows.
+** (bug 16921) maxlength enabled for page move comments
+* The description message in $wgExtensionCredits can be an array with parameters
+* New hook SpecialRandomGetRandomTitle allows extensions to modify the selection
+ criteria used by Special:Random and subclasses, or substitute a custom result,
+ deprecating the $wgExtraRandompageSQL config variable
+* (bug 20318) Distinct CSS classes for ISBN/RFC/PMID special links added
+* (bug 20404) Custom fields in the user creation form template can now have
+ detail labels in prefsectiontip divs.
+* MakeSysop and MakeBot are now aliases for Special:UserRights
+* IndexPager->mLimitsShown can now be an associative array of limit => text-to-
+ display-in-limit-form.
+* (bug 18880) LogEventsList::showLogExtract() can now take a string-by-reference
+ and add its HTML to it, rather than having to go straight to $wgOut.
+* Added $wgShowDBErrorBacktrace, to allow users to easily gather backtraces for
+ database connection and query errors.
+* Show change block / unblock link on Special:Contributions if user is blocked
+* Display note on Special:Contributions if the user is blocked, and provide an
+ excerpt from the block log.
+* (bug 19646) New hook: ImgAuthBeforeStream for tests and functionality before
+ file is streamed to user, but only when using img_auth
+* Note on non-existing user and user talk pages if user does not exist
+* New hook ShowMissingArticle so extensions can modify the output for
+ non-existent pages.
+* Admins could disable some variants using $wgDisabledVariants now. ONLY apply
+ on wikis enabled LanguageConverter.
+* (bug 16310) Credits page now lists IP addresses rather than saying the number
+ of anonymous users that edited the page
+* New permission 'sendemail' added. Default right for all registered users. Can
+ for example be used to prevent new accounts from sending spam.
+* (bug 16979) Tracking categories for __INDEX__ and __NOINDEX__
+* Two new hooks, ConfirmEmailComplete and InvalidateEmailComplete, which are
+ called after a user's email has been successfully confirmed or invalidated.
+* (bug 19741) Moved the XCF files out of the main MediaWiki distribution, for
+ a smaller subversion checkout.
+* (bug 13750) First letter capitalization can now be a per-namespace setting
+* (bug 21073) "User does not exist" message no longer displayed on sub-sub-pages
+ of existing users
+* (bug 21095) Tracking categories produced by the parser (expensive parser
+ function limit exceeded, __NOINDEX__ tracking, etc) can now be disabled by
+ setting the system message ([[MediaWiki:expensive-parserfunction-category]]
+ etc) to "-".
+* Added maintenance script sqlite.php for SQLite-specific maintenance tasks.
+* Rewrote Special:Upload to allow easier extension.
+* Upload errors that can be solved by changing the filename now do not require
+ reuploading.
* Added $wgRateLimitsExcludedIPs, to allow specific IPs to be whitelisted from
rate limits.
-* (bug 14981) Shared repositories can now have display names, located at
- Mediawiki:Shared-repo-name-REPONAME, where REPONAME is the name in
- $wgForeignFileRepos
-* Special:ListUsers: Sort list of usergroups by alphabet
-* (bug 16762) Special:Movepage now shows a list of subpages when possible
-* (bug 17585) Hide legend on Special:Specialpages from non-privileged users
-* Added $wgUseTagFilter to control enabling of filter-by-change-tag
-* (bug 17291) MediaWiki:Nocontribs now has an optional $1 parameter for the
- username
-* Wrap special page summary message '$specialPageName-summary' into a div
- with class 'mw-specialpage-summary'
-* $wgSummarySpamRegex added to handle edit summary spam. This is used *instead*
- of $wgSpamRegex for edit summary checks. Text checks still use $wgSpamRegex.
-* New function to convert content text to specified language (only applies on wiki with
- LanguageConverter class)
-* (bug 17844) Redirect users to a specific page when they log in, see
- $wgRedirectOnLogin
-* Added a link to Special:UserRights on Special:Contributions for privileged users
-* (bug 10336) Added new magic word {{REVISIONUSER}}, which displays the editor
- of the displayed revision's author user name
-* LinkerMakeExternalLink now has an $attribs parameter for link attributes and
- a $linkType parameter for the type of external link being made
-* (bug 17785) Dynamic dates surrounded with a <span> tag, fixing sortable tables
- with dynamic dates.
-* (bug 4582) Provide preference-based autoformatting of unlinked dates with the
- dateformat parser function.
-* (bug 17886) Special:Export now allows you to export a whole namespace (limited
- to 5000 pages)
-* (bug 17714) Limited TIFF upload support now built in if 'tif' extension is
- enabled. Image width and height are now recognized, and when using ImageMagick,
- optional flattening to PNG or JPEG for inline display can be enabled by setting
- $wgTiffThumbnailType
-* Renamed two input IDs on Special:Log from 'page' and 'user' to 'mw-log-page' and
- 'mw-log-user', respectively
-* Added $wgInvalidUsernameCharacters to disallow certain characters in
- usernames during registration (such as "@")
-* Added $wgUserrightsInterwikiDelimiter to allow changing the delimiter
- used in Special:UserRights to denote the user should be searched for
- on a different database
-* Add a class if 'missingsummary' is triggered to allow styling of the summary
- line
-
-=== Bug fixes in 1.15 ===
-
-* (bug 16968) Special:Upload no longer throws useless warnings.
-* (bug 17000) Special:RevisionDelete now checks if the database is locked
- before trying to delete the edit.
-* (bug 16852) padleft and padright now handle multibyte characters correctly
-* (bug 17010) maintenance/namespaceDupes.php now add the suffix recursively if
- the destination page exists
-* (bug 17035) Special:Upload now fails gracefully if PHP's file_uploads has
- been disabled
-* Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with
- LanguageConverter class)
-* Improving the efficiency by using -{A|xxx}- syntax (only applies on wiki with
- LanguageConverter class)
-* (bug 17054) Added more descriptive errors in Special:RevisionDelete
-* (bug 11527) Diff on page with one revision shows "Next" link to same diff
-* (bug 8065) Fix summary forcing for new pages
-* (bug 10569) redirects to Special:Mypage and Special:Mytalk are no longer
- allowed by default. Change $wgInvalidRedirectTargets to re-enable.
-* (bug 3043) Feed links of given page are now preceded by standard feed icon
-* (bug 17150) escapeLike now escapes literal \ properly
-* Inconsistent use of sysop, admin, administrator in system messages changed
- to 'administrator'
-* (bug 14423) Check block flag validity for block logging
-* DB transaction and slave-lag avoidance tweaks for Email Notifications
-* (bug 17104) Removed [Mark as patrolled] link for already patrolled revisions
-* (bug 17106) Added 'redirect=no' and 'mw-redirect' class to redirects at
- "user contributions"
-* Rollback links on new pages removed from "user contributions"
-* (bug 15811) Re-upload form tweaks: license fields removed, destination locked,
- comment label uses better message
-* Whole HTML validation ($wgValidateAllHtml) now works with external tidy
-* Parser tests no longer fail when $wgExternalLinkTarget is set in
- LocalSettings
-* (bug 15391) catch DBQueryErrors on external storage insertion. This avoids
- error messages on save were the edit in fact is saved.
-* (bug 17184) Remove duplicate "z" accesskey in MonoBook
-* Parser tests no longer fail when $wgAlwaysUseTidy is set in LocalSettings.php
-* Removed redundant dupe warnings on reupload for the same title. Dupe warnings
- for identical files at different titles are still given.
-* Add 'change tagging' facility, where changes can be tagged internally with
- certain designations, which are displayed on various summaries of changes,
- and the entries can be styled with CSS.
-* (bug 17207) Fix regression breaking category page display on PHP 5.1
-* Categoryfinder utility class no longer fails on invalid input or gives wrong
- results for category names that include pseudo-namespaces
-* (bug 17252) Galician numbering format
-* (bug 17146) Fix for UTF-8 and short word search for some possible MySQL
- configs
-* (bug 7480) Internationalize database error message
-* (bug 16555) Number of links to mediawiki.org scaled back on post-installation
-* (bug 14938) Removing a section no longer leaves excess whitespace
-* (bug 17304) Fixed fatal error when thumbnails couldn't be generated for file
- history
-* (bug 17283) Remove double URL escaping in show/hide links for log entries
- and RevisionDeleteForm::__construct
-* (bug 17105) Numeric table sorting broken
-* (bug 17231) Transcluding special pages on wikis using language conversion no
- longer affects the page title
-* (bug 6702) Default system messages updated/improved
-* (bug 17190) User ID on preference page no longer has delimeters
-* (bug 17341) "Powered by MediaWiki" should be on the left on RTL wikis
-* (bug 17404) "userrights-interwiki" right was missing in User::$mCoreRights
-* (bug 7509) Separation strings should be configurable
-* (bug 17420) Send the correct content type from action=raw when the HTML file
- cache is enabled.
-* (bug 12746) Do not allow new password e-mails when wiki is in read-only mode
-* (bug 17478) Fixed a PHP Strict standards error in
- maintenance/cleanupWatchlist.php
-* (bug 17488) RSS/Atom links in left toolbar are now localized in classic skin
-* (bug 17472) use print <<<EOF in maintenance/importTextFile.php
-* Special:PrefixIndex: Move table styling to shared.css, add CSS IDs to tables
- use correct message 'allpagesprefix' for input form label, replace _ with ' '
- in next page link
-* (bug 17506) Exceptions within exceptions now respect $wgShowExceptionDetails
-* Fixed excessive job queue utilisation
-* File dupe messages for remote repos are now shown only once.
-* (bug 14980) Messages 'shareduploadwiki' and 'shareduploadwiki-desc' are now
- used as a parameter in 'sharedupload' for easier styling and customization.
-* (bug 17482) Formatting error in Special:Preferences#Misc (Opera)
-* (bug 17556) <link> parameters in Special:Contributions feeds (RSS and Atom)
- now point to the actual contributors' feed.
-* ForeignApiRepos now fetch MIME types, rather than trying to figure it locally
-* Special:Import: Do not show input field for import depth if
- $wgExportMaxLinkDepth == 0
-* (bug 17570) $wgMaxRedirects is now correctly respected when following
- redirects (was previously one more than $wgMaxRedirects)
-* (bug 16335) __NONEWSECTIONLINK__ magic word to suppress new section link.
-* (bug 17581) Wrong index name in PostgreSQL's updater: was rc_timestamp_nobot,
- changed to rc_timestamp_bot
-* (bug 17437) Fixed incorrect link to web-based installer
-* (bug 17538) Use shorter URLs in <link> elements
-* (bug 13778) Hidden input added to the search form so that using the Enter key
- on IE will do a fulltext search like clicking the button does
-* (bug 1061) CSS-added icons next to links display through the text and makes
- it unreadable in RTL
-* Special:Wantedtemplates now works on PostgreSQL
-* (bug 14414) maintenance/updateSpecialPages.php no longer throws error with
- PostgreSQL
-* (bug 17546) Correct Tongan language native name is "lea faka-Tonga"
-* (bug 17621) Special:WantedFiles has no link to Special:Whatlinkshere
-* (bug 17460) Client ecoding is now correctly set for PostgreSQL
-* (bug 17648) Prevent floats from intruding into edit area in previews if no
- toolbar present
-* (bug 17692) Added (list of members) link to 'user' in Special:Listgrouprights
-* (bug 17707) Show file destination as plain text if &wpForReUpload=1
-* (bug 10172) Moved setting of "changed since last visit" flags out of the job
- queue
-* (bug 17761) "show/hide" link in page history in now works for the first
- displayed revision if it's not the current one
-* (bug 17722) Fix regression where users are unable to change temporary passwords
-* (bug 17799) Special:Random no longer throws a database error when a non-
- namespace is given, silently falls back to NS_MAIN
-* (bug 17751) The message for bad titles in WantedPages is now localized
-* (bug 17860) Moving a page in the "MediaWiki" namespace using SuppressRedirect
- no longer corrupts the message cache
-* (bug 17900) Fixed User Groups interface log display after saving groups.
-* (bug 17897) Fixed string offset error in <pre> tags
-* (bug 17778) MediaWiki:Catseparator can now have HTML entities
-* (bug 17676) Error on Special:ListFiles when using Postgres
-* Special:Export doesn't use raw SQL queries anymore
-* (bug 14771) Thumbnail links to individual DjVu pages have two no longer have
- two "page" parameters
-* (bug 17972) Special:FileDuplicateSearch form now works correctly on wikis that
- don't use PathInfo or short urls
-* (bug 17990) trackback.php now has a trackback.php5 alias and works with
- $wgScriptExtension
-* (bug 14990) Parser tests works again with PostgreSQL
-* (bug 11487) Special:Protectedpages doesn't list protections with pr_expiry
- IS NULL
-* (bug 18018) Deleting a file redirect leaves behind a malfunctioning redirect
-* (bug 17537) Disable bad zlib.output_compression output on HTTP 304 responses
-* (bug 11213) [edit] section links in printable version no longer appear when
- you cut-and-paste article text
-* (bug 17405) "Did you mean" to mirror Go/Search behavior of original request
-* (bug 18116) 'edittools' is now output identically on edit and upload pages
-* (bug 17241) The diffonly URI parameter should cascade to "Next edit" and
- "Previous edit" diff links
-* (bug 16823) 'Sidebar search form should not use Special:Search view URL as
- target'
-* (bug 16343) Non-existing, but in use, category pages can be "go" match hits
-* Fixed the circular template inclusion check, was broken when the loop
- involved redirects. Without this, infinite recursion within the parser is
- possible.
-* (bug 17611) Provide a sensible error message on install when the SQLite data
- directory is wrong.
-* (bug 16937) Fixed PostgreSQL installation on Windows, workaround for upstream
- pg_version() bug.
-* (bug 11451) Fix upgrade from MediaWiki 1.2 or earlier (imagelinks schema).
-* Fixed SQLite indexes, installation and upgrade. Reintroduced it as an option
- to the installer.
+* (bug 21222) When $wgUseTeX is not enabled, <math> is no longer registered with
+ the parser so extensions are free to implement their own <math> tag
+* (bug 21047) Wrap 'cannotdelete' into a div with the generic 'error' class and
+ an own 'mw-error-cannotdelete' class
+* New hook AbortNewAccountAuto, called before account creation from AuthPlugin-
+ or ExtUser-driven requests.
+* (bug 3480) The warning saying that the page has a history when deleting it now
+ contains the number of revisions in the history
+* $wgStylePath and $wgLogo are now set in the default LocalSettings.php file.
+* (bug 20186) Allow filtering history for revision deletion.
+* New hook OtherBlockLogLink, called in Special:IPBlockList and Special:Block
+ to show links to block logs of other blocking extensions, i.e. GlobalBlocking
+* Added search capabilities to SQLite backend
+* rebuildtextindex.php maintenance script now supports databases other than
+ MySQL
+* upgrade1_5.php now requires to be run --update option to prevent confusion
+* (bug 17662) Customizable default preload/editintro for new sections in the
+ respective addsection-preload and addsection-editintro messages
+* Added maintenance script checkSyntax.php that checks for PHP syntax errors
+ and common coding mistakes
+* Updated Unicode normalization tables
+* (bug 21604) Spellcheck attribute for editsummary
+* New wgCategories JavaScript global variable for userscripts.
+* (bug 20717) Added checkboxes to hide users with bot and/or sysop group
+ membership in SpecialActiveusers
+* Allow \pagecolor and \definecolor in texvc
+* $wgTexvcBackgroundColor contains background color for texvc call
+* (bug 21574) Redirects can now have "303 See Other" HTTP status
+* EditPage refactored to allow extensions to derive new edit modes much easier.
+* (bug 21826) Subsections of Special:Version now also have anchors
+* (bug 19791) Add URL of file source as comment to thumbs (for ImageMagick)
+* (bug 21946) Sorted wikitables do not properly handle minus signs
+* (bug 18885) Red links for media files do not support shared repositories
+* Added $wgFixArabicUnicode, to convert deprecated presentation forms in
+ Arabic text to their modern equivalents, and $wgFixMalayalamUnicode, to
+ convert ZWJ-based chillu sequences in Malayalam text to their Unicode 5.1
+ equivalents.
+* (bug 22051) Returing false in SpecialContributionsBeforeMainOutput hook now
+ stops normal output
+* Send new password e-mail in users preference language
+* LanguageConverter now support nested using of manual convert syntax like
+ "-{-{}-}-"
+* Upload license preview now uses the API instead of action=ajax
+* (bug 7346) Add <guid> to RSS to avoid duplicates
+* (bug 19996) Added new hooks for Special:Search, which allow to further
+ restrict/expand it.
+* (bug 21936) When a revision has been patrolled, there's now a link back to the
+ article
+* (bug 22315) SpecialRecentChangesQuery hook now pass $query_options and checks
+ the return value
+* Separate unit test suites under t/ and tests/ were merged and moved to
+ maintenance/tests/.
+* importImages.php maintenance script can now use the original uploader and
+comment from another wiki.
+* Support for Turck MMCache was removed
+* (bug 14592) Warn users when they try to move their user page that their
+ account will not be renamed
+* Show block log on non-existing user (talk) pages of currently blocked users
+
+=== Bug fixes in 1.16 ===
+
+* (bug 18031) Make namespace selector on Special:Export remember the previous
+ selection
+* The svn-version version numbers on Special:Version have been removed
+* (bug 17374) Special:Export no longer exports two copies of the same page
+* (bug 18190) Proper parsing in MediaWiki:Sharedupload message
+* (bug 17617) HTML cleanup for ImagePage
+* (bug 17964) namespaceDupes.php no longer fails on an empty interwiki table
+* Improved error handling for image moving
+* (bug 17974) On Special:SpecialPages, restricted special pages are now marked
+ with <strong> tags, helps with text-based browsers
+* (bug 18259) Special:DeletedContributions now also uses
+ MediaWiki:Sp-contributions-logs for the link to Special:Log
+* Don't add empty title="" attributes to links to anchors on the current page
+* (bug 18291) rebuildrecentchanges.php failed to add deletion log entries
+* (bug 18304) rebuildrecentchanges.php got size changes wrong
* (bug 18170) Fixed a PHP warning in Parser::preSaveTransform() in PHP 5.3
+* (bug 18289) Database connection error page now returns correct HTML
+* "successbox", "errorbox" and related CSS classes are now available in all
+ skins
+* (bug 18316) Removed superfluous name="fulltext" from Special:Search
+* (bug 18331) MediaWiki:Undelete-revision can now have wikitext
+* The "noautoblock" flag is no longer displayed in the block log when blocking
+ an IP address
+* (bug 18009) $wgHooks and $wgExtensionFunctions now support closures
+* (bug 17948) Maintenance scripts now exit(0) or exit(1) as appropriate
+* (bug 18377) Time in Enhanced ChangesList lacking localisation
+* (bug 12998) Allow <sup>, <sub>, etc. in DISPLAYTITLE
+* (bug 1553) Lowercase navigation headings in German
+* (bug 7830) Pending transactions failed to commit on loginToUse() error
+* (bug 11613) session.save_handler being over-ridden
+* (bug 11381) session.save_handler being set twice (causes error)
+* (bug 17835) ForeignAPIRepo throwing error on first page load for file
+* (bug 18115) ForeignAPIRepo cache isn't working
+* Fixed a bug caused by LanguageConverter.php, which brings an abnormal '}-'
+ after some parsed math syntax.
+* (bug 18441) rebuildrecentchanges.inc no longer ignores $wgLogRestrictions
+* (bug 18317) Bolded selections in 1 | 3 | etc days on RecentChanges now use
+ <strong> instead of hardcoded styles
+* (bug 18449) Fixed items number per column on category pages when the total is
+ divisible by 3
+* (bug 18121) maintenance/deleteArchivedRevisions.php no longer deletes
+ revisions when --delete is not passed
+* (bug 13172) GPS coordinates in image Exif data are now actually displayed
+* Overhaul of preferences system, includes the following bug fixes:
+** (bug 5363) Changes to default preferences now impact registered users.
+** (bug 14806) Hook to enable putting preferences in existing tabs.
+** (bug 17191) Registration date now listed on preferences page.
+** The user_properties table (now used for storing preferences) has been added
+ to $wgSharedTables.
+** Note that this change will break some extensions which have not been adapted
+ for it.
+* (bug 17020) Adding fallback encodings for Traditional and Simplified Chinese
+ languages while the the text is typed as URLs.
+* (bug 17614) Prev / Next links are not shown if all results are shown
+* (bug 18207) Strange spacing before [[irc:...]] links
+* Removed float from the user login form in RTL interface - caused display
+ problems in FF2
+* (bug 15008) Redirect images are now subject to Bad image list rules
+* (bug 6802) profileinfo.php now also work on other database servers than MySQL
+* (bug 16925) Diffs no longer fail when $wgExternalDiffEngine is set to
+ 'wikidiff' or 'wikidiff2' but extension is not installed
+* (bug 18326) Chmod errors in file repos have been hidden
+* (bug 18718) Comma after a } create a error in IE
+* (bug 18716) Removed redundant class in Modern skin CSS for category links and
+ tweaked spacing.
+* (bug 18656) Use proper directory separators in wfMkdirParents()
+* (bug 18549) Make Special:Blockip respect $wgEnableUserEmail and
+ $wgSysopEmailBans
+* (bug 16912) Tooltips on images with link= disappear
+* (bug 18389) Localise numbers in EXIF data
+* (bug 18522) Wrap MediaWiki:Protect-cascadeon in a div for identification
+* (bug 18438) Tweak HTML for preview bar for consistency and accessibility
+* (bug 18432) Updated documentation for dumpBackup.php
+* Fix array logic in Sanitizer::removeHTMLtags so that it doesn't strip good
+ tags that were redundantly defined.
+* (bug 14118) SpecialPage::getTitleFor does not return a localised name
+* (bug 18698) Renaming non entry point maintenance scripts from .inc.php to
+ .inc
+* Deprecated methods Title::getInterwikiLink, Title::userCanCreate(),
+ Title::userCanEdit() and Title::userCanMove() have been removed
+* Only show upload links on file description if $wgEnableUploads = true
+ and user can upload
+* Don't say "You need to log in to upload/move", because it's possible that
+ uploading/moving is disabled for registered users as well (e.g. only sysops)
+* (bug 18943) Handle invalid titles gracefully at Special:Mostlinked
* (bug 8873) Enable variant conversion in text on 'alt' and 'title' attributes
+* (bug 10837) Introducing the StubUserVariant class to determine the variant
+ variable instead of using this to overrules the user language preference.
+* (bug 19014) If user had deletedhistory right, but not undeleted right, then
+ show "view" instead of "view/restore" on logs.
+* (bug 19017) TOC level calculation error in an odd case
+* (bug 18999) CSS update for RTL interwiki links
+* (bug 18925) history.js removes class names of list elements on initialization
+* Multiple whitespace in TOC anchors is now stripped, for consistency with the
+ link from the edit comment
+* (bug 19112) Preferences now respects $wgUseExternalEditor
+* (bug 18173) MediaWiki now fails when unable to determine a client IP
+* (bug 19170) Special:Version should follow the content language direction
+* (bug 19160) maintenance/purgeOldText.inc is now compatible with PostgreSQL
+* Fixed performance regression in "bad image list" feature
+* Show user preference 'Use live preview' if $wgLivePreview is enabled only
+* (bug 17014) Blocked users can no longer use Special:UserRights unless they
+ can add/remove *all* groups (have 'userrights' permission).
+* (bug 19294) Always show Sp-contributions-footer(-anon)
+* Attempts to restrict reading of pages while anonymous viewing is allowed
+ via extensions not using the userCan hook and via $wgRevokePermissions now
+ work.
+* (bug 8445) Multiple-character search terms are now handled properly for
+ Chinese
+* (bug 19450) Use formatNum for "Number of edits" in Special:Preferences
+* (bug 11242) Check for MySQL storage engines during installation now checks
+ whether the engines are actually available
+* (bug 19390) Omit the "printable version" link on the printable version
+* (bug 18394) img_auth.php now respects userCan
+* (bug 19509) Uploading to a file named '0' previously treated it as null input
+ and attempted to upload with the source name. Now warns about not having an
+ extension (since 0.ext is perfectly valid)
+* (bug 19468) Enotif preferences are now only displayed when they are turned on
+* (bug 19442) Show/hide options on watchlist only work once
+* (bug 19602) PubMed Magic links now use updated NIH url
+* (bug 19637) externallinks have links to self
+* Don't load Opera 9.5 RTL fixes for Opera 9.6
+* Remove five-year-old KHTMLFixes.css, which is unlikely to be relevant anymore
+ and was causing problems.
+* Removed repetition of URIs in the title attributes of external links.
+* (bug 19693) User name is now escaped in "Contributions for ..." link on
+ Special:BlockIP
+* (bug 19571) Override buildConcat for SQLite.
+* Log in and log out links no longer return to page view when clicked from
+ history view, edit page, or something similar
+* (bug 19513) RTL fixes for new Search UI
+* (bug 16497) Special:Allmessages is paginated
+* (bug 18708) CSS plainlinks class now available to all skins
+* (bug 19590) Database error messages no longer have "MySQL" hardcoded as the
+ database type
+* (bug 19759) successbox on Special:Preferences now correctly aligned on
+ standard, nostalgia and cologneblue skin
+* (bug 19814) interwiki links from file links ([[File:Foo.jpg|link=de:Test]])
+ are no longer recorded in the pagelinks table
+* (bug 19784) date option "ISO 8601" produced illegal id
+* (bug 19761) Removed autogenerated <meta keywords> tag with link data.
+ Keyword set was not useful, and is ignored by modern search engines anway.
+* (bug 19827) Special:SpecialPages title is "Upload file
+* (bug 19355) Added .xhtml, .xht to upload file extension blacklist
+* (bug 19287) Workaround for lag on history page in Firefox 3.5
+* (bug 19564) Updated docs/hooks.txt
+* (bug 18751) Fix for buggage in profiling setup for some extensions on PHP 5.1
+* (bug 17139) ts_resortTable inconsistent trimming makes date sorting fragile
+* (bug 19445) Change oldimage table to use ON UPDATE CASCADE for FK to image
+ table.
+* (bug 14080) Short notation links to subpages didn't work in edit summaries
+* (bug 17374) Special:Export no longer exports multiple copies of pages
+* (bug 19818) Edits to user CSS/JS subpages can now be marked as patrolled by
+ users who can't edit them
+* (bug 19839) Comments in log items are no more double escaped
+* (bug 18161) Fix inconsistent separators in watchlist link toolbars with
+ "enhanced recent changes"
+* (bug 16877) Moving a page over a redirect no longer leaves an orphan entry in
+ the recentchanges table
+* (bug 16009) Limit selection forms based on Pager now links to the correct page
+ when using long urls
+* The display of the language list on the preferences is more comply with the
+ BCP 47 standards.
+* (bug 19849) Custom X-Vary-Options header now disabled unless $wgUseXVO is set
+* (bug 19301) Duplicates entries in $wgAddGroups, $wgRemoveGroups,
+ $wgGroupsAddToSelf and $wgGroupsRemoveFromSelf are no more displayed on
+ Special:ListGroupRights
+* (bug 18799) Special:Userlogin now handles correctly the returnto parameter
+ to not link back to Special:Userlogout when user's language isn't the same as
+ content's language
+* (bug 19479) Show proper error message when unable to connect to PostgreSQL
+ database with username/password in MediaWiki's setup
+* (bugs 18407, 18409) Special:Upload is now listed on Special:Specialpages only
+ if uploads are enabled and the user can access it
+* (bug 17988) Spaces before [[Category:]] links are no longer ignored
+* (bug 19957) All known-failing tests now marked disabled; added --run-disabled
+ option to parser test suite to run disabled tests if desired.
+* (bug 16311) Make recent change flags (n/m/b) <abbr>s instead of <span>s
+* (bug 15680) Split the edit tip message of user CSS/JS subpage into
+ "usercssyoucanpreview" and "userjsyoucanpreview" respectively.
+* (bug 12110) Split the rights for editing users' CSS/JS subpage from
+ "editusercssjs" into "editusercss" and edituserjs" respectively.
+* (bug 19394) RecentChanges feed URLs for log items with no revisions
+ (eg Newuser, Userrights) are no longer broken
+* (bug 17395) Remote file descriptions use user language ($wgLang), not wiki
+ language ($wgContLang)
+* (bug 11867) Lock error on redirect table when running orphans.php
+* (bug 18930) initStats.php now refreshes active users count
+* (bug 18699) Using the nosummary URL option no longer triggers the "You have
+ not provided a summary" warning for those who activated it in their
+ preferences
+* (bug 18855) commandLine.inc and Maintenance.php are now properly included
+ using the full path
+* (bug 18497) Fixed broken style sheets in Opera fullscreen mode
+* (bug 16084) Default memory limit has be increased to 50M, see $wgMemoryLimit
+* (bug 17864/19519) Added proper input normalization in Special:UserRights
+* (bug 20086) Add Hook to add extra statistics at the end of Special:Statistics
+* (bug 19289) importDump.php can now handle bzip2 and 7zip
+* (bug 20131) Fixed a PHP notice for users having the "rollback" right on
+ Special:RecentChangesLinked
+* Do not transform EXIF fields with pure text to avoid results like
+ foo,bar@example,com
+* (bug 20176) Fix login/logout links in skin CologneBlue
+* (bug 20203) "Powered by Mediawiki" now has height/width on image tag
+* (bug 20273) Fix broken output when no pages are found in the content
+ namespaces
+* (bug 20265) Make AncientPages and UnusedFiles work on SQLite
+* Fixed XSS vulnerability for Internet Explorer clients (only pre-release
+ versions of MediaWiki were affected).
+* (bug 14817) Moving a page to a subpage of itself moves it twice
+* (bug 20289) $wgMaximumMovedPages should only count pages actually moved
+* (bug 15248) Non-breaking spaces and certain other Unicode space characters
+ are now normalized to ordinary spaces in titles; if your wiki has existing
+ titles with such characters, run cleanupTitles.php and/or cleanupImages.php
+* (bug 11143) Links containing invalid UTF-8 percent-code sequences are now
+ cleanly disabled instead of breaking parsing entirely on PHP 5.2.
+* (bug 20296) Fixed an PHP warning in Language::getMagic() in PHP 5.3
+* (bug 20358) Unprotect tab was missing accesskey; now same as protect tab.
+* (bug 20317) Cleaned up default main page link accesskey settings
+* (bug 20362) Special:Statistics now produces valid HTML when view counters are
+ enabled
+* (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks
+ target page
+* (bug 20365) Page name with with c/g/h/j/s/u + x are now correctly handled in
+ Special:MovePage with Esperanto as content language
+* (bug 20364) Fixed regression in GIF metadata loading
+* (bug 20299) MediaWiki:Move-subpages and MediaWiki:Move-talk-subpages can now
+ use wikitext
+* (bug 15475) DatabaseBase::setFlag(), DatabaseBase::clearFlag() and
+ DatabaseBase::getFlag() now have documentation
+* (bug 19966) MediaWiki:License-header is now used for the licensing header in
+ the file description page instead of MediaWiki:License
+* (bug 20380) Links to history/deleted edits at the top of
+ Special:RevisionDelete are no more displayed when when doing log suppression
+* (bug 8143) Localised parser function names are now correctly case insensitive
+ if they contain non-ASCII characters
+* (bug 19055) maintenance/rebuildrecentchanges.php now purges
+ Special:Recentchanges's RSS and Atom feed cache
+* The installer will now try to bypass PHP's max_execution_time
+* (bug 20260) SQLite no longer tries to automatically create the database at
+ execution time, this now happens only at install time; if it is not available
+ at script execution, it now throws an exception
+* Fixed EditFilterMerged hook so the hookError parameter serves a purpose
+ (analogous to EditFilter hook)
+* (bug 2257) Tag extensions can expand template parameters provided to the tag,
+ by using a new parameter added to the recursiveTagParse function
+* (bug 14900) __INDEX__ and __NOINDEX__ no longer override site config set in
+ $wgArticleRobotPolicies.
+* (bug 20466) Hidden categories are no more displayed when printing
+* (bug 20446) When changing user rights with User@remotewiki and remotewiki is
+ the local wiki, the user is now treated as the local user
+* (bug 20494) OutputPage::getArticleBodyOnly() no longer requires an useless
+ argument
+* (bug 20136) Protection form JavaScript now synchronizes the expiry boxes on
+ any change, in addition to onkeyup.
+* Don't link to "edit this page" on MediaWiki:Noarticletext if user is not
+ allowed to create page. Done via new message
+ MediaWiki:Noarticletext-nopermission
+* Improved compatibility between the Vector skin and addPortletLink() from
+ wikibits.js: empty portlets are now present but hidden, adding an element to a
+ portlet unhides it
+* (bug 19531) addPortletLink() now wraps inserted labels in a <span> element to
+ be compatible with the CSS for the Vector skin
+* (bug 20578) Wrong localized image metadata - duplicated string?
+* (bug 20556) Stub threshold's "other" <input> in Special:Preferences now has a
+ correct type="text" parameter
+* (bug 482) Don't include TOC in the printable version if it has been hidden
+* Adjust the time according to the user configuration on Special:Revisiondelete
+* (bug 20624) Installation no longer allows "qqq" as the chosen language
+* (bug 20634) The installer-created database user will now have all rights on
+ the database so that upgrades will go more smoothly.
+* (bug 18180) Special:Export ignores limit, dir, offset parameters
+* User::getBlockedStatus() works for all kinds of user objects and doesn't
+ assume the user object is equal to the current-user object ($wgUser)
+* (bug 20517) Cancel link from edit page now returns to the old version when
+ editing an old version
+* (bug 16902) Installer no longer shows warnings when exec() has been disabled
+ by disable_functions
+* (bug 20726) Title::getLatestRevID's documentation now says that the function
+ returns false if the page doesn't exist
+* (bug 20751) ForeignApiRepo now urldecodes filenames when saving to local cache
+* (bug 20730) Fix to Special:Version ViewVC link for branch checkouts
+* (bug 20353) wfShellExec() was adding extra quotes on Windows Vista, causing
+ command line scripts to fail
+* (bug 20702) Parser functions can now be used correctly in
+ MediaWiki:Missing-article
+* (bug 14117) "redirected from" is now also shown on foreign file redirects
+* (bug 17747) Only display thumbnail column in file history if the image can
+ be rendered.
+* (bug 3421) Live preview no longer breaks user CSS/JS previews
+* (bug 11264) The file logo on a file description page for documents (PDF, ...)
+ now links to the file rather than the file description page
+* Password fields built with HTMLForm now still have the type="password"
+ attribute if $wgHtml5=false.
+* (bug 20836) Preload now works for MediaWiki namespace
+* (bug 20885) Search box no longer suggests unavailable special pages
+* (bug 20948) "Create this page" on Special:Search is no longer displayed when
+ searching for special pages
+* (bug 20524) Hideuser: Show nice error when trying to block hidden user without
+ hideuser right
+* (bug 21026) Fixed file redirects on shared repos on non-English client wikis
+* (bug 21030) Fixed schema choices from being overwritten by defining unique
+ field names per driver.
+* (bug 21115) wgCanonicalSpecialPageName javascript variable is now always
+ false on non-special pages
+* (bug 21113) "Other statistics" header on Special:Statistics is no more
+ displayed when there isn't any entry in it
+* (bug 21114) Special:Contributions no longer shows diff links for new
+ revisions
+* (bug 21116) MediaWiki:Templatesused, MediaWiki:Templatesusedpreview and
+ MediaWiki:Templatesusedsection now support plural
+* (bug 21079) There is no more line wrapping between label and field in
+ Special:Log
+* (bug 20256) Fixed SQL errors on Special:Recentchanges and
+ Special:Recentchangeslinked on SQLite backend
+* (bug 20880) Fixed updater failure on SQLite backend
+* (bug 21182) Fixed invalid HTML in Special:Listgrouprights
+* (bug 20242) Installer no longer promts for user credentials for SQLite
+ databases
+* (bug 20911) Installer failed to create a SQLite database
+* (bug 20847) Deprecated deprecated akeytt() removed in wikibits.js leaving
+ dummy
+* (bug 21161) Changing $wgCacheEpoch now always invalidates file cache
+* (bug 20268) Fixed row count estimation on SQLite backend
+* (bug 20275) Fixed LIKE queries on SQLite backend
+* (bug 21234) Moving subpages of titles containing \\ now works properly
+* (bug 21006) maintenance/updateArticleCount.php now works again on PostgreSQL
+* (bug 19319) Add activeusers-intro message at top of SpecialActiveUsers page
+* (bug 21255) Fixed hostname construction for DNSBL checking
+* (bug 18019) Users are now warned when moving a file to a name in use on a
+ shared repository and only users with the 'reupload-shared' permission can
+ complete the move.
+* (bug 18909) Add missing Postgres INSERT SELECT wrapper
+* User::isValidPassword now only returns boolean results,
+ User::getPasswordValidity can be used to get an error message string
+* The error message shown in Special:ChangePassword now parses wiki markup
+* (bug 19859) Removed experimental HTMLDiff feature
+* Removed section edit links in edit conflict form
+* Allow SpecialActiveusers to work on non-MySQL databases
+* (bug 6579) Fixed protecting images from uploading only
+* (bug 18609) Search index was empty for some pages
+* (bug 13453) rebuildrecentchanges maintenance script works on PG again
+* (bug 16583) Reduce false positives when checking for PHP (on upload, etc.)
+* (bug 20112) Bitrotted tests in the t/ directory were failing.
+* (bug 21470) MediaWiki:Sp-contributions-explain is now wrapped in a <p> with
+ id "mw-sp-contributions-explain"
+* (bug 19159) Fixed \overleftrightarrow in texvc
+* (bug 19391) Fix caching for Recent ChangesFeed.
+* (bug 21455) Fixed "Watch this page" checkbox appearing on some special pages
+ even to non-logged in users
+* (bug 21551) Rewrote the Squid purge HTTP client to provide a more robust and
+ general implementation of HTTP, allowing it to purge non-Squid caches such as
+ Varnish.
+* Fixed corruption of long UDP debug log messages by using socket_sendto()
+ instead of fsockopen() with fwrite().
+* (bug 16884) Fixed feed links in sidebar not complying with URL parameters
+ of the displayed page
+* (bug 21403) memcached class renamed to MWMemecached to avoid conflict with
+ PHP's memcached extension
+* (bug 21650) Both calls to SkinTemplateTabs hook are now compatible
+* (bug 21672) Add missing Accept-Language to both Vary and XVO headers
+* (bug 21679) "Edit block reasons" link at the bottom of Special:Blockip is now
+ only displayed to the users that have "editinterface" right
+* (bug 21740) Attempting to protect a page that doesn't exist (salting) returns
+ "unknown error"
+* (bug 18762) both redirects and links get fixed one after another if
+ redirects-only switch is not present
+* (bug 20159) thumbnails rerendered if older that $wgThumbnailEpoch
+* Fixed a bug which in some situations causes the job queue to grow forever,
+ due to an infinite loop of job requeues.
+* (bug 21523) File that can have multiple pages (djvu, pdf, ...) no longer have
+ the page selector when they have only one page
+* (bug 21559) "logempty" message is now wrapped in a div with class
+ "mw-warning-logempty" when used in log extract
+* (bug 20549) Parser tests were broken on SQLite backend
+* (bug 21776) Interwiki urls like http://en.wikibooks.org/wiki/cs: should give
+ a redirect instead of a baderror.
+* (bug 21803) Special:MyContributions now keeps the query string parameters
+* Redirecting special pages now keep query string paramters set to "0" (e.g.
+ for namespace)
+* (bug 20765) Special:ListGroupRights no longer misses addables and removables
+ groups if there are duplicate entries
+* (bug 21814) Message shown when rolling back an edit with a deleted username
+ now shows '(username deleted)' instead of broken user tool links
+* (bug 21536) Fixed JavaScript error on Special:Search caused by an incorrect ID
+* (bug 21535) RecentChanges RSS feed now always recognises the namespace filter,
+ previously it sometimes didn't due to caching.
+* (bug 20388) ProfilerSimpleText no longer outputs comment on action=raw
+* refreshLinks.php now purges orphaned redirect table rows
+* (bug 2971) Swap links of hist & diff location on Special:Contributions for
+ consistency with RC/WL
+* (bug 21986) Special page names were are now capitalized by content language
+* If two log type have the same description, they're now both displayed in the
+ type selector on Special:Log
+* (bug 20115) Special:Userlogin title says "Log in / create account" even if the
+ user can't create an account
+* (bug 2658) Don't attempt to set the TZ environment variable.
+* (bug 9794) User rights log entries for foreign user now links to the foreign
+ user's page if possible
+* (bug 14717) Don't load nonexistent CSS fix files for non-Monobook skins
+* (bug 22034) Use wfClientAcceptsGzip() in wfGzipHandler instead of
+ reimplementing it.
+* (bug 19226) First line renders differently on many UI messages.
+* (bug 21303) Comments are no longer stripped from MediaWiki:Common.js and
+ skin-specific JS pages
+* (bug 5061) Use the more precise thumbcaption thumbimage and thumbinner classes
+ for image divs.
+* Fixed bug involving unclosed "-{" markup in the language converter
+* (bug 21870) No longer include Google logo from an external server on wiki error.
+* (bug 22181) Do not truncate if the ellipsis actually make the string longer
+* (bug 16039) Text disappearing after a bad image
+* (bug 18784) Internal links like [[File:Foo|caption]] should read 'caption',
+ not 'File:Foo' when Foo is not an image
+* (bug 21518) Special:UserRights no longer displays the user name box for users
+ that can only change their rights
+* (bug 21593) Special:UserRights now lists automatic groups membership
+* (bug 22364) Setting $wgUseExternalEditor to false no longer hides the reupload
+ link from file pages
+* Fix bug introduced in MediaWiki 1.12: The author field in
+ $wgExtensionCredits is no longer sorted with sort() but rather used
+ as it appears in extensions as was the case before r30117 where it
+ was unintentionally sorted along with other fields.
+* (bug 19334) Textarea no longer jumps when editing longer articles in IE8
+* Truncate summary of page moves in revision comment field to avoid broken
+ multibyte characters
+* (bug 22540) ForeignApiRepos no longer try to store thumbnails that don't exist
+* (bug 22551) Special:Resetpass now has a "Cancel" button that sends the user to
+ the page set in the &returnto parameter.
+* (bug 19194) Search box in Modern skin doesn't focus with Safari/Chrome
+* (bug 17790) Users instantly logged off on HughesNet
+
+== API changes in 1.16 ==
-== API changes in 1.15 ==
-
-* (bug 16858) Revamped list=deletedrevs to make listing deleted contributions
- and listing all deleted pages possible
-* (bug 16844) Added clcategories parameter to prop=categories
-* (bug 17025) Add "fileextension" parameter to meta=siteinfo&siprop=
-* (bug 17048) Show the 'new' flag in list=usercontribs for the revision that
- created the page, even if it's not the top revision
-* (bug 17069) Added ucshow=patrolled|!patrolled to list=usercontribs
-* action=delete respects $wgDeleteRevisionsLimit and the bigdelete user right
-* (bug 15949) Add undo functionality to action=edit
-* (bug 16483) Kill filesort in ApiQueryBacklinks caused by missing parentheses.
- Building query properly now using makeList()
-* (bug 17182) Fix pretty printer so URLs with parentheses in them are
- autolinked correctly
-* (bug 17224) Added siprop=rightsinfo to meta=siteinfo
-* (bug 17239) Added prop=displaytitle to action=parse
-* (bug 17317) Added watch parameter to action=protect
-* (bug 17007) Added export and exportnowrap parameters to action=query
-* (bug 17326) BREAKING CHANGE: Changed output format for iiprop=metadata
-* (bug 17355) Added auwitheditsonly parameter to list=allusers
-* (bug 17007) Added action=import
-* BREAKING CHANGE: Removed rctitles parameter from list=recentchanges because
- of performance concerns
-* Listing (semi-)deleted revisions and log entries as well in prop=revisions
- and list=logevents
-* (bug 11430) BREAKING CHANGE: Modules may return fewer results than the
- limit and still set a query-continue in some cases
-* (bug 17357) Added movesubpages parameter to action=move
-* (bug 17433) Added bot flag to list=watchlist&wlprop=flags output
-* (bug 16740) Added list=protectedtitles
-* Added mainmodule and pagesetmodule parameters to action=paraminfo
-* (bug 17502) meta=siteinfo&siprop=namespacealiases no longer lists namespace
- aliases already listed in siprop=namespaces
-* (bug 17529) rvend ignored when rvstartid is specified
-* (bug 17626) Added uiprop=email to list=userinfo
-* (bug 13209) Added rvdiffto parameter to prop=revisions
-* Manual language conversion improve: Now we can include both ";" and ":" in
- conversion rules
-* (bug 17795) Don't report views count on meta=siteinfo if $wgDisableCounters
- is set
-* (bug 17774) Don't hide read-restricted modules like action=query from users
- without read rights, but throw an error when they try to use them.
-* Don't hide write modules when $wgEnableWriteAPI is false, but throw an error
- when someone tries to use them
-* BREAKING CHANGE: action=purge requires write rights and, for anonymous users,
- a POST request
-* (bug 18099) Using appendtext to edit a non-existent page causes an interface
- message to be included in the page text
-* (bug 18601) generator=backlinks returns invalid continue parameter
-* (bug 18597) Internal error with empty generator= parameter
-* (bug 18617) Add xml:space="preserve" attribute to relevant tags in XML output
-
-=== Languages updated in 1.15 ===
-
-MediaWiki supports over 300 languages. Many localisations are updated
+* Added uiprop=changeablegroups to meta=userinfo
+* Added usprop=gender to list=users
+* (bug 18311) action=purge now works for images too
+* Add parentid to prop=revisions output
+* (bug 17832) action=delete returns 'unknownerror' instead of 'permissiondenied'
+ when the user is blocked
+* (bug 18546) Added timestamp of new revision to action=edit output
+* (bug 18554) Also list hidden revisions in list=usercontribs for privileged
+ users
+* (bug 13049) "API must be accessed from the primary script entry point" error
+* (bug 16422) Don't display help for format=jsonfm unless specifically requested
+* Added PHP and database version to meta=siteinfo output
+* (bug 18533) Add readonly message to meta=siteinfo output
+* (bug 18518) Add clprop=hidden to prop=categories
+* (bug 18710) Fixed internal error with empty parameter in action=paraminfo
+* (bug 18709) Missing descriptions for some parameters in action=paraminfo
+ output
+* (bug 18731) Show correct SVN links for extension modules in api.php?version
+* (bug 18730) Add version information to action=paraminfo output
+* (bug 18743) Add ucprop=size to list=usercontribs
+* (bug 18749) Add generator flag to action=paraminfo output
+* Make action=block respect $wgEnableUserEmail and $wgSysopEmailBans
+* Made deleting file description pages without files possible
+* (bug 18773) Add content flag to siprop=namespaces output
+* (bug 18785) Add siprop=languages to meta=siteinfo
+* (bug 14200) Added user and excludeuser parameters to list=watchlist and
+ list=recentchanges
+* Added index, fromtitle and byteoffset fields to action=parse&prop=sections
+ output
+* (bug 19313) action=rollback returns wrong revid on master/slave setups
+* (bug 19323) action=parse doesn't return section tree on pages with Cite
+ warnings
+* (bug 18720) Add anchor field to action=parse&prop=sections output
+* (bug 19423) The initial file description page used caption in user lang
+ rather than UI lang
+* (bug 17809) Add number of users in user groups to meta=siteinfo
+* (bug 18533) Add readonly reason to readonly exception
+* (bug 19528) Added XSLT parameter to API queries in format=xml
+* (bug 19040) Fix prependtext and appendtext in combination with section
+ parameter in action=edit
+* (bug 19090) Added watchlist parameter, deprecated watch and unwatch
+ parameter in action=edit
+* Added fields to list=search output: size, wordcount, timestamp, snippet
+* Where supported by backend, list=search adds a 'searchinfo' element with
+ optional info: 'totalhits' count and 'suggestion' alternate query term
+* (bug 19907) $wgCrossSiteAJAXdomains added to allow specified (or all)
+ external domains to access api.php via AJAX, if the browser supports the
+ Access-Control-Allow-Origin HTTP header
+* (bug 19999) Made metadata and properties of search results optional. Added
+ srprop and srinfo.
+* (bug 20700) Add amprop=default to meta=allmessages to list default value for
+ customized messages
+* Don't parse magic words in meta=allmessages, output messages unparsed
+* (bug 21105) list=usercontribs can now list contribs for User:0
+* (bug 21085) list=deletedrevs no longer returns only one revision when
+ drcontinue param is passed
+* (bug 21106) Deprecated parameters now tagged in action=paraminfo
+* (bug 19004) Added support for tags
+* (bug 21083) list=allusers no longer returns current timestamp for users
+ without registration date
+* (bug 20967) action=edit allows creation of invalid titles
+* (bug 19523) Add inprop=watched to prop=info
+* (bug 21589) API: Separate summary and initial page text for uploads
+* (bug 21817) list=usercontribs returns empty result for empty ucuser
+* (bug 21441) meta=userinfo&uiprop=options no longer returns default options
+ for logged-in users under certain circumstances
+* (bug 21945) Add chomp control in YAML
+* Expand the thumburl to an absolute url to make it consistent with url and
+ descriptionurl
+* (bug 20233) ApiLogin::execute() doesn't handle LoginForm :: RESET_PASS
+* (bug 22061) API: add prop=headitems to action=parse
+* (bug 22240) API: include time in siteinfo
+* (bug 22241) Quick edit is still using the deprecated watch parameter (API: Setting default for watch/unwatch wrongly set)
+* (bug 22245) blfilterredirect=nonredirects in blredirect mode wrongly filtering
+* (bug 22248) Output extension URLs in meta=siteinfo&siprop=extensions
+* Support key-params arrays in 'descriptionmsg' in meta=siteinfo&siprop=extensions
+* (bug 21922) YAML output should quote asterisk when used as key
+* (bug 22297) safesubst: to allow substitution without breaking transclusion
+* (bug 18758) API read of watchlist's wl_notificationtimestamp
+* (bug 20809) Expose EditFormPreloadText via the API
+* (bug 18427) Comment (edit summary) parser option for API
+* (bug 18608) API should provide list of CSS styles to apply to rendered output
+* (bug 18771) List possible errors in action=paraminfo
+
+=== Languages updated in 1.16 ===
+
+MediaWiki supports over 330 languages. Many localisations are updated
regularly. Below only new and removed languages are listed, as well as
changes to languages because of MediaZilla reports.
-* Austrian German (de-at) (new)
-* Swiss Standard German (de-ch) (new)
-* Simplified Gan Chinese (gan-hans) (new)
-* Traditional Gan Chinese (gan-hant) (new)
-* Literary Chinese (lzh) (new)
-* Uyghur (Latin script) (ug-latn) (renamed from 'ug')
-* Veps (vep) (new)
-* Võro (vro) (renamed from fiu-vro)
-* (bug 17151) Add magic word alias for #redirect for Vietnamese
-* (bug 17288) Messages improved for default language (English)
-* (bug 12937) Update native name for Afar
-* (bug 16909) 'histlegend' now reuses messages instead of copying them
-* (bug 17832) action=delete returns 'unknownerror' instead of 'permissiondenied'
- when the user is blocked
-* Traditional/Simplified Gan Chinese conversion support
+* Capiznon (cps) (new)
+* North Frisian (frr) (new)
+* Kirmanjki (kiu) (new)
+* Komi-Permyak (koi) (new)
+* Karachay-Balkar (krc) (new)
+* Latgalian (ltg) (new)
+* Hill Mari (mrj) (new)
+* Prussian (prg) (new)
+* Romagnol (rgn) (new)
+* Rusyn (rue) (new)
+* Lower Silesian (sli) (new)
+* Picard (pcd) (new)
+* Uyghur (Arabic script) (ug-arab) (new)
+* Upper Franconian (vmf) (new)
+* Votic (vot) (new)
+* Eastern Yiddish (ydd) (removed)
+* Iriga Bicolano (bto) (removed)
+* Ladin (lld) (removed)
+* Palembang (plm) (removed)
+* Megleno-Romanian (Greek script) (ruq-grek) (removed)
+* Tamazight (tzm) (removed)
-== Compatibility ==
+* (bug 18474) Sorani (ckb - Central Kurdish) (renamed from ku-arab)
+* Add PLURAL function for Scots Gaelic (gd)
+* Add Estonian letters äöõšüž to linktrail (et)
+* (bug 18776) Native name of Burmese language (my)
+* (bug 18806) Use correct unicode characters in spelling of native Chuvash
+ (Чӑвашла)
+* (bug 18864) Updated autonym for Zhuang language
+* (bug 18308) Updated date formatting in Occitan (oc)
+* (bug 19080) Added ăâîşţșțĂÂÎŞŢȘȚ to Romanion (ro) linktrail
+* (bug 19286) Correct commafying function in Polish (pl)
+* (bug 19441) Updated date formatting for Lithuanian
+* (bug 19630) Added ÄäÇçĞğŇňÖöŞşÜüÝýŽž to Turkmen (tk) linktrail
+* (bug 19949) New linktrail for Greek (el)
+* (bug 19809) Korean (North Korea) (ko-kp) (new)
+* (bug 19968) Fixed "Project talk" namespace name for Maltese (mt)
+* (bug 21168) Added áâãàéêçíóôõúü to Portuguese (pt) linktrail
+* (bug 21596) Change interwiki link for Kurdish (ku)
-MediaWiki 1.15 requires PHP 5 (5.2 recommended). PHP 4 is no longer supported.
+== Compatibility ==
-PHP 5.0.x fails on 64-bit systems due to serious bugs with array processing:
-http://bugs.php.net/bug.php?id=34879
-Upgrade affected systems to PHP 5.1 or higher.
+MediaWiki 1.16 requires PHP 5.1 (5.2 recommended). PHP 4 is no longer supported.
MySQL 3.23.x is no longer supported; some older hosts may need to upgrade.
At this time we still recommend 4.0, but 4.1/5.0 will work fine in most cases.
@@ -463,7 +997,7 @@ At this time we still recommend 4.0, but 4.1/5.0 will work fine in most cases.
== Upgrading ==
-1.15 has several database changes since 1.14, and will not work without schema
+1.16 has several database changes since 1.15, and will not work without schema
updates.
If upgrading from before 1.11, and you are using a wiki as a commons reposito-
@@ -488,7 +1022,7 @@ set $wgMimeType = "application/xhtml+xml"; to test for remaining problem
cases, but this is not recommended on live sites. (This must be set for
MathML to display properly in Mozilla.)
-For notes on 1.14.x and older releases, see HISTORY.
+For notes on 1.15.x and older releases, see HISTORY.
=== Online documentation ===
diff --git a/StartProfiler.php b/StartProfiler.sample
index 3fcf69e6..f91aeb92 100644
--- a/StartProfiler.php
+++ b/StartProfiler.sample
@@ -3,7 +3,8 @@
require_once( dirname(__FILE__).'/includes/ProfilerStub.php' );
/**
- * To use a profiler, delete the line above and add something like this:
+ * To use a profiler, copy this file to StartProfiler.php,
+ * delete the PHP line above, and add something like this:
*
* require_once( dirname(__FILE__).'/includes/Profiler.php' );
* $wgProfiler = new Profiler;
diff --git a/UPGRADE b/UPGRADE
index 9d0e0521..7cd302e9 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -42,8 +42,7 @@ You can also obtain the new files directly from our Subversion source code
repository, via a checkout or export operation.
Replace the existing MediaWiki files with the new. You should preserve the
-LocalSettings.php file, AdminSettings.php file (if present), and the
-"extensions" and "images" directories.
+LocalSettings.php file and the "extensions" and "images" directories.
Depending upon your configuration, you may also need to preserve additional
directories, including a custom upload directory ($wgUploadDirectory),
@@ -51,8 +50,8 @@ deleted file archives, and any custom skins.
=== Perform the database upgrade ===
-You will need an AdminSettings.php file set up in the correct format; see
-AdminSettings.sample in the wiki root for more information and examples.
+You will need to have $wgDBadminuser and $wgDBadminpassword set in your
+LocalSettings.php, see there for more info.
From the command line, browse to the "maintenance" directory and run the
update.php script to check and update the schema. This will insert missing
@@ -69,8 +68,8 @@ behaviour of MediaWiki.
=== Check installed extensions ===
In MediaWiki 1.14 some extensions are migrated into the core. Please see the
-RELEASE-NOTES section "Migrated extensions" and disable these extensions in your
-localSettings.php
+HISTORY section "Migrated extensions" and disable these extensions in your
+LocalSettings.php
=== Test ===
@@ -172,10 +171,10 @@ should be replaced with:
=== Web installer ===
You can use the web-based installer wizard if you first remove the
-LocalSettings.php (and AdminSettings.php, if any) files; be sure to
-give the installer the same information as you did on the original
-install (language/encoding, database name, password, etc). This will
-also generate a fresh LocalSettings.php, which you may need to customize.
+LocalSettings.php file; be sure to give the installer the same
+information as you did on the original install (language/encoding,
+database name, password, etc). This will also generate a fresh
+LocalSettings.php, which you may need to customize.
You may change some settings during the install, but be very careful!
Changing the encoding in particular will generally leave you with a
@@ -185,8 +184,8 @@ lot of corrupt pages, particularly if your wiki is not in English.
Additionally, as of 1.4.0 you can run an in-place upgrade script from
the command line, keeping your existing LocalSettings.php. This requires
-that you create an AdminSettings.php giving an appropriate database user
-and password with privileges to modify the database structure.
+that you set $wgDBadminuser and $wgDBadminpassword with an appropriate
+database user and password with privileges to modify the database structure.
Once the new files are in place, go into the maintenance subdirectory and
run the script:
diff --git a/api.php b/api.php
index 58e06d88..10baa13e 100644
--- a/api.php
+++ b/api.php
@@ -23,8 +23,8 @@
* @file
*/
-/**
- * This file is the entry point for all API queries. It begins by checking
+/**
+ * This file is the entry point for all API queries. It begins by checking
* whether the API is enabled on this wiki; if not, it informs the user that
* s/he should set $wgEnableAPI to true and exits. Otherwise, it constructs
* a new ApiMain using the parameter passed to it as an argument in the URL
@@ -35,9 +35,10 @@
*/
// Initialise common code
-require (dirname(__FILE__) . '/includes/WebStart.php');
+require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
-wfProfileIn('api.php');
+wfProfileIn( 'api.php' );
+$starttime = microtime( true );
// URL safety checks
//
@@ -49,38 +50,67 @@ wfProfileIn('api.php');
// which will end up triggering HTML detection and execution, hence
// XSS injection and all that entails.
//
-// Ensure that all access is through the canonical entry point...
-//
-if( isset( $_SERVER['SCRIPT_URL'] ) ) {
- $url = $_SERVER['SCRIPT_URL'];
-} else {
- $url = $_SERVER['PHP_SELF'];
-}
-if( strcmp( "$wgScriptPath/api$wgScriptExtension", $url ) ) {
+if ( $wgRequest->isPathInfoBad() ) {
wfHttpError( 403, 'Forbidden',
- 'API must be accessed through the primary script entry point.' );
+ 'Invalid file extension found in PATH_INFO. ' .
+ 'The API must be accessed through the primary script entry point.' );
return;
}
// Verify that the API has not been disabled
-if (!$wgEnableAPI) {
+if ( !$wgEnableAPI ) {
echo 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php';
echo '<pre><b>$wgEnableAPI=true;</b></pre>';
- die(1);
+ die( 1 );
+}
+
+// Selectively allow cross-site AJAX
+
+/*
+ * Helper function to convert wildcard string into a regex
+ * '*' => '.*?'
+ * '?' => '.'
+ * @ return string
+ */
+function convertWildcard( $search ) {
+ $search = preg_quote( $search, '/' );
+ $search = str_replace(
+ array( '\*', '\?' ),
+ array( '.*?', '.' ),
+ $search
+ );
+ return "/$search/";
+}
+
+if ( $wgCrossSiteAJAXdomains && isset( $_SERVER['HTTP_ORIGIN'] ) ) {
+ $exceptions = array_map( 'convertWildcard', $wgCrossSiteAJAXdomainExceptions );
+ $regexes = array_map( 'convertWildcard', $wgCrossSiteAJAXdomains );
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $_SERVER['HTTP_ORIGIN'] ) ) {
+ foreach ( $exceptions as $exc ) { // Check against exceptions
+ if ( preg_match( $exc, $_SERVER['HTTP_ORIGIN'] ) ) {
+ break 2;
+ }
+ }
+ header( "Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}" );
+ header( 'Access-Control-Allow-Credentials: true' );
+ break;
+ }
+ }
}
// So extensions can check whether they're running in API mode
-define('MW_API', true);
+define( 'MW_API', true );
// Set a dummy $wgTitle, because $wgTitle == null breaks various things
// In a perfect world this wouldn't be necessary
-$wgTitle = Title::newFromText('API');
+$wgTitle = Title::makeTitle( NS_MAIN, 'API' );
/* Construct an ApiMain with the arguments passed via the URL. What we get back
* is some form of an ApiMain, possibly even one that produces an error message,
* but we don't care here, as that is handled by the ctor.
*/
-$processor = new ApiMain($wgRequest, $wgEnableWriteAPI);
+$processor = new ApiMain( $wgRequest, $wgEnableWriteAPI );
// Process data & print results
$processor->execute();
@@ -89,9 +119,28 @@ $processor->execute();
wfDoUpdates();
// Log what the user did, for book-keeping purposes.
-wfProfileOut('api.php');
+$endtime = microtime( true );
+wfProfileOut( 'api.php' );
wfLogProfilingData();
+// Log the request
+if ( $wgAPIRequestLog ) {
+ $items = array(
+ wfTimestamp( TS_MW ),
+ $endtime - $starttime,
+ wfGetIP(),
+ $_SERVER['HTTP_USER_AGENT']
+ );
+ $items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
+ if ( $processor->getModule()->mustBePosted() ) {
+ $items[] = "action=" . $wgRequest->getVal( 'action' );
+ } else {
+ $items[] = wfArrayToCGI( $wgRequest->getValues() );
+ }
+ wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
+ wfDebug( "Logged API request to $wgAPIRequestLog\n" );
+}
+
// Shut down the database
wfGetLBFactory()->shutdown();
diff --git a/t/.htaccess b/cache/.htaccess
index 3a428827..3a428827 100644
--- a/t/.htaccess
+++ b/cache/.htaccess
diff --git a/config/Installer.php b/config/Installer.php
new file mode 100644
index 00000000..293a1a6c
--- /dev/null
+++ b/config/Installer.php
@@ -0,0 +1,2350 @@
+<?php
+
+# MediaWiki web-based config/installation
+# Copyright (C) 2004 Brion Vibber <brion@pobox.com>, 2006 Rob Church <robchur@gmail.com>
+# http://www.mediawiki.org/
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# http://www.gnu.org/copyleft/gpl.html
+
+if( !defined( 'MEDIAWIKI_INSTALL' ) ) {
+ die( 'Not an entry point.' );
+}
+
+error_reporting( E_ALL | E_STRICT );
+header( "Content-type: text/html; charset=utf-8" );
+@ini_set( "display_errors", true );
+
+# In case of errors, let output be clean.
+$wgRequestTime = microtime( true );
+
+// Run version checks before including other files
+// so people don't see a scary parse error.
+require_once( "$IP/maintenance/install-utils.inc" );
+install_version_checks();
+
+require_once( "$IP/includes/Defines.php" );
+require_once( "$IP/includes/DefaultSettings.php" );
+require_once( "$IP/includes/AutoLoader.php" );
+require_once( "$IP/includes/MagicWord.php" );
+require_once( "$IP/includes/Namespace.php" );
+require_once( "$IP/includes/ProfilerStub.php" );
+require_once( "$IP/includes/GlobalFunctions.php" );
+require_once( "$IP/includes/Hooks.php" );
+require_once( "$IP/includes/Exception.php" );
+require_once( "$IP/includes/json/Services_JSON.php" );
+require_once( "$IP/includes/json/FormatJson.php" );
+
+# If we get an exception, the user needs to know
+# all the details
+$wgShowExceptionDetails = true;
+$wgShowSQLErrors = true;
+wfInstallExceptionHandler();
+## Databases we support:
+
+$ourdb = array();
+
+$ourdb['mysql'] = array(
+ 'fullname' => 'MySQL',
+ 'havedriver' => 0,
+ 'compile' => 'mysql',
+ 'bgcolor' => '#ffe5a7',
+ 'rootuser' => 'root',
+ 'serverless' => false
+);
+
+$ourdb['postgres'] = array(
+ 'fullname' => 'PostgreSQL',
+ 'havedriver' => 0,
+ 'compile' => 'pgsql',
+ 'bgcolor' => '#aaccff',
+ 'rootuser' => 'postgres',
+ 'serverless' => false
+);
+
+$ourdb['sqlite'] = array(
+ 'fullname' => 'SQLite',
+ 'havedriver' => 0,
+ 'compile' => 'pdo_sqlite',
+ 'bgcolor' => '#b1ebb1',
+ 'rootuser' => '',
+ 'serverless' => true
+);
+
+$ourdb['mssql'] = array(
+ 'fullname' => 'MSSQL',
+ 'havedriver' => 0,
+ 'compile' => 'mssql_not_ready', # Change to 'mssql' after includes/DatabaseMssql.php added;
+ 'bgcolor' => '#ffc0cb',
+ 'rootuser' => 'administrator',
+ 'serverless' => false
+);
+
+$ourdb['ibm_db2'] = array(
+ 'fullname' => 'DB2',
+ 'havedriver' => 0,
+ 'compile' => 'ibm_db2',
+ 'bgcolor' => '#ffeba1',
+ 'rootuser' => 'db2admin',
+ 'serverless' => false
+);
+
+$ourdb['oracle'] = array(
+ 'fullname' => 'Oracle',
+ 'havedriver' => 0,
+ 'compile' => 'oci8',
+ 'bgcolor' => '#ffeba1',
+ 'rootuser' => 'sys',
+ 'serverless' => false
+);
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
+<head>
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+ <meta name="robots" content="noindex,nofollow"/>
+ <title>MediaWiki <?php echo htmlspecialchars( $wgVersion ); ?> Installation</title>
+ <style type="text/css">
+
+ @import "../skins/monobook/main.css";
+
+ .env-check {
+ font-size: 90%;
+ margin: 1em 0 1em 2.5em;
+ }
+
+ .config-section {
+ margin-top: 2em;
+ }
+
+ .config-section label.column {
+ clear: left;
+ font-weight: bold;
+ width: 13em;
+ float: left;
+ text-align: right;
+ padding-right: 1em;
+ padding-top: .2em;
+ }
+
+ .config-input {
+ clear: left;
+ zoom: 100%; /* IE hack */
+ }
+
+ .config-section .config-desc {
+ clear: left;
+ margin: 0 0 2em 18em;
+ padding-top: 1em;
+ font-size: 85%;
+ }
+
+ .iput-text, .iput-password {
+ width: 14em;
+ margin-right: 1em;
+ }
+
+ .error {
+ color: red;
+ background-color: #fff;
+ font-weight: bold;
+ left: 1em;
+ font-size: 100%;
+ }
+
+ .error-top {
+ color: red;
+ background-color: #FFF0F0;
+ border: 2px solid red;
+ font-size: 130%;
+ font-weight: bold;
+ padding: 1em 1.5em;
+ margin: 2em 0 1em;
+ }
+
+ ul.plain {
+ list-style-type: none;
+ list-style-image: none;
+ float: left;
+ margin: 0;
+ padding: 0;
+ }
+
+ .btn-install {
+ font-weight: bold;
+ font-size: 110%;
+ padding: .2em .3em;
+ }
+
+ .license {
+ font-size: 85%;
+ padding-top: 3em;
+ }
+
+ span.success-message {
+ font-weight: bold;
+ font-size: 110%;
+ color: green;
+ }
+
+ .success-box {
+ font-size: 130%;
+ }
+
+ </style>
+ <script type="text/javascript">
+ <!--
+ <?php echo 'var databases = ' . FormatJson::encode( $ourdb ) . ';'; ?>
+
+ function show(id, showOrHide) {
+ var i = document.getElementById(id);
+ if (i) i.style.display = showOrHide ? 'block' : 'none';
+ }
+ function hideall() {
+ for (db in databases) {
+ show(db, false);
+ }
+ }
+ function toggleDBarea(id, defaultroot) {
+ hideall();
+ var dbarea = document.getElementById(id);
+ if (dbarea) dbarea.style.display = (dbarea.style.display == 'none') ? 'block' : 'none';
+ var db = document.getElementById('RootUser');
+ db.value = databases[id].rootuser;
+ show('db-server-settings1', !databases[id].serverless);
+ show('db-server-settings2', !databases[id].serverless);
+ }
+ // -->
+ </script>
+</head>
+
+<body>
+<div id="globalWrapper">
+<div id="column-content">
+<div id="content">
+<div id="bodyContent">
+
+<h1>MediaWiki <?php print htmlspecialchars( $wgVersion ) ?> Installation</h1>
+
+<?php
+$mainListOpened = false; # Is the main list (environement checking) opend ? Used by dieout
+
+/* Check for existing configurations and bug out! */
+
+if( file_exists( "../LocalSettings.php" ) ) {
+ $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+ dieout( "<p><strong>Setup has completed, <a href='../$script'>your wiki</a> is configured.</strong></p>
+ <p>Please delete the /config directory for extra security.</p>" );
+}
+
+if( file_exists( "./LocalSettings.php" ) ) {
+ writeSuccessMessage();
+ dieout( '' );
+}
+
+if( !is_writable( "." ) ) {
+ dieout( "<h2>Can't write config file, aborting</h2>
+
+ <p>In order to configure the wiki you have to make the <tt>config</tt> subdirectory
+ writable by the web server. Once configuration is done you'll move the created
+ <tt>LocalSettings.php</tt> to the parent directory, and for added safety you can
+ then remove the <tt>config</tt> subdirectory entirely.</p>
+
+ <p>To make the directory writable on a Unix/Linux system:</p>
+
+ <pre>
+ cd <i>" . htmlspecialchars( dirname( dirname( __FILE__ ) ) ) . "</i>
+ chmod a+w config
+ </pre>
+
+ <p>Afterwards retry to start the <a href=\"\">setup</a>.</p>" );
+}
+
+
+require_once( "$IP/maintenance/updaters.inc" );
+
+class ConfigData {
+ function getEncoded( $data ) {
+ # removing latin1 support, no need...
+ return $data;
+ }
+ function getSitename() { return $this->getEncoded( $this->Sitename ); }
+ function getSysopName() { return $this->getEncoded( $this->SysopName ); }
+ function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
+
+ function setSchema( $schema, $engine ) {
+ $this->DBschema = $schema;
+ if ( !preg_match( '/^\w*$/', $engine ) ){
+ $engine = 'InnoDB';
+ }
+ switch ( $this->DBschema ) {
+ case 'mysql5':
+ $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=utf8";
+ $this->DBmysql5 = 'true';
+ break;
+ case 'mysql5-binary':
+ $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=binary";
+ $this->DBmysql5 = 'true';
+ break;
+ default:
+ $this->DBTableOptions = "TYPE=$engine";
+ $this->DBmysql5 = 'false';
+ }
+ $this->DBengine = $engine;
+
+ # Set the global for use during install
+ global $wgDBTableOptions;
+ $wgDBTableOptions = $this->DBTableOptions;
+ }
+}
+
+?>
+
+<ul>
+ <li>
+ <b>Don't forget security updates!</b> Keep an eye on the
+ <a href="http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
+ release announcements mailing list</a>.
+ </li>
+</ul>
+
+
+<h2>Checking environment...</h2>
+<p><em>Please include all of the lines below when reporting installation problems.</em></p>
+<ul class="env-check">
+<?php
+$mainListOpened = true;
+
+$endl = "
+";
+define( 'MW_NO_OUTPUT_BUFFER', 1 );
+$conf = new ConfigData;
+
+install_version_checks();
+$self = 'Installer'; # Maintenance script name, to please Setup.php
+
+print "<li>PHP " . htmlspecialchars( phpversion() ) . " installed</li>\n";
+
+error_reporting( 0 );
+$phpdatabases = array();
+foreach (array_keys($ourdb) as $db) {
+ $compname = $ourdb[$db]['compile'];
+ if( extension_loaded( $compname ) || ( mw_have_dl() && dl( "{$compname}." . PHP_SHLIB_SUFFIX ) ) ) {
+ array_push($phpdatabases, $db);
+ $ourdb[$db]['havedriver'] = 1;
+ }
+}
+error_reporting( E_ALL | E_STRICT );
+
+if (!$phpdatabases) {
+ print "Could not find a suitable database driver!<ul>";
+ foreach (array_keys($ourdb) AS $db) {
+ $comp = $ourdb[$db]['compile'];
+ $full = $ourdb[$db]['fullname'];
+ print "<li>For <b>$full</b>, compile PHP using <b>--with-$comp</b>, "
+ ."or install the $comp.so module</li>\n";
+ }
+ echo '</ul>';
+ dieout( '' );
+}
+
+print "<li>Found database drivers for:";
+$DefaultDBtype = '';
+foreach (array_keys($ourdb) AS $db) {
+ if ($ourdb[$db]['havedriver']) {
+ if ( $DefaultDBtype == '' ) {
+ $DefaultDBtype = $db;
+ }
+ print " ".$ourdb[$db]['fullname'];
+ }
+}
+print "</li>\n";
+
+if( wfIniGetBool( "register_globals" ) ) {
+ ?>
+ <li>
+ <div style="font-size:110%">
+ <strong class="error">Warning:</strong>
+ <strong>PHP's <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
+ </div>
+ MediaWiki will work, but your server is more exposed to PHP-based security vulnerabilities.
+ </li>
+ <?php
+}
+
+$fatal = false;
+
+if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+ $fatal = true;
+ ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime'>magic_quotes_runtime</a> is active!</strong>
+ This option corrupts data input unpredictably; you cannot install or use
+ MediaWiki unless this option is disabled.</li>
+ <?php
+}
+
+if( wfIniGetBool( "magic_quotes_sybase" ) ) {
+ $fatal = true;
+ ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.sybase.php#ini.magic-quotes-sybase'>magic_quotes_sybase</a> is active!</strong>
+ This option corrupts data input unpredictably; you cannot install or use
+ MediaWiki unless this option is disabled.</li>
+ <?php
+}
+
+if( wfIniGetBool( "mbstring.func_overload" ) ) {
+ $fatal = true;
+ ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload'>mbstring.func_overload</a> is active!</strong>
+ This option causes errors and may corrupt data unpredictably;
+ you cannot install or use MediaWiki unless this option is disabled.</li>
+ <?php
+}
+
+if( wfIniGetBool( "zend.ze1_compatibility_mode" ) ) {
+ $fatal = true;
+ ?><li class="error"><strong>Fatal: <a href="http://www.php.net/manual/en/ini.core.php">zend.ze1_compatibility_mode</a> is active!</strong>
+ This option causes horrible bugs with MediaWiki; you cannot install or use
+ MediaWiki unless this option is disabled.</li>
+ <?php
+}
+
+if( $fatal ) {
+ dieout( "Cannot install MediaWiki." );
+}
+
+if( wfIniGetBool( "safe_mode" ) ) {
+ $conf->safeMode = true;
+ ?>
+ <li><b class='error'>Warning:</b> <strong>PHP's
+ <a href='http://www.php.net/features.safe-mode'>safe mode</a> is active.</strong>
+ You may have problems caused by this, particularly if using image uploads.
+ </li>
+ <?php
+} else {
+ $conf->safeMode = false;
+}
+
+$sapi = htmlspecialchars( php_sapi_name() );
+print "<li>PHP server API is $sapi; ";
+$script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+if( $wgUsePathInfo ) {
+ print "ok, using pretty URLs (<tt>$script/Page_Title</tt>)";
+} else {
+ print "using ugly URLs (<tt>$script?title=Page_Title</tt>)";
+}
+print "</li>\n";
+
+$conf->xml = function_exists( "utf8_encode" );
+if( $conf->xml ) {
+ print "<li>Have XML / Latin1-UTF-8 conversion support.</li>\n";
+} else {
+ dieout( "PHP's XML module is missing; the wiki requires functions in
+ this module and won't work in this configuration.
+ If you're running Mandrake, install the php-xml package." );
+}
+
+# Check for session support
+if( !function_exists( 'session_name' ) )
+ dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
+
+# session.save_path doesn't *have* to be set, but if it is, and it's
+# not valid/writable/etc. then it can cause problems
+$sessionSavePath = mw_get_session_save_path();
+$ssp = htmlspecialchars( $sessionSavePath );
+# Warn the user if it's not set, but let them proceed
+if( !$sessionSavePath ) {
+ print "<li><strong>Warning:</strong> A value for <tt>session.save_path</tt>
+ has not been set in PHP.ini. If the default value causes problems with
+ saving session data, set it to a valid path which is read/write/execute
+ for the user your web server is running under.</li>";
+} elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) {
+ # All good? Let the user know
+ print "<li>Session save path (<tt>{$ssp}</tt>) appears to be valid.</li>";
+} else {
+ # Something not right? Warn the user, but let them proceed
+ print "<li><strong>Warning:</strong> Your <tt>session.save_path</tt> value (<tt>{$ssp}</tt>)
+ appears to be invalid or is not writable. PHP needs to be able to save data to
+ this location for correct session operation.</li>";
+}
+
+# Check for PCRE support
+if( !function_exists( 'preg_match' ) )
+ dieout( "The PCRE support module appears to be missing. MediaWiki requires the
+ Perl-compatible regular expression functions." );
+
+# The installer can take a while, and we really don't want it to time out
+wfSuppressWarnings();
+set_time_limit( 0 );
+wfRestoreWarnings();
+
+$memlimit = ini_get( "memory_limit" );
+if( $memlimit == -1 ) {
+ print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
+} else {
+ print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ). " bytes. ";
+ $newlimit = wfMemoryLimit();
+ $memlimit = wfShorthandToInteger( $memlimit );
+ if( $newlimit < $memlimit ) {
+ print "<b>Failed raising limit, installation may fail.</b>";
+ } elseif ( $newlimit > $memlimit ) {
+ print "Raised <tt>memory_limit</tt> to " . htmlspecialchars( $newlimit ) . " bytes. ";
+ }
+ print "</li>\n";
+}
+
+$conf->xcache = function_exists( 'xcache_get' );
+if( $conf->xcache )
+ print "<li><a href=\"http://trac.lighttpd.net/xcache/\">XCache</a> installed</li>\n";
+
+$conf->apc = function_exists('apc_fetch');
+if ($conf->apc ) {
+ print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>\n";
+}
+
+$conf->eaccel = function_exists( 'eaccelerator_get' );
+if ( $conf->eaccel ) {
+ print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
+}
+
+$conf->dba = function_exists( 'dba_open' );
+
+if( !( $conf->eaccel || $conf->apc || $conf->xcache ) ) {
+ echo( '<li>Couldn\'t find <a href="http://eaccelerator.sourceforge.net">eAccelerator</a>,
+ <a href="http://www.php.net/apc">APC</a> or <a href="http://trac.lighttpd.net/xcache/">XCache</a>;
+ cannot use these for object caching.</li>' );
+}
+
+$conf->diff3 = false;
+$diff3locations = array_merge(
+ array(
+ "/usr/bin",
+ "/usr/local/bin",
+ "/opt/csw/bin",
+ "/usr/gnu/bin",
+ "/usr/sfw/bin" ),
+ explode( PATH_SEPARATOR, getenv( "PATH" ) ) );
+$diff3names = array( "gdiff3", "diff3", "diff3.exe" );
+
+$diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
+foreach ($diff3locations as $loc) {
+ $exe = locate_executable($loc, $diff3names, $diff3versioninfo);
+ if ($exe !== false) {
+ $conf->diff3 = $exe;
+ break;
+ }
+}
+
+if ($conf->diff3)
+ print "<li>Found GNU diff3: <tt>$conf->diff3</tt>.</li>";
+else
+ print "<li>GNU diff3 not found.</li>";
+
+$conf->ImageMagick = false;
+$imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
+foreach( $imcheck as $dir ) {
+ $im = "$dir/convert";
+ if( @file_exists( $im ) ) {
+ print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
+ $conf->ImageMagick = $im;
+ break;
+ }
+}
+
+$conf->HaveGD = function_exists( "imagejpeg" );
+if( $conf->HaveGD ) {
+ print "<li>Found GD graphics library built-in";
+ if( !$conf->ImageMagick ) {
+ print ", image thumbnailing will be enabled if you enable uploads";
+ }
+ print ".</li>\n";
+} else {
+ if( !$conf->ImageMagick ) {
+ print "<li>Couldn't find GD library or ImageMagick; image thumbnailing disabled.</li>\n";
+ }
+}
+
+$conf->IP = dirname( dirname( __FILE__ ) );
+print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
+
+
+// PHP_SELF isn't available sometimes, such as when PHP is CGI but
+// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
+// to get the path to the current script... hopefully it's reliable. SIGH
+$path = ($_SERVER["PHP_SELF"] === '')
+ ? $_SERVER["SCRIPT_NAME"]
+ : $_SERVER["PHP_SELF"];
+
+$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
+print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
+
+
+
+// We may be installing from *.php5 extension file, if so, print message
+$conf->ScriptExtension = '.php';
+if (defined('MW_INSTALL_PHP5_EXT')) {
+ $conf->ScriptExtension = '.php5';
+ print "<li>Installing MediaWiki with <tt>php5</tt> file extensions</li>\n";
+} else {
+ print "<li>Installing MediaWiki with <tt>php</tt> file extensions</li>\n";
+}
+
+
+print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
+ $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
+
+ $conf->Sitename = ucfirst( importPost( "Sitename", "" ) );
+ $defaultEmail = empty( $_SERVER["SERVER_ADMIN"] )
+ ? 'root@localhost'
+ : $_SERVER["SERVER_ADMIN"];
+ $conf->EmergencyContact = importPost( "EmergencyContact", $defaultEmail );
+ $conf->DBtype = importPost( "DBtype", $DefaultDBtype );
+ if ( !isset( $ourdb[$conf->DBtype] ) ) {
+ $conf->DBtype = $DefaultDBtype;
+ }
+
+ $conf->DBserver = importPost( "DBserver", "localhost" );
+ $conf->DBname = importPost( "DBname", "wikidb" );
+ $conf->DBuser = importPost( "DBuser", "wikiuser" );
+ $conf->DBpassword = importPost( "DBpassword" );
+ $conf->DBpassword2 = importPost( "DBpassword2" );
+ $conf->SysopName = importPost( "SysopName", "WikiSysop" );
+ $conf->SysopPass = importPost( "SysopPass" );
+ $conf->SysopPass2 = importPost( "SysopPass2" );
+ $conf->RootUser = importPost( "RootUser" );
+ $conf->RootPW = importPost( "RootPW", "" );
+ $useRoot = importCheck( 'useroot', false );
+ $conf->LanguageCode = importPost( "LanguageCode", "en" );
+ ## MySQL specific:
+ $conf->DBprefix = importPost( "DBprefix" );
+ $conf->setSchema(
+ importPost( "DBschema", "mysql5-binary" ),
+ importPost( "DBengine", "InnoDB" ) );
+
+ ## Postgres specific:
+ $conf->DBport = importPost( "DBport", "5432" );
+ $conf->DBts2schema = importPost( "DBts2schema", "public" );
+ $conf->DBpgschema = importPost( "DBpgschema", "mediawiki" );
+
+ ## SQLite specific
+ $conf->SQLiteDataDir = importPost( "SQLiteDataDir", "$IP/../data" );
+
+ ## MSSQL specific
+ // We need a second field so it doesn't overwrite the MySQL one
+ $conf->DBprefix2 = importPost( "DBprefix2" );
+
+ ## DB2 specific:
+ // New variable in order to have a different default port number
+ $conf->DBport_db2 = importPost( "DBport_db2", "50000" );
+ $conf->DBcataloged = importPost( "DBcataloged", "cataloged" );
+ $conf->DBdb2schema = importPost( "DBdb2schema", "mediawiki" );
+
+ // Oracle specific
+ $conf->DBprefix_ora = importPost( "DBprefix_ora" );
+ $conf->DBdefTS_ora = importPost( "DBdefTS_ora", "USERS" );
+ $conf->DBtempTS_ora = importPost( "DBtempTS_ora", "TEMP" );
+
+ $conf->ShellLocale = getShellLocale( $conf->LanguageCode );
+
+/* Check for validity */
+$errs = array();
+
+if( preg_match( '/^$|^mediawiki$|#/i', $conf->Sitename ) ) {
+ $errs["Sitename"] = "Must not be blank or \"MediaWiki\" and may not contain \"#\"";
+}
+if( !$ourdb[$conf->DBtype]['serverless'] ) {
+ if( $conf->DBuser == "" ) {
+ $errs["DBuser"] = "Must not be blank";
+ }
+ if( ($conf->DBtype == 'mysql') && (strlen($conf->DBuser) > 16) ) {
+ $errs["DBuser"] = "Username too long";
+ }
+ if( $conf->DBpassword == "" && $conf->DBtype != "postgres" ) {
+ $errs["DBpassword"] = "Must not be blank";
+ }
+ if( $conf->DBpassword != $conf->DBpassword2 ) {
+ $errs["DBpassword2"] = "Passwords don't match!";
+ }
+}
+if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
+ $errs["DBprefix"] = "Invalid table prefix";
+} else {
+ untaint( $conf->DBprefix, TC_MYSQL );
+}
+if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix_ora ) ) {
+ $errs["DBprefix_ora"] = "Invalid table prefix";
+}
+
+error_reporting( E_ALL | E_STRICT );
+
+/**
+ * Initialise $wgLang and $wgContLang to something so we can
+ * call case-folding methods. Per Brion, this is English for
+ * now, although we could be clever and initialise to the
+ * user-selected language.
+ */
+$wgContLang = Language::factory( 'en' );
+$wgLang = $wgContLang;
+
+/**
+ * We're messing about with users, so we need a stub
+ * authentication plugin...
+ */
+$wgAuth = new AuthPlugin();
+
+/**
+ * Validate the initial administrator account; username,
+ * password checks, etc.
+ */
+if( $conf->SysopName ) {
+ # Check that the user can be created
+ $u = User::newFromName( $conf->SysopName );
+ if( $u instanceof User ) {
+ # Various password checks
+ if( $conf->SysopPass != '' ) {
+ if( $conf->SysopPass == $conf->SysopPass2 ) {
+ if( !$u->isValidPassword( $conf->SysopPass ) ) {
+ $errs['SysopPass'] = "Bad password";
+ }
+ } else {
+ $errs['SysopPass2'] = "Passwords don't match";
+ }
+ } else {
+ $errs['SysopPass'] = "Cannot be blank";
+ }
+ unset( $u );
+ } else {
+ $errs['SysopName'] = "Bad username";
+ }
+}
+
+$conf->License = importRequest( "License", "none" );
+if( $conf->License == "gfdl1_2" ) {
+ $conf->RightsUrl = "http://www.gnu.org/licenses/old-licenses/fdl-1.2.txt";
+ $conf->RightsText = "GNU Free Documentation License 1.2";
+ $conf->RightsCode = "gfdl1_2";
+ $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
+} elseif( $conf->License == "gfdl1_3" ) {
+ $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
+ $conf->RightsText = "GNU Free Documentation License 1.3";
+ $conf->RightsCode = "gfdl1_3";
+ $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
+} elseif( $conf->License == "none" ) {
+ $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
+} elseif( $conf->License == "pd" ) {
+ $conf->RightsUrl = "http://creativecommons.org/licenses/publicdomain/";
+ $conf->RightsText = "Public Domain";
+ $conf->RightsCode = "pd";
+ $conf->RightsIcon = '${wgScriptPath}/skins/common/images/public-domain.png';
+} else {
+ $conf->RightsUrl = importRequest( "RightsUrl", "" );
+ $conf->RightsText = importRequest( "RightsText", "" );
+ $conf->RightsCode = importRequest( "RightsCode", "" );
+ $conf->RightsIcon = importRequest( "RightsIcon", "" );
+}
+
+$conf->Shm = importRequest( "Shm", "none" );
+$conf->MCServers = importRequest( "MCServers" );
+
+/* Test memcached servers */
+
+if ( $conf->Shm == 'memcached' && $conf->MCServers ) {
+ $conf->MCServerArray = wfArrayMap( 'trim', explode( ',', $conf->MCServers ) );
+ foreach ( $conf->MCServerArray as $server ) {
+ $error = testMemcachedServer( $server );
+ if ( $error ) {
+ $errs["MCServers"] = $error;
+ break;
+ }
+ }
+} else if ( $conf->Shm == 'memcached' ) {
+ $errs["MCServers"] = "Please specify at least one server if you wish to use memcached";
+}
+
+/* default values for installation */
+$conf->Email = importRequest("Email", "email_enabled");
+$conf->Emailuser = importRequest("Emailuser", "emailuser_enabled");
+$conf->Enotif = importRequest("Enotif", "enotif_allpages");
+$conf->Eauthent = importRequest("Eauthent", "eauthent_enabled");
+
+if( $conf->posted && ( 0 == count( $errs ) ) ) {
+ do { /* So we can 'continue' to end prematurely */
+ $conf->Root = ($conf->RootPW != "");
+
+ /* Load up the settings and get installin' */
+ $local = writeLocalSettings( $conf );
+ echo "<li style=\"list-style: none\">\n";
+ echo "<p><b>Generating configuration file...</b></p>\n";
+ echo "</li>\n";
+
+ $wgCommandLineMode = false;
+ chdir( ".." );
+ $ok = eval( $local );
+ if( $ok === false ) {
+ dieout( "<p>Errors in generated configuration; " .
+ "most likely due to a bug in the installer... " .
+ "Config file was: </p>" .
+ "<pre>" .
+ htmlspecialchars( $local ) .
+ "</pre>" );
+ }
+ $conf->DBtypename = '';
+ foreach (array_keys($ourdb) as $db) {
+ if ($conf->DBtype === $db)
+ $conf->DBtypename = $ourdb[$db]['fullname'];
+ }
+ if ( ! strlen($conf->DBtype)) {
+ $errs["DBpicktype"] = "Please choose a database type";
+ continue;
+ }
+
+ if (! $conf->DBtypename) {
+ $errs["DBtype"] = "Unknown database type '$conf->DBtype'";
+ continue;
+ }
+ print "<li>Database type: " . htmlspecialchars( $conf->DBtypename ) . "</li>\n";
+ $dbclass = 'Database'.ucfirst($conf->DBtype);
+ $wgDBtype = $conf->DBtype;
+ $wgDBadminuser = "root";
+ $wgDBadminpassword = $conf->RootPW;
+
+ ## Mysql specific:
+ $wgDBprefix = $conf->DBprefix;
+
+ ## Postgres specific:
+ $wgDBport = $conf->DBport;
+ $wgDBts2schema = $conf->DBts2schema;
+
+ if( $wgDBtype == 'postgres' ) {
+ $wgDBmwschema = $conf->DBpgschema;
+ } elseif ( $wgDBtype == 'ibm_db2' ) {
+ $wgDBmwschema = $conf->DBdb2schema;
+ }
+
+ if( $conf->DBprefix2 != '' ) {
+ // For MSSQL
+ $wgDBprefix = $conf->DBprefix2;
+ } elseif( $conf->DBprefix_ora != '' ) {
+ // For Oracle
+ $wgDBprefix = $conf->DBprefix_ora;
+ }
+
+ ## DB2 specific:
+ $wgDBcataloged = $conf->DBcataloged;
+
+ $wgCommandLineMode = true;
+ if (! defined ( 'STDERR' ) )
+ define( 'STDERR', fopen("php://stderr", "wb"));
+ $wgUseDatabaseMessages = false; /* FIXME: For database failure */
+ require_once( "$IP/includes/Setup.php" );
+ Language::getLocalisationCache()->disableBackend();
+
+ chdir( "config" );
+
+ $wgTitle = Title::newFromText( "Installation script" );
+ error_reporting( E_ALL | E_STRICT );
+ print "<li>Loading class: " . htmlspecialchars( $dbclass ) . "</li>\n";
+ if ( $conf->DBtype != 'sqlite' ) {
+ $dbc = new $dbclass;
+ }
+
+ if( $conf->DBtype == 'mysql' ) {
+ $mysqlOldClient = version_compare( mysql_get_client_info(), "4.1.0", "lt" );
+ if( $mysqlOldClient ) {
+ print "<li><b>PHP is linked with old MySQL client libraries. If you are
+ using a MySQL 4.1 server and have problems connecting to the database,
+ see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
+ >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
+ }
+ $ok = true; # Let's be optimistic
+
+ # Decide if we're going to use the superuser or the regular database user
+ $conf->Root = $useRoot;
+ if( $conf->Root ) {
+ $db_user = $conf->RootUser;
+ $db_pass = $conf->RootPW;
+ } else {
+ $db_user = $wgDBuser;
+ $db_pass = $wgDBpassword;
+ }
+
+ # Attempt to connect
+ echo( "<li>Attempting to connect to database server as " . htmlspecialchars( $db_user ) . "..." );
+ $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
+
+ # Check the connection and respond to errors
+ if( $wgDatabase->isOpen() ) {
+ # Seems OK
+ $ok = true;
+ $wgDBadminuser = $db_user;
+ $wgDBadminpassword = $db_pass;
+ echo( "success.</li>\n" );
+ $wgDatabase->ignoreErrors( true );
+ $myver = $wgDatabase->getServerVersion();
+ } else {
+ # There were errors, report them and back out
+ $ok = false;
+ $errno = mysql_errno();
+ $errtx = htmlspecialchars( mysql_error() );
+ switch( $errno ) {
+ case 1045:
+ case 2000:
+ echo( "failed due to authentication errors. Check passwords.</li>" );
+ if( $conf->Root ) {
+ # The superuser details are wrong
+ $errs["RootUser"] = "Check username";
+ $errs["RootPW"] = "and password";
+ } else {
+ # The regular user details are wrong
+ $errs["DBuser"] = "Check username";
+ $errs["DBpassword"] = "and password";
+ }
+ break;
+ case 2002:
+ case 2003:
+ default:
+ # General connection problem
+ echo( htmlspecialchars( "failed with error [$errno] $errtx." ) . "</li>\n" );
+ $errs["DBserver"] = "Connection failed";
+ break;
+ } # switch
+ } #conn. att.
+
+ if( !$ok ) { continue; }
+ }
+ else if( $conf->DBtype == 'ibm_db2' ) {
+ if( $useRoot ) {
+ $db_user = $conf->RootUser;
+ $db_pass = $conf->RootPW;
+ } else {
+ $db_user = $wgDBuser;
+ $db_pass = $wgDBpassword;
+ }
+
+ echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
+ "\" as \"" . htmlspecialchars( $db_user ) . "\"..." );
+ $wgDatabase = $dbc->newFromParams($wgDBserver, $db_user, $db_pass, $wgDBname, 1);
+ // enable extra debug messages
+ $dbc->setMode(DatabaseIbm_db2::INSTALL_MODE);
+ $wgDatabase->setMode(DatabaseIbm_db2::INSTALL_MODE);
+
+ if (!$wgDatabase->isOpen()) {
+ print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
+ } else {
+ $myver = $wgDatabase->getServerVersion();
+ }
+ if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
+
+ } elseif ( $conf->DBtype == 'sqlite' ) {
+ $wgSQLiteDataDir = $conf->SQLiteDataDir;
+ echo '<li>Attempting to connect to SQLite database at "' .
+ htmlspecialchars( $wgSQLiteDataDir ) . '": ';
+ if ( !is_dir( $wgSQLiteDataDir ) ) {
+ if ( is_writable( dirname( $wgSQLiteDataDir ) ) ) {
+ $ok = wfMkdirParents( $wgSQLiteDataDir, $wgSQLiteDataDirMode );
+ } else {
+ $ok = false;
+ }
+ if ( !$ok ) {
+ echo "cannot create data directory</li>";
+ $errs['SQLiteDataDir'] = 'Enter a valid data directory';
+ continue;
+ }
+ }
+ if ( !is_writable( $wgSQLiteDataDir ) ) {
+ echo "data directory not writable</li>";
+ $errs['SQLiteDataDir'] = 'Enter a writable data directory';
+ continue;
+ }
+ $dataFile = DatabaseSqlite::generateFileName( $wgSQLiteDataDir, $wgDBname );
+ if ( file_exists( $dataFile ) ) {
+ if ( !is_writable( $dataFile ) ) {
+ echo "data file not writable</li>";
+ $errs['SQLiteDataDir'] = basename( $dataFile ) . " is not writable";
+ continue;
+ }
+ } else {
+ if ( file_put_contents( $dataFile, '' ) === false ) {
+ echo 'could not create database file "' . htmlspecialchars( basename( $dataFile ) ) . "\"</li>\n";
+ $errs['SQLiteDataDir'] = "couldn't create " . basename( $dataFile );
+ continue;
+ }
+ }
+ try {
+ $wgDatabase = new DatabaseSqlite( false, false, false, $wgDBname, 1 );
+ }
+ catch( MWException $ex ) {
+ echo 'error: ' . htmlspecialchars( $ex->getMessage() ) . "</li>\n";
+ continue;
+ }
+
+ if (!$wgDatabase->isOpen()) {
+ print "error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
+ $errs['SQLiteDataDir'] = 'Could not connect to database';
+ continue;
+ } else {
+ $myver = $wgDatabase->getServerVersion();
+ }
+ if ( is_callable( array( $wgDatabase, 'initial_setup' ) ) ) {
+ $wgDatabase->initial_setup('', $wgDBname);
+ }
+ echo "ok</li>\n";
+ } elseif ( $conf->DBtype == 'oracle' ) {
+ echo "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) ."\"</li>";
+ $old_error_level = error_reporting();
+ wfSuppressWarnings();
+ $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBuser, $wgDBpassword, $wgDBname, 1);
+ wfRestoreWarnings();
+ if (!$wgDatabase->isOpen()) {
+ $ok = true;
+ echo "<li>Connect failed.</li>";
+ if ($useRoot) {
+ if (ini_get('oci8.privileged_connect') === false) {
+ echo "<li>Privileged connect disabled, please set oci8.privileged_connect or run maintenance/ora/user.sql script manually prior to continuing.</li>";
+ $ok = false;
+ } else {
+ $wgDBadminuser = $conf->RootUser;
+ $wgDBadminpassword = $conf->RootPW;
+ echo "<li>Attempting to create DB user.</li>";
+ $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBadminuser, $wgDBadminpassword, $wgDBname, 1, 64);
+ if ($wgDatabase->isOpen()) {
+ $wgDBOracleDefTS = $conf->DBdefTS_ora;
+ $wgDBOracleTempTS = $conf->DBtempTS_ora;
+ $res = $wgDatabase->sourceFile( "../maintenance/ora/user.sql" );
+ if ($res !== true) dieout($res);
+ } else {
+ echo "<li>Invalid database superuser, please supply a valid superuser account.</li>";
+ echo "<li>ERR: ".print_r(oci_error(), true)."</li>";
+ $ok = false;
+ }
+ }
+ } else {
+ echo "<li>Database superuser missing, please supply a valid superuser account.</li>";
+ $ok = false;
+ }
+ if (!$ok) {
+ $errs["RootUser"] = "Check username";
+ $errs["RootPW"] = "and password";
+ } else {
+ echo "<li>Attempting to connect to database with new user \"" . htmlspecialchars( $wgDBname ) ."\"</li>";
+ $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBuser, $wgDBpassword, $wgDBname, 1);
+ }
+ }
+ if ($ok) {
+ $myver = $wgDatabase->getServerVersion();
+ }
+ } else { # not mysql
+ error_reporting( E_ALL | E_STRICT );
+ $wgSuperUser = '';
+ ## Possible connect as a superuser
+ // Changed !mysql to postgres check since it seems to only apply to postgres
+ if( $useRoot && $conf->DBtype == 'postgres' ) {
+ $wgDBsuperuser = $conf->RootUser;
+ echo( "<li>Attempting to connect to database \"postgres\" as superuser \"" .
+ htmlspecialchars( $wgDBsuperuser ) . "\"..." );
+ $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
+ if (!$wgDatabase->isOpen()) {
+ print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
+ $errs["DBserver"] = "Could not connect to database as superuser";
+ $errs["RootUser"] = "Check username";
+ $errs["RootPW"] = "and password";
+ continue;
+ }
+ $wgDatabase->initial_setup($conf->RootPW, 'postgres');
+ }
+ echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
+ "\" as \"" . htmlspecialchars( $wgDBuser ) . "\"..." );
+ $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
+ if (!$wgDatabase->isOpen()) {
+ print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
+ $errs["DBserver"] = "Could not connect to database as user";
+ $errs["DBuser"] = "Check username";
+ $errs["DBpassword"] = "and password";
+ continue;
+ } else {
+ $myver = $wgDatabase->getServerVersion();
+ }
+ if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
+ }
+
+ if ( !$wgDatabase->isOpen() ) {
+ $errs["DBserver"] = "Couldn't connect to database";
+ continue;
+ }
+
+ print "<li>Connected to " . htmlspecialchars( "{$conf->DBtype} $myver" );
+ if ($conf->DBtype == 'mysql') {
+ if( version_compare( $myver, "4.0.14" ) < 0 ) {
+ print "</li>\n";
+ dieout( "-- mysql 4.0.14 or later required. Aborting." );
+ }
+ $mysqlNewAuth = version_compare( $myver, "4.1.0", "ge" );
+ if( $mysqlNewAuth && $mysqlOldClient ) {
+ print "; <b class='error'>You are using MySQL 4.1 server, but PHP is linked
+ to old client libraries; if you have trouble with authentication, see
+ <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
+ >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
+ }
+ if( $wgDBmysql5 ) {
+ if( $mysqlNewAuth ) {
+ print "; enabling MySQL 4.1/5.0 charset mode";
+ } else {
+ print "; <b class='error'>MySQL 4.1/5.0 charset mode enabled,
+ but older version detected; will likely fail.</b>";
+ }
+ }
+ print "</li>\n";
+
+ @$sel = $wgDatabase->selectDB( $wgDBname );
+ if( $sel ) {
+ print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
+ } else {
+ $err = mysql_errno();
+ $databaseSafe = htmlspecialchars( $wgDBname );
+ if( $err == 1102 /* Invalid database name */ ) {
+ print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
+ continue;
+ } elseif( $err != 1049 /* Database doesn't exist */ ) {
+ print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
+ print htmlspecialchars( mysql_error() ) . "</li></ul>";
+ continue;
+ }
+ print "<li>Attempting to create database...</li>";
+ $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
+ if( !$res ) {
+ print "<li>Couldn't create database <tt>" .
+ htmlspecialchars( $wgDBname ) .
+ "</tt>; try with root access or check your username/pass.</li>\n";
+ $errs["RootPW"] = "<- Enter";
+ continue;
+ }
+ print "<li>Created database <tt>" . htmlspecialchars( $wgDBname ) . "</tt></li>\n";
+ }
+ $wgDatabase->selectDB( $wgDBname );
+ }
+ else if ($conf->DBtype == 'postgres') {
+ if( version_compare( $myver, "8.0" ) < 0 ) {
+ dieout( "<b>Postgres 8.0 or later is required</b>. Aborting." );
+ }
+ }
+
+ if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
+ print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
+
+ if ( $conf->DBtype == 'mysql') {
+ # Determine existing default character set
+ if ( $wgDatabase->tableExists( "revision" ) ) {
+ $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' );
+ $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" );
+ $row = $wgDatabase->fetchObject( $res );
+ if ( !$row ) {
+ echo "<li>SHOW TABLE STATUS query failed!</li>\n";
+ $existingSchema = false;
+ $existingEngine = false;
+ } else {
+ if ( preg_match( '/^latin1/', $row->Collation ) ) {
+ $existingSchema = 'mysql4';
+ } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
+ $existingSchema = 'mysql5';
+ } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
+ $existingSchema = 'mysql5-binary';
+ } else {
+ $existingSchema = false;
+ echo "<li><strong>Warning:</strong> Unrecognised existing collation</li>\n";
+ }
+ if ( isset( $row->Engine ) ) {
+ $existingEngine = $row->Engine;
+ } else {
+ $existingEngine = $row->Type;
+ }
+ }
+ if ( $existingSchema && $existingSchema != $conf->DBschema ) {
+ $encExisting = htmlspecialchars( $existingSchema );
+ $encRequested = htmlspecialchars( $conf->DBschema );
+ print "<li><strong>Warning:</strong> you requested the $encRequested schema, " .
+ "but the existing database has the $encExisting schema. This upgrade script ".
+ "can't convert it, so it will remain $encExisting.</li>\n";
+ $conf->setSchema( $existingSchema, $conf->DBengine );
+ }
+ if ( $existingEngine && $existingEngine != $conf->DBengine ) {
+ $encExisting = htmlspecialchars( $existingEngine );
+ $encRequested = htmlspecialchars( $conf->DBengine );
+ print "<li><strong>Warning:</strong> you requested the $encRequested storage " .
+ "engine, but the existing database uses the $encExisting engine. This upgrade " .
+ "script can't convert it, so it will remain $encExisting.</li>\n";
+ $conf->setSchema( $conf->DBschema, $existingEngine );
+ }
+ }
+
+ # Create user if required
+ if ( $conf->Root ) {
+ $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
+ if ( $conn->isOpen() ) {
+ print "<li>DB user account ok</li>\n";
+ $conn->close();
+ } else {
+ print "<li>Granting user permissions...";
+ if( $mysqlOldClient && $mysqlNewAuth ) {
+ print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
+ }
+ print "</li>\n";
+ $res = $wgDatabase->sourceFile( "../maintenance/users.sql" );
+ if ($res !== true) dieout($res);
+ }
+ }
+ }
+ print "</ul><pre>\n";
+ chdir( ".." );
+ flush();
+ do_all_updates();
+ chdir( "config" );
+ print "</pre>\n";
+ print "<ul><li>Finished update checks.</li>\n";
+ // if tables don't yet exist
+ } else {
+ # Determine available storage engines if possible
+ if ( $conf->DBtype == 'mysql' && version_compare( $myver, "4.1.2", "ge" ) ) {
+ $res = $wgDatabase->query( 'SHOW ENGINES' );
+ $found = false;
+ while ( $row = $wgDatabase->fetchObject( $res ) ) {
+ if ( $row->Engine == $conf->DBengine && ( $row->Support == 'YES' || $row->Support == 'DEFAULT' ) ) {
+ $found = true;
+ break;
+ }
+ }
+ $wgDatabase->freeResult( $res );
+ if ( !$found && $conf->DBengine != 'MyISAM' ) {
+ echo "<li><strong>Warning:</strong> " . htmlspecialchars( $conf->DBengine ) .
+ " storage engine not available, " .
+ "using MyISAM instead</li>\n";
+ $conf->setSchema( $conf->DBschema, 'MyISAM' );
+ }
+ }
+
+ # FIXME: Check for errors
+ print "<li>Creating tables...";
+ if ($conf->DBtype == 'mysql') {
+ $res = $wgDatabase->sourceFile( "../maintenance/tables.sql" );
+ if ($res === true) {
+ print " done.</li>\n<li>Populating interwiki table... \n";
+ $res = $wgDatabase->sourceFile( "../maintenance/interwiki.sql" );
+ }
+ if ($res === true) {
+ print " done.</li>\n";
+ } else {
+ print " <b>FAILED</b></li>\n";
+ dieout( htmlspecialchars( $res ) );
+ }
+ } elseif (is_callable(array($wgDatabase, 'setup_database'))) {
+ $wgDatabase->setup_database();
+ }
+ else {
+ $errs["DBtype"] = "Do not know how to handle database type '$conf->DBtype'";
+ continue;
+ }
+
+
+ if ( $conf->DBtype == 'ibm_db2' ) {
+ // Now that table creation is done, make sure everything is committed
+ // Do this before doing inserts through API
+ if ($wgDatabase->lastError()) {
+ print "<li>Errors encountered during table creation -- rolled back</li>\n";
+ $wgDatabase->rollback();
+ }
+ else {
+ print "<li>MediaWiki tables successfully created</li>\n";
+ $wgDatabase->commit();
+ }
+ } elseif ( $conf->DBtype == 'sqlite' ) {
+ // Ensure proper searchindex format. We have to do that separately because
+ // if SQLite is compiled without the FTS3 module, table creation syntax will be invalid.
+ sqlite_setup_searchindex();
+ }
+
+ print "<li>Initializing statistics...</li>\n";
+ $wgDatabase->insert( 'site_stats',
+ array ( 'ss_row_id' => 1,
+ 'ss_total_views' => 0,
+ 'ss_total_edits' => 1, # Main page first edit
+ 'ss_good_articles' => 0, # Main page is not a good article - no internal link
+ 'ss_total_pages' => 1, # Main page
+ 'ss_users' => $conf->SysopName ? 1 : 0, # Sysop account, if created
+ 'ss_admins' => $conf->SysopName ? 1 : 0, # Sysop account, if created
+ 'ss_images' => 0 ) );
+
+ # Set up the "regular user" account *if we can, and if we need to*
+ if( $conf->Root and $conf->DBtype == 'mysql') {
+ # See if we need to
+ $wgDatabase2 = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
+ if( $wgDatabase2->isOpen() ) {
+ # Nope, just close the test connection and continue
+ $wgDatabase2->close();
+ echo( "<li>User " . htmlspecialchars( $wgDBuser ) . " exists. Skipping grants.</li>\n" );
+ } else {
+ # Yes, so run the grants
+ echo( "<li>" . htmlspecialchars( "Granting user permissions to $wgDBuser on $wgDBname..." ) );
+ $res = $wgDatabase->sourceFile( "../maintenance/users.sql" );
+ if ( $res === true ) {
+ echo( " success.</li>\n" );
+ } else {
+ echo( " <b>FAILED</b>.</li>\n" );
+ dieout( $res );
+ }
+ }
+ }
+
+ if( $conf->SysopName ) {
+ $u = User::newFromName( $conf->getSysopName() );
+ if ( !$u ) {
+ print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
+ }
+ else if ( 0 == $u->idForName() ) {
+ $u->addToDatabase();
+ $u->setPassword( $conf->getSysopPass() );
+ $u->saveSettings();
+
+ $u->addGroup( "sysop" );
+ $u->addGroup( "bureaucrat" );
+
+ print "<li>Created sysop account <tt>" .
+ htmlspecialchars( $conf->SysopName ) . "</tt>.</li>\n";
+ } else {
+ print "<li>Could not create user - already exists!</li>\n";
+ }
+ } else {
+ print "<li>Skipped sysop account creation, no name given.</li>\n";
+ }
+
+ $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
+ $article = new Article( $titleobj );
+ $newid = $article->insertOn( $wgDatabase );
+ $revision = new Revision( array(
+ 'page' => $newid,
+ 'text' => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsgNoTrans( 'mainpagedocfooter' ),
+ 'comment' => '',
+ 'user' => 0,
+ 'user_text' => 'MediaWiki default',
+ ) );
+ $revid = $revision->insertOn( $wgDatabase );
+ $article->updateRevisionOn( $wgDatabase, $revision );
+ }
+
+ /* Write out the config file now that all is well */
+ print "<li style=\"list-style: none\">\n";
+ print "<p>Creating LocalSettings.php...</p>\n\n";
+ $localSettings = "<" . "?php$endl$local";
+ // Fix up a common line-ending problem (due to CVS on Windows)
+ $localSettings = str_replace( "\r\n", "\n", $localSettings );
+ $f = fopen( "LocalSettings.php", 'xt' );
+
+ if( $f == false ) {
+ print( "</li>\n" );
+ dieout( "<p>Couldn't write out LocalSettings.php. Check that the directory permissions are correct and that there isn't already a file of that name here...</p>\n" .
+ "<p>Here's the file that would have been written, try to paste it into place manually:</p>\n" .
+ "<pre>\n" . htmlspecialchars( $localSettings ) . "</pre>\n" );
+ }
+ if(fwrite( $f, $localSettings ) ) {
+ fclose( $f );
+ print "<hr/>\n";
+ writeSuccessMessage();
+ print "</li>\n";
+ } else {
+ fclose( $f );
+ dieout( "<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p></li>\n" );
+ }
+
+ } while( false );
+}
+
+print "</ul>\n";
+$mainListOpened = false;
+
+if( count( $errs ) ) {
+ /* Display options form */
+
+ if( $conf->posted ) {
+ echo "<p class='error-top'>Something's not quite right yet; make sure everything below is filled out correctly.</p>\n";
+ }
+?>
+
+<form action="<?php echo defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php'; ?>" name="config" method="post">
+
+<h2>Site config</h2>
+
+<div class="config-section">
+ <div class="config-input">
+ <?php aField( $conf, "Sitename", "Wiki name:" ); ?>
+ </div>
+ <p class="config-desc">
+ Preferably a short word without punctuation, i.e. "Wikipedia".<br />
+ Will appear as the namespace name for "meta" pages, and throughout the interface.
+ </p>
+ <div class="config-input"><?php aField( $conf, "EmergencyContact", "Contact e-mail:" ); ?></div>
+ <p class="config-desc">
+ Displayed to users in some error messages, used as the return address for password reminders, and used as the default sender address of e-mail notifications.
+ </p>
+
+ <div class="config-input">
+ <label class='column' for="LanguageCode">Language:</label>
+ <select id="LanguageCode" name="LanguageCode"><?php
+ $list = getLanguageList();
+ foreach( $list as $code => $name ) {
+ $sel = ($code == $conf->LanguageCode) ? 'selected="selected"' : '';
+ $encCode = htmlspecialchars( $code );
+ $encName = htmlspecialchars( $name );
+ echo "\n\t\t<option value=\"$encCode\" $sel>$encName</option>";
+ }
+ echo "\n";
+ ?>
+ </select>
+ </div>
+ <p class="config-desc">
+ Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
+ </p>
+
+ <div class="config-input">
+ <label class='column'>Copyright/license:</label>
+
+ <ul class="plain">
+ <li><?php aField( $conf, "License", "No license metadata", "radio", "none" ); ?></li>
+ <li><?php aField( $conf, "License", "Public Domain", "radio", "pd" ); ?></li>
+ <li><?php aField( $conf, "License", "GNU Free Documentation License 1.2", "radio", "gfdl1_2" ); ?></li>
+ <li><?php aField( $conf, "License", "GNU Free Documentation License 1.3", "radio", "gfdl1_3" ); ?></li>
+ <li><?php
+ aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
+ $partner = "MediaWiki";
+ $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+ $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/$script?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
+ $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
+ $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
+ print "<a href=\"$ccApp\" target='_blank'>choose</a>";
+ if( $conf->License == "cc" ) { ?>
+ <ul>
+ <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
+ <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
+ <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
+ <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
+ </ul>
+ <?php } ?>
+ </li>
+ </ul>
+ </div>
+ <p class="config-desc">
+ A notice, icon, and machine-readable copyright metadata will be displayed for the license you pick.
+ </p>
+
+
+ <div class="config-input">
+ <?php aField( $conf, "SysopName", "Admin username:" ) ?>
+ </div>
+ <div class="config-input">
+ <?php aField( $conf, "SysopPass", "Password:", "password" ) ?>
+ </div>
+ <div class="config-input">
+ <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
+ </div>
+ <p class="config-desc">
+ An admin can lock/delete pages, block users from editing, and do other maintenance tasks.<br />
+ A new account will be added only when creating a new wiki database.
+ <br /><br />
+ The password cannot be the same as the username.
+ </p>
+
+ <div class="config-input">
+ <label class='column'>Object caching:</label>
+
+ <ul class="plain">
+ <li><?php aField( $conf, "Shm", "No caching", "radio", "none" ); ?></li>
+ <?php
+ if( $conf->xcache ) {
+ echo "<li>";
+ aField( $conf, 'Shm', 'XCache', 'radio', 'xcache' );
+ echo "</li>\n";
+ }
+ if ( $conf->apc ) {
+ echo "<li>";
+ aField( $conf, "Shm", "APC", "radio", "apc" );
+ echo "</li>\n";
+ }
+ if ( $conf->eaccel ) {
+ echo "<li>";
+ aField( $conf, "Shm", "eAccelerator", "radio", "eaccel" );
+ echo "</li>\n";
+ }
+ if ( $conf->dba ) {
+ echo "<li>";
+ aField( $conf, "Shm", "DBA (not recommended)", "radio", "dba" );
+ echo "</li>";
+ }
+ ?>
+ <li><?php aField( $conf, "Shm", "Memcached", "radio", "memcached" ); ?></li>
+ </ul>
+ <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
+ </div>
+ <p class="config-desc">
+ An object caching system such as memcached will provide a significant performance boost,
+ but needs to be installed. Provide the server addresses and ports in a comma-separated list.
+ <br /><br />
+ MediaWiki can also detect and support eAccelerator, APC, and XCache, but
+ these should not be used if the wiki will be running on multiple application servers.
+ <br /><br />
+ DBA (Berkeley-style DB) is generally slower than using no cache at all, and is only
+ recommended for testing.
+ </p>
+</div>
+
+<h2>E-mail, e-mail notification and authentication setup</h2>
+
+<div class="config-section">
+ <div class="config-input">
+ <label class='column'>E-mail features (global):</label>
+ <ul class="plain">
+ <li><?php aField( $conf, "Email", "Enabled", "radio", "email_enabled" ); ?></li>
+ <li><?php aField( $conf, "Email", "Disabled", "radio", "email_disabled" ); ?></li>
+ </ul>
+ </div>
+ <p class="config-desc">
+ Use this to disable all e-mail functions (password reminders, user-to-user e-mail, and e-mail notifications)
+ if sending mail doesn't work on your server.
+ </p>
+
+ <div class="config-input">
+ <label class='column'>User-to-user e-mail:</label>
+ <ul class="plain">
+ <li><?php aField( $conf, "Emailuser", "Enabled", "radio", "emailuser_enabled" ); ?></li>
+ <li><?php aField( $conf, "Emailuser", "Disabled", "radio", "emailuser_disabled" ); ?></li>
+ </ul>
+ </div>
+ <p class="config-desc">
+ The user-to-user e-mail feature (Special:Emailuser) lets the wiki act as a relay to allow users to exchange e-mail without publicly advertising their e-mail address.
+ </p>
+ <div class="config-input">
+ <label class='column'>E-mail notification about changes:</label>
+ <ul class="plain">
+ <li><?php aField( $conf, "Enotif", "Disabled", "radio", "enotif_disabled" ); ?></li>
+ <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages only", "radio", "enotif_usertalk" ); ?></li>
+ <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages, and to pages on watchlists (not recommended for large wikis)", "radio", "enotif_allpages" ); ?></li>
+ </ul>
+ </div>
+ <div class="config-desc">
+ <p>
+ For this feature to work, an e-mail address must be present for the user account, and the notification
+ options in the user's preferences must be enabled. Also note the
+ authentication option below. When testing the feature, keep in mind that your own changes will never trigger notifications to be sent to yourself.</p>
+
+ <p>There are additional options for fine tuning in /includes/DefaultSettings.php; copy these to your LocalSettings.php and edit them there to change them.</p>
+ </div>
+
+ <div class="config-input">
+ <label class='column'>E-mail address authentication:</label>
+ <ul class="plain">
+ <li><?php aField( $conf, "Eauthent", "Disabled", "radio", "eauthent_disabled" ); ?></li>
+ <li><?php aField( $conf, "Eauthent", "Enabled", "radio", "eauthent_enabled" ); ?></li>
+ </ul>
+ </div>
+ <div class="config-desc">
+ <p>If this option is enabled, users have to confirm their e-mail address using a magic link sent to them whenever they set or change it, and only authenticated e-mail addresses can receive mails from other users and/or
+ change notification mails. Setting this option is <b>recommended</b> for public wikis because of potential abuse of the e-mail features above.</p>
+ </div>
+
+</div>
+
+<h2>Database config</h2>
+
+<div class="config-section">
+<div class="config-input">
+ <label class='column'>Database type:</label>
+<?php
+ if (isset($errs['DBpicktype'])) {
+ print "\t<span class='error'>" . htmlspecialchars( $errs['DBpicktype'] ) . "</span>\n";
+ }
+?>
+ <ul class='plain'><?php
+ database_picker($conf);
+ ?></ul>
+ </div>
+
+ <div id="db-server-settings1">
+ <div class="config-input" style="clear:left">
+ <?php aField( $conf, "DBserver", "Database host:" ); ?>
+ </div>
+ <p class="config-desc">
+ If your database server isn't on your web server, enter the name or IP address here.
+ </p>
+ </div>
+
+ <div class="config-input"><?php aField( $conf, "DBname", "Database name:" ); ?></div>
+ <div id="db-server-settings2">
+ <div class="config-input"><?php aField( $conf, "DBuser", "DB username:" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "DBpassword", "DB password:", "password" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "DBpassword2", "DB password confirm:", "password" ); ?></div>
+ <p class="config-desc">
+ If you only have a single user account and database available,
+ enter those here. If you have database root access (see below)
+ you can specify new accounts/databases to be created. This account
+ will not be created if it pre-exists. If this is the case, ensure that it
+ has SELECT, INSERT, UPDATE, and DELETE permissions on the MediaWiki database.
+ </p>
+
+ <div class="config-input">
+ <label class="column">Superuser account:</label>
+ <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?> />
+ &nbsp;<label for="useroot">Use superuser account</label>
+ </div>
+ <div class="config-input"><?php aField( $conf, "RootUser", "Superuser name:", "text" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "RootPW", "Superuser password:", "password" ); ?></div>
+
+ <p class="config-desc">
+ If the database user specified above does not exist, or does not have access to create
+ the database (if needed) or tables within it, please check the box and provide details
+ of a superuser account, such as <strong>root</strong>, which does.
+ </p>
+ </div>
+
+ <?php database_switcher('mysql'); ?>
+ <div class="config-input"><?php aField( $conf, "DBprefix", "Database table prefix:" ); ?></div>
+ <div class="config-desc">
+ <p>If you need to share one database between multiple wikis, or
+ between MediaWiki and another web application, you may choose to
+ add a prefix to all the table names to avoid conflicts.</p>
+
+ <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
+ </div>
+
+ <div class="config-input"><label class="column">Storage Engine</label>
+ <div>Select one:</div>
+ <ul class="plain">
+ <li><?php aField( $conf, "DBengine", "InnoDB", "radio", "InnoDB" ); ?></li>
+ <li><?php aField( $conf, "DBengine", "MyISAM", "radio", "MyISAM" ); ?></li>
+ </ul>
+ </div>
+ <p class="config-desc">
+ InnoDB is best for public web installations, since it has good concurrency
+ support. MyISAM may be faster in single-user installations. MyISAM databases
+ tend to get corrupted more often than InnoDB databases.
+ </p>
+ <div class="config-input"><label class="column">Database character set</label>
+ <div>Select one:</div>
+ <ul class="plain">
+ <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
+ <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
+ <li><?php aField( $conf, "DBschema", "MySQL 4.0 backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
+ </ul>
+ </div>
+ <p class="config-desc">
+ This option is ignored on upgrade, the same character set will be kept.
+ <br /><br />
+ <b>WARNING:</b> If you use <b>backwards-compatible UTF-8</b> on MySQL 4.1+, and subsequently back up the database with <tt>mysqldump</tt>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!.
+ <br /><br />
+ In <b>binary mode</b>, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. In <b>UTF-8 mode</b>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it won't let you store characters above the <a target="_blank" href="http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes">Basic Multilingual Plane</a>.
+ </p>
+ </fieldset>
+
+ <?php database_switcher('postgres'); ?>
+ <div class="config-input"><?php aField( $conf, "DBport", "Database port:" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "DBpgschema", "Schema for mediawiki:" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "DBts2schema", "Schema for tsearch2:" ); ?></div>
+ <div class="config-desc">
+ <p>The username specified above (at "DB username") will have its search path set to the above schemas,
+ so it is recommended that you create a new user. The above schemas are generally correct:
+ only change them if you are sure you need to.</p>
+ </div>
+ </fieldset>
+
+ <?php database_switcher('sqlite'); ?>
+ <div class="config-input"><?php
+ aField( $conf, "SQLiteDataDir", "SQLite data directory:" );
+ ?></div>
+ <div class="config-desc">
+ <p>SQLite stores table data into files in the
+ filesystem.</p>
+
+ <p>This directory must exist and be writable by the web server.</p>
+ </div>
+ </fieldset>
+
+ <?php database_switcher('mssql'); ?>
+ <div class="config-input"><?php
+ aField( $conf, "DBprefix2", "Database table prefix:" );
+ ?></div>
+ <div class="config-desc">
+ <p>If you need to share one database between multiple wikis, or
+ between MediaWiki and another web application, you may choose to
+ add a prefix to all the table names to avoid conflicts.</p>
+
+ <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
+ </div>
+ </fieldset>
+
+ <?php database_switcher('ibm_db2'); ?>
+ <div class="config-input"><?php
+ aField( $conf, "DBport_db2", "Database port:" );
+ ?></div>
+ <div class="config-input"><?php
+ aField( $conf, "DBdb2schema", "Schema for mediawiki:" );
+ ?></div>
+ <div>Select one:</div>
+ <ul class="plain">
+ <li><?php aField( $conf, "DBcataloged", "Cataloged (DB2 installed locally)", "radio", "cataloged" ); ?></li>
+ <li><?php aField( $conf, "DBcataloged", "Uncataloged (remote DB2 through ODBC)", "radio", "uncataloged" ); ?></li>
+ </ul>
+ <div class="config-desc">
+ <p>If you need to share one database between multiple wikis, or
+ between MediaWiki and another web application, you may specify
+ a different schema to avoid conflicts.</p>
+ </div>
+ </fieldset>
+
+ <?php database_switcher('oracle'); ?>
+ <div class="config-input"><?php aField( $conf, "DBprefix_ora", "Database table prefix:" ); ?></div>
+ <div class="config-desc">
+ <p>If you need to share one database between multiple wikis, or
+ between MediaWiki and another web application, you may choose to
+ add a prefix to all the table names to avoid conflicts.</p>
+
+ <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
+ </div>
+ <div class="config-input"><?php aField( $conf, "DBdefTS_ora", "Default tablespace:" ); ?></div>
+ <div class="config-input"><?php aField( $conf, "DBtempTS_ora", "Temporary tablespace:" ); ?></div>
+ </fieldset>
+
+ <div class="config-input" style="padding:2em 0 3em">
+ <label class='column'>&nbsp;</label>
+ <input type="submit" value="Install MediaWiki!" class="btn-install" />
+ </div>
+</div>
+</form>
+<script type="text/javascript">
+window.onload = toggleDBarea( <?php echo Xml::encodeJsVar( $conf->DBtype ); ?>,
+<?php
+ ## If they passed in a root user name, don't populate it on page load
+ echo strlen(importPost('RootUser', '')) ? 0 : 1;
+?>);
+</script>
+<?php
+}
+
+/* -------------------------------------------------------------------------------------- */
+function writeSuccessMessage() {
+ $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+ if ( wfIniGetBool( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
+ echo <<<HTML
+<div class="success-box">
+<p>Installation successful!</p>
+<p>To complete the installation, please do the following:
+<ol>
+ <li>Download config/LocalSettings.php with your FTP client or file manager</li>
+ <li>Upload it to the parent directory</li>
+ <li>Delete config/LocalSettings.php</li>
+ <li>Start using <a href='../$script'>your wiki</a>!
+</ol>
+<p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
+remotely. LocalSettings.php is currently owned by the user your webserver is running under,
+which means that anyone on the same server can read your database password! Downloading
+it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
+</div>
+HTML;
+ } else {
+ echo <<<HTML
+<div class="success-box">
+<p>
+<span class="success-message">Installation successful!</span>
+Move the <tt>config/LocalSettings.php</tt> file to the parent directory, then follow
+<a href="../$script"> this link</a> to your wiki.</p>
+<p>You should change file permissions for <tt>LocalSettings.php</tt> as required to
+prevent other users on the server reading passwords and altering configuration data.</p>
+</div>
+HTML;
+ }
+}
+
+
+function escapePhpString( $string ) {
+ if ( is_array( $string ) || is_object( $string ) ) {
+ return false;
+ }
+ return strtr( $string,
+ array(
+ "\n" => "\\n",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ "\\" => "\\\\",
+ "\$" => "\\\$",
+ "\"" => "\\\""
+ ));
+}
+
+function writeLocalSettings( $conf ) {
+ $conf->PasswordSender = $conf->EmergencyContact;
+ $magic = ($conf->ImageMagick ? "" : "# ");
+ $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
+ $rights = ($conf->RightsUrl) ? "" : "# ";
+ $hashedUploads = $conf->safeMode ? '' : '# ';
+ $dir = realpath( $conf->SQLiteDataDir );
+ if ( !$dir ) {
+ $dir = $conf->SQLiteDataDir; // dumb realpath sometimes fails
+ }
+ $sqliteDataDir = escapePhpString( $dir );
+
+ if ( $conf->ShellLocale ) {
+ $locale = '';
+ } else {
+ $locale = '# ';
+ $conf->ShellLocale = 'en_US.UTF-8';
+ }
+
+ switch ( $conf->Shm ) {
+ case 'memcached':
+ $cacheType = 'CACHE_MEMCACHED';
+ $mcservers = var_export( $conf->MCServerArray, true );
+ break;
+ case 'xcache':
+ case 'apc':
+ case 'eaccel':
+ $cacheType = 'CACHE_ACCEL';
+ $mcservers = 'array()';
+ break;
+ case 'dba':
+ $cacheType = 'CACHE_DBA';
+ $mcservers = 'array()';
+ break;
+ default:
+ $cacheType = 'CACHE_NONE';
+ $mcservers = 'array()';
+ }
+
+ if ( $conf->Email == 'email_enabled' ) {
+ $enableemail = 'true';
+ $enableuseremail = ( $conf->Emailuser == 'emailuser_enabled' ) ? 'true' : 'false' ;
+ $eauthent = ( $conf->Eauthent == 'eauthent_enabled' ) ? 'true' : 'false' ;
+ switch ( $conf->Enotif ) {
+ case 'enotif_usertalk':
+ $enotifusertalk = 'true';
+ $enotifwatchlist = 'false';
+ break;
+ case 'enotif_allpages':
+ $enotifusertalk = 'true';
+ $enotifwatchlist = 'true';
+ break;
+ default:
+ $enotifusertalk = 'false';
+ $enotifwatchlist = 'false';
+ }
+ } else {
+ $enableuseremail = 'false';
+ $enableemail = 'false';
+ $eauthent = 'false';
+ $enotifusertalk = 'false';
+ $enotifwatchlist = 'false';
+ }
+
+ $file = @fopen( "/dev/urandom", "r" );
+ if ( $file ) {
+ $secretKey = bin2hex( fread( $file, 32 ) );
+ fclose( $file );
+ } else {
+ $secretKey = "";
+ for ( $i=0; $i<8; $i++ ) {
+ $secretKey .= dechex(mt_rand(0, 0x7fffffff));
+ }
+ print "<li>Warning: \$wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.</li>\n";
+ }
+
+ # Add slashes to strings for double quoting
+ $slconf = wfArrayMap( "escapePhpString", get_object_vars( $conf ) );
+ if( $conf->License == 'gfdl1_2' || $conf->License == 'pd' || $conf->License == 'gfdl1_3' ) {
+ # Needs literal string interpolation for the current style path
+ $slconf['RightsIcon'] = $conf->RightsIcon;
+ }
+
+ if( $conf->DBtype == 'mysql' ) {
+ $dbsettings =
+"# MySQL specific settings
+\$wgDBprefix = \"{$slconf['DBprefix']}\";
+
+# MySQL table options to use during installation or update
+\$wgDBTableOptions = \"{$slconf['DBTableOptions']}\";
+
+# Experimental charset support for MySQL 4.1/5.0.
+\$wgDBmysql5 = {$conf->DBmysql5};";
+ } elseif( $conf->DBtype == 'postgres' ) {
+ $dbsettings =
+"# Postgres specific settings
+\$wgDBport = \"{$slconf['DBport']}\";
+\$wgDBmwschema = \"{$slconf['DBpgschema']}\";
+\$wgDBts2schema = \"{$slconf['DBts2schema']}\";";
+ } elseif( $conf->DBtype == 'sqlite' ) {
+ $dbsettings =
+"# SQLite-specific settings
+\$wgSQLiteDataDir = \"{$sqliteDataDir}\";";
+ } elseif( $conf->DBtype == 'mssql' ) {
+ $dbsettings =
+"# MSSQL specific settings
+\$wgDBprefix = \"{$slconf['DBprefix2']}\";";
+ } elseif( $conf->DBtype == 'ibm_db2' ) {
+ $dbsettings =
+"# DB2 specific settings
+\$wgDBport_db2 = \"{$slconf['DBport_db2']}\";
+\$wgDBmwschema = \"{$slconf['DBdb2schema']}\";
+\$wgDBcataloged = \"{$slconf['DBcataloged']}\";";
+ } elseif( $conf->DBtype == 'oracle' ) {
+ $dbsettings =
+"# Oracle specific settings
+\$wgDBprefix = \"{$slconf['DBprefix_ora']}\";";
+ } else {
+ // ummm... :D
+ $dbsettings = '';
+ }
+
+
+ $localsettings = "
+# This file was automatically generated by the MediaWiki installer.
+# If you make manual changes, please keep track in case you need to
+# recreate them later.
+#
+# See includes/DefaultSettings.php for all configurable settings
+# and their default values, but don't forget to make changes in _this_
+# file, not there.
+#
+# Further documentation for configuration settings may be found at:
+# http://www.mediawiki.org/wiki/Manual:Configuration_settings
+
+# If you customize your file layout, set \$IP to the directory that contains
+# the other MediaWiki files. It will be used as a base to locate files.
+if( defined( 'MW_INSTALL_PATH' ) ) {
+ \$IP = MW_INSTALL_PATH;
+} else {
+ \$IP = dirname( __FILE__ );
+}
+
+\$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
+set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
+
+require_once( \"\$IP/includes/DefaultSettings.php\" );
+
+if ( \$wgCommandLineMode ) {
+ if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
+ die( \"This script must be run from the command line\\n\" );
+ }
+}
+## Uncomment this to disable output compression
+# \$wgDisableOutputCompression = true;
+
+\$wgSitename = \"{$slconf['Sitename']}\";
+
+## The URL base path to the directory containing the wiki;
+## defaults for all runtime URL paths are based off of this.
+## For more information on customizing the URLs please see:
+## http://www.mediawiki.org/wiki/Manual:Short_URL
+\$wgScriptPath = \"{$slconf['ScriptPath']}\";
+\$wgScriptExtension = \"{$slconf['ScriptExtension']}\";
+
+## The relative URL path to the skins directory
+\$wgStylePath = \"\$wgScriptPath/skins\";
+
+## The relative URL path to the logo. Make sure you change this from the default,
+## or else you'll overwrite your logo when you upgrade!
+\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+
+## UPO means: this is also a user preference option
+
+\$wgEnableEmail = $enableemail;
+\$wgEnableUserEmail = $enableuseremail; # UPO
+
+\$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
+\$wgPasswordSender = \"{$slconf['PasswordSender']}\";
+
+\$wgEnotifUserTalk = $enotifusertalk; # UPO
+\$wgEnotifWatchlist = $enotifwatchlist; # UPO
+\$wgEmailAuthentication = $eauthent;
+
+## Database settings
+\$wgDBtype = \"{$slconf['DBtype']}\";
+\$wgDBserver = \"{$slconf['DBserver']}\";
+\$wgDBname = \"{$slconf['DBname']}\";
+\$wgDBuser = \"{$slconf['DBuser']}\";
+\$wgDBpassword = \"{$slconf['DBpassword']}\";
+
+{$dbsettings}
+
+## Shared memory settings
+\$wgMainCacheType = $cacheType;
+\$wgMemCachedServers = $mcservers;
+
+## To enable image uploads, make sure the 'images' directory
+## is writable, then set this to true:
+\$wgEnableUploads = false;
+{$magic}\$wgUseImageMagick = true;
+{$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
+
+## If you use ImageMagick (or any other shell command) on a
+## Linux server, this will need to be set to the name of an
+## available UTF-8 locale
+{$locale}\$wgShellLocale = \"{$slconf['ShellLocale']}\";
+
+## If you want to use image uploads under safe mode,
+## create the directories images/archive, images/thumb and
+## images/temp, and make them all writable. Then uncomment
+## this, if it's not already uncommented:
+{$hashedUploads}\$wgHashedUploadDirectory = false;
+
+## If you have the appropriate support software installed
+## you can enable inline LaTeX equations:
+\$wgUseTeX = false;
+
+## Set \$wgCacheDirectory to a writable directory on the web server
+## to make your wiki go slightly faster. The directory should not
+## be publically accessible from the web.
+#\$wgCacheDirectory = \"\$IP/cache\";
+
+\$wgLocalInterwiki = strtolower( \$wgSitename );
+
+\$wgLanguageCode = \"{$slconf['LanguageCode']}\";
+
+\$wgSecretKey = \"$secretKey\";
+
+## Default skin: you can change the default skin. Use the internal symbolic
+## names, ie 'vector', 'monobook':
+\$wgDefaultSkin = 'monobook';
+
+## For attaching licensing metadata to pages, and displaying an
+## appropriate copyright notice / icon. GNU Free Documentation
+## License and Creative Commons licenses are supported so far.
+{$rights}\$wgEnableCreativeCommonsRdf = true;
+\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
+\$wgRightsUrl = \"{$slconf['RightsUrl']}\";
+\$wgRightsText = \"{$slconf['RightsText']}\";
+\$wgRightsIcon = \"{$slconf['RightsIcon']}\";
+# \$wgRightsCode = \"{$slconf['RightsCode']}\"; # Not yet used
+
+\$wgDiff3 = \"{$slconf['diff3']}\";
+
+# When you make changes to this configuration file, this will make
+# sure that cached pages are cleared.
+\$wgCacheEpoch = max( \$wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
+"; ## End of setting the $localsettings string
+
+ // Keep things in Unix line endings internally;
+ // the system will write out as local text type.
+ return str_replace( "\r\n", "\n", $localsettings );
+}
+
+function dieout( $text ) {
+ global $mainListOpened;
+ if( $mainListOpened ) echo( "</ul>" );
+ if( $text != '' && substr( $text, 0, 2 ) != '<p' && substr( $text, 0, 2 ) != '<h' ){
+ echo "<p>$text</p>\n";
+ } else {
+ echo $text;
+ }
+ die( "\n\n</div>\n</div>\n</div>\n</div>\n</body>\n</html>" );
+}
+
+function importVar( &$var, $name, $default = "" ) {
+ if( isset( $var[$name] ) ) {
+ $retval = $var[$name];
+ if ( get_magic_quotes_gpc() ) {
+ $retval = stripslashes( $retval );
+ }
+ } else {
+ $retval = $default;
+ }
+ taint( $retval );
+ return $retval;
+}
+
+function importPost( $name, $default = "" ) {
+ return importVar( $_POST, $name, $default );
+}
+
+function importCheck( $name ) {
+ return isset( $_POST[$name] );
+}
+
+function importRequest( $name, $default = "" ) {
+ return importVar( $_REQUEST, $name, $default );
+}
+
+function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
+ static $radioCount = 0;
+ if( $type != "" ) {
+ $xtype = "type=\"$type\"";
+ } else {
+ $xtype = "";
+ }
+
+ $id = $field;
+ $nolabel = ($type == "radio") || ($type == "hidden");
+
+ if ($type == 'radio')
+ $id .= $radioCount++;
+
+ if( !$nolabel ) {
+ echo "<label class='column' for=\"$id\">$text</label>";
+ }
+
+ if( $type == "radio" && $value == $conf->$field ) {
+ $checked = "checked='checked'";
+ } else {
+ $checked = "";
+ }
+ echo "<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
+ if ($onclick) {
+ echo " onclick='toggleDBarea(\"$value\",1)' " ;
+ }
+ echo "value=\"";
+ if( $type == "radio" ) {
+ echo htmlspecialchars( $value );
+ } else {
+ echo htmlspecialchars( $conf->$field );
+ }
+
+
+ echo "\" />";
+ if( $nolabel ) {
+ echo "<label for=\"$id\">$text</label>";
+ }
+
+ global $errs;
+ if(isset($errs[$field])) {
+ echo "<span class='error'>" . htmlspecialchars( $errs[$field] ) . "</span>\n";
+ }
+}
+
+function getLanguageList() {
+ global $wgDummyLanguageCodes;
+
+ $codes = array();
+ foreach ( Language::getLanguageNames() as $code => $name ) {
+ if( in_array( $code, $wgDummyLanguageCodes ) ) continue;
+ $codes[$code] = $code . ' - ' . $name;
+ }
+ ksort( $codes );
+ return $codes;
+}
+
+#Check for location of an executable
+# @param string $loc single location to check
+# @param array $names filenames to check for.
+# @param mixed $versioninfo array of details to use when checking version, use false for no version checking
+function locate_executable($loc, $names, $versioninfo = false) {
+ if (!is_array($names))
+ $names = array($names);
+
+ foreach ($names as $name) {
+ $command = "$loc".DIRECTORY_SEPARATOR."$name";
+ if (@file_exists($command)) {
+ if (!$versioninfo)
+ return $command;
+
+ $file = str_replace('$1', $command, $versioninfo[0]);
+ if (strstr(`$file`, $versioninfo[1]) !== false)
+ return $command;
+ }
+ }
+ return false;
+}
+
+# Test a memcached server
+function testMemcachedServer( $server ) {
+ $hostport = explode(":", $server);
+ $errstr = false;
+ $fp = false;
+ if ( !function_exists( 'fsockopen' ) ) {
+ $errstr = "Can't connect to memcached, fsockopen() not present";
+ }
+ if ( !$errstr && count( $hostport ) != 2 ) {
+ $errstr = 'Please specify host and port';
+ }
+ if ( !$errstr ) {
+ list( $host, $port ) = $hostport;
+ $errno = 0;
+ $fsockerr = '';
+
+ $fp = @fsockopen( $host, $port, $errno, $fsockerr, 1.0 );
+ if ( $fp === false ) {
+ $errstr = "Cannot connect to memcached on $host:$port : $fsockerr";
+ }
+ }
+ if ( !$errstr ) {
+ $command = "version\r\n";
+ $bytes = fwrite( $fp, $command );
+ if ( $bytes != strlen( $command ) ) {
+ $errstr = "Cannot write to memcached socket on $host:$port";
+ }
+ }
+ if ( !$errstr ) {
+ $expected = "VERSION ";
+ $response = fread( $fp, strlen( $expected ) );
+ if ( $response != $expected ) {
+ $errstr = "Didn't get correct memcached response from $host:$port";
+ }
+ }
+ if ( $fp ) {
+ fclose( $fp );
+ }
+ if ( !$errstr ) {
+ echo "<li>Connected to memcached on " . htmlspecialchars( "$host:$port" ) ." successfully</li>";
+ }
+ return $errstr;
+}
+
+function database_picker($conf) {
+ global $ourdb;
+ print "\n";
+ foreach(array_keys($ourdb) as $db) {
+ if ($ourdb[$db]['havedriver']) {
+ print "\t<li>";
+ aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
+ print "</li>\n";
+ }
+ }
+ print "\n\t";
+}
+
+function database_switcher($db) {
+ global $ourdb;
+ $color = $ourdb[$db]['bgcolor'];
+ $full = $ourdb[$db]['fullname'];
+ print "<fieldset id='$db' style='clear:both'><legend>$full-specific options</legend>\n";
+}
+
+function printListItem( $item ) {
+ print "<li>$item</li>";
+}
+
+# Determine a suitable value for $wgShellLocale
+function getShellLocale( $wikiLang ) {
+ # Give up now if we're in safe mode or open_basedir
+ # It's theoretically possible but tricky to work with
+ if ( wfIniGetBool( "safe_mode" ) || ini_get( 'open_basedir' ) || !function_exists('exec') ) {
+ return false;
+ }
+
+ $os = php_uname( 's' );
+ $supported = array( 'Linux', 'SunOS', 'HP-UX' ); # Tested these
+ if ( !in_array( $os, $supported ) ) {
+ return false;
+ }
+
+ # Get a list of available locales
+ $lines = $ret = false;
+ exec( '/usr/bin/locale -a', $lines, $ret );
+ if ( $ret ) {
+ return false;
+ }
+
+ $lines = wfArrayMap( 'trim', $lines );
+ $candidatesByLocale = array();
+ $candidatesByLang = array();
+ foreach ( $lines as $line ) {
+ if ( $line === '' ) {
+ continue;
+ }
+ if ( !preg_match( '/^([a-zA-Z]+)(_[a-zA-Z]+|)\.(utf8|UTF-8)(@[a-zA-Z_]*|)$/i', $line, $m ) ) {
+ continue;
+ }
+ list( $all, $lang, $territory, $charset, $modifier ) = $m;
+ $candidatesByLocale[$m[0]] = $m;
+ $candidatesByLang[$lang][] = $m;
+ }
+
+ # Try the current value of LANG
+ if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+ return getenv( 'LANG' );
+ }
+
+ # Try the most common ones
+ $commonLocales = array( 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' );
+ foreach ( $commonLocales as $commonLocale ) {
+ if ( isset( $candidatesByLocale[$commonLocale] ) ) {
+ return $commonLocale;
+ }
+ }
+
+ # Is there an available locale in the Wiki's language?
+ if ( isset( $candidatesByLang[$wikiLang] ) ) {
+ $m = reset( $candidatesByLang[$wikiLang] );
+ return $m[0];
+ }
+
+ # Are there any at all?
+ if ( count( $candidatesByLocale ) ) {
+ $m = reset( $candidatesByLocale );
+ return $m[0];
+ }
+
+ # Give up
+ return false;
+}
+
+function wfArrayMap( $function, $input ) {
+ $ret = array_map( $function, $input );
+ foreach ( $ret as $key => $value ) {
+ $taint = istainted( $input[$key] );
+ if ( $taint ) {
+ taint( $ret[$key], $taint );
+ }
+ }
+ return $ret;
+}
+
+?>
+
+ <div class="license">
+ <hr/>
+ <p>This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.</p>
+
+ <p>This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.</p>
+
+ <p>You should have received <a href="../COPYING">a copy of the GNU General Public License</a>
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ or <a href="http://www.gnu.org/copyleft/gpl.html">read it online</a></p>
+ </div>
+
+</div></div></div>
+
+
+<div id="column-one">
+ <div class="portlet" id="p-logo">
+ <a style="background-image: url(../skins/common/images/mediawiki.png);"
+ href="../"
+ title="Main Page"></a>
+ </div>
+ <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
+ <div class='portlet'><div class='pBody'>
+ <ul>
+ <li><a href="../README">Readme</a></li>
+ <li><a href="../RELEASE-NOTES">Release notes</a></li>
+ <li><a href="../docs/">Documentation</a></li>
+ <li><a href="http://www.mediawiki.org/wiki/Help:Contents">User's Guide</a></li>
+ <li><a href="http://www.mediawiki.org/wiki/Manual:Contents">Administrator's Guide</a></li>
+ <li><a href="http://www.mediawiki.org/wiki/Manual:FAQ">FAQ</a></li>
+ </ul>
+ <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright © 2001-2009 by Magnus Manske, Brion Vibber,
+ Lee Daniel Crocker, Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason, Niklas Laxström,
+ Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor, Aaron Schulz and others.</p>
+ </div></div>
+</div>
+
+</div>
+
+</body>
+</html>
diff --git a/config/index.php b/config/index.php
index 85fdb86f..d913bbb1 100644
--- a/config/index.php
+++ b/config/index.php
@@ -19,13 +19,6 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# http://www.gnu.org/copyleft/gpl.html
-error_reporting( E_ALL );
-header( "Content-type: text/html; charset=utf-8" );
-@ini_set( "display_errors", true );
-
-# In case of errors, let output be clean.
-$wgRequestTime = microtime( true );
-
# Attempt to set up the include path, to fix problems with relative includes
$IP = dirname( dirname( __FILE__ ) );
define( 'MW_INSTALL_PATH', $IP );
@@ -34,2177 +27,17 @@ define( 'MW_INSTALL_PATH', $IP );
define( "MEDIAWIKI", true );
define( "MEDIAWIKI_INSTALL", true );
-// Run version checks before including other files
-// so people don't see a scary parse error.
-require_once( "$IP/install-utils.inc" );
-install_version_checks();
-
-require_once( "$IP/includes/Defines.php" );
-require_once( "$IP/includes/DefaultSettings.php" );
-require_once( "$IP/includes/AutoLoader.php" );
-require_once( "$IP/includes/MagicWord.php" );
-require_once( "$IP/includes/Namespace.php" );
-require_once( "$IP/includes/ProfilerStub.php" );
-require_once( "$IP/includes/GlobalFunctions.php" );
-require_once( "$IP/includes/Hooks.php" );
-require_once( "$IP/includes/Exception.php" );
-
-# If we get an exception, the user needs to know
-# all the details
-$wgShowExceptionDetails = true;
-$wgShowSQLErrors = true;
-wfInstallExceptionHandler();
-## Databases we support:
-
-$ourdb = array();
-$ourdb['mysql']['fullname'] = 'MySQL';
-$ourdb['mysql']['havedriver'] = 0;
-$ourdb['mysql']['compile'] = 'mysql';
-$ourdb['mysql']['bgcolor'] = '#ffe5a7';
-$ourdb['mysql']['rootuser'] = 'root';
-
-$ourdb['postgres']['fullname'] = 'PostgreSQL';
-$ourdb['postgres']['havedriver'] = 0;
-$ourdb['postgres']['compile'] = 'pgsql';
-$ourdb['postgres']['bgcolor'] = '#aaccff';
-$ourdb['postgres']['rootuser'] = 'postgres';
-
-$ourdb['sqlite']['fullname'] = 'SQLite';
-$ourdb['sqlite']['havedriver'] = 0;
-$ourdb['sqlite']['compile'] = 'pdo_sqlite';
-$ourdb['sqlite']['bgcolor'] = '#b1ebb1';
-$ourdb['sqlite']['rootuser'] = '';
-
-$ourdb['mssql']['fullname'] = 'MSSQL';
-$ourdb['mssql']['havedriver'] = 0;
-$ourdb['mssql']['compile'] = 'mssql not ready'; # Change to 'mssql' after includes/DatabaseMssql.php added;
-$ourdb['mssql']['bgcolor'] = '#ffc0cb';
-$ourdb['mssql']['rootuser'] = 'administrator';
-
-$ourdb['ibm_db2']['fullname'] = 'DB2';
-$ourdb['ibm_db2']['havedriver'] = 0;
-$ourdb['ibm_db2']['compile'] = 'ibm_db2';
-$ourdb['ibm_db2']['bgcolor'] = '#ffeba1';
-$ourdb['ibm_db2']['rootuser'] = 'db2admin';
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
-<head>
- <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
- <meta name="robots" content="noindex,nofollow"/>
- <title>MediaWiki <?php echo htmlspecialchars( $wgVersion ); ?> Installation</title>
- <style type="text/css">
-
- @import "../skins/monobook/main.css";
-
- .env-check {
- font-size: 90%;
- margin: 1em 0 1em 2.5em;
- }
-
- .config-section {
- margin-top: 2em;
- }
-
- .config-section label.column {
- clear: left;
- font-weight: bold;
- width: 13em;
- float: left;
- text-align: right;
- padding-right: 1em;
- padding-top: .2em;
- }
-
- .config-input {
- clear: left;
- zoom: 100%; /* IE hack */
- }
-
- .config-section .config-desc {
- clear: left;
- margin: 0 0 2em 18em;
- padding-top: 1em;
- font-size: 85%;
- }
-
- .iput-text, .iput-password {
- width: 14em;
- margin-right: 1em;
- }
-
- .error {
- color: red;
- background-color: #fff;
- font-weight: bold;
- left: 1em;
- font-size: 100%;
- }
-
- .error-top {
- color: red;
- background-color: #FFF0F0;
- border: 2px solid red;
- font-size: 130%;
- font-weight: bold;
- padding: 1em 1.5em;
- margin: 2em 0 1em;
- }
-
- ul.plain {
- list-style-type: none;
- list-style-image: none;
- float: left;
- margin: 0;
- padding: 0;
- }
-
- .btn-install {
- font-weight: bold;
- font-size: 110%;
- padding: .2em .3em;
- }
-
- .license {
- font-size: 85%;
- padding-top: 3em;
- }
-
- span.success-message {
- font-weight: bold;
- font-size: 110%;
- color: green;
- }
- .success-box {
- font-size: 130%;
- }
-
- </style>
- <script type="text/javascript">
- <!--
- function hideall() {
- <?php foreach (array_keys($ourdb) as $db) {
- echo "\n var i = document.getElementById('$db'); if (i) i.style.display='none';";
- }
- ?>
-
- }
- function toggleDBarea(id,defaultroot) {
- hideall();
- var dbarea = document.getElementById(id);
- if (dbarea) dbarea.style.display = (dbarea.style.display == 'none') ? 'block' : 'none';
- var db = document.getElementById('RootUser');
- if (defaultroot) {
-<?php foreach (array_keys($ourdb) as $db) {
- echo " if (id == '$db') { db.value = '".$ourdb[$db]['rootuser']."';}\n";
-}?>
- }
- }
- // -->
- </script>
-</head>
-
-<body>
-<div id="globalWrapper">
-<div id="column-content">
-<div id="content">
-<div id="bodyContent">
-
-<h1>MediaWiki <?php print htmlspecialchars( $wgVersion ) ?> Installation</h1>
-
-<?php
-$mainListOpened = false; # Is the main list (environement checking) opend ? Used by dieout
-
-/* Check for existing configurations and bug out! */
-
-if( file_exists( "../LocalSettings.php" ) ) {
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- dieout( "<p><strong>Setup has completed, <a href='../$script'>your wiki</a> is configured.</strong></p>
- <p>Please delete the /config directory for extra security.</p>" );
-}
-
-if( file_exists( "./LocalSettings.php" ) ) {
- writeSuccessMessage();
- dieout( '' );
-}
-
-if( !is_writable( "." ) ) {
- dieout( "<h2>Can't write config file, aborting</h2>
-
- <p>In order to configure the wiki you have to make the <tt>config</tt> subdirectory
- writable by the web server. Once configuration is done you'll move the created
- <tt>LocalSettings.php</tt> to the parent directory, and for added safety you can
- then remove the <tt>config</tt> subdirectory entirely.</p>
-
- <p>To make the directory writable on a Unix/Linux system:</p>
-
- <pre>
- cd <i>/path/to/wiki</i>
- chmod a+w config
- </pre>
-
- <p>Afterwards retry to start the <a href=\"\">setup</a>.</p>" );
-}
-
-
-require_once( "$IP/install-utils.inc" );
-require_once( "$IP/maintenance/updaters.inc" );
-
-class ConfigData {
- function getEncoded( $data ) {
- # removing latin1 support, no need...
- return $data;
- }
- function getSitename() { return $this->getEncoded( $this->Sitename ); }
- function getSysopName() { return $this->getEncoded( $this->SysopName ); }
- function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
-
- function setSchema( $schema, $engine ) {
- $this->DBschema = $schema;
- if ( !preg_match( '/^\w*$/', $engine ) ){
- $engine = 'InnoDB';
- }
- switch ( $this->DBschema ) {
- case 'mysql5':
- $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=utf8";
- $this->DBmysql5 = 'true';
- break;
- case 'mysql5-binary':
- $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=binary";
- $this->DBmysql5 = 'true';
- break;
- default:
- $this->DBTableOptions = "TYPE=$engine";
- $this->DBmysql5 = 'false';
- }
- $this->DBengine = $engine;
-
- # Set the global for use during install
- global $wgDBTableOptions;
- $wgDBTableOptions = $this->DBTableOptions;
- }
-}
-
-?>
-
-<ul>
- <li>
- <b>Don't forget security updates!</b> Keep an eye on the
- <a href="http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
- release announcements mailing list</a>.
- </li>
-</ul>
-
-
-<h2>Checking environment...</h2>
-<p><em>Please include all of the lines below when reporting installation problems.</em></p>
-<ul class="env-check">
-<?php
-$mainListOpened = true;
-
-$endl = "
-";
-define( 'MW_NO_OUTPUT_BUFFER', 1 );
-$conf = new ConfigData;
-
-install_version_checks();
-$self = 'Installer'; # Maintenance script name, to please Setup.php
-
-print "<li>PHP " . htmlspecialchars( phpversion() ) . " installed</li>\n";
-
-error_reporting( 0 );
-$phpdatabases = array();
-foreach (array_keys($ourdb) as $db) {
- $compname = $ourdb[$db]['compile'];
- if( extension_loaded( $compname ) || ( mw_have_dl() && dl( "{$compname}." . PHP_SHLIB_SUFFIX ) ) ) {
- array_push($phpdatabases, $db);
- $ourdb[$db]['havedriver'] = 1;
- }
-}
-error_reporting( E_ALL );
-
-if (!$phpdatabases) {
- print "Could not find a suitable database driver!<ul>";
- foreach (array_keys($ourdb) AS $db) {
- $comp = $ourdb[$db]['compile'];
- $full = $ourdb[$db]['fullname'];
- print "<li>For <b>$full</b>, compile PHP using <b>--with-$comp</b>, "
- ."or install the $comp.so module</li>\n";
- }
- echo '</ul>';
- dieout( '' );
-}
-
-print "<li>Found database drivers for:";
-$DefaultDBtype = '';
-foreach (array_keys($ourdb) AS $db) {
- if ($ourdb[$db]['havedriver']) {
- if ( $DefaultDBtype == '' ) {
- $DefaultDBtype = $db;
- }
- print " ".$ourdb[$db]['fullname'];
- }
-}
-print "</li>\n";
-
-if( wfIniGetBool( "register_globals" ) ) {
- ?>
- <li>
- <div style="font-size:110%">
- <strong class="error">Warning:</strong>
- <strong>PHP's <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
- </div>
- MediaWiki will work, but your server is more exposed to PHP-based security vulnerabilities.
- </li>
- <?php
-}
-
-$fatal = false;
-
-if( wfIniGetBool( "magic_quotes_runtime" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime'>magic_quotes_runtime</a> is active!</strong>
- This option corrupts data input unpredictably; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "magic_quotes_sybase" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.sybase.php#ini.magic-quotes-sybase'>magic_quotes_sybase</a> is active!</strong>
- This option corrupts data input unpredictably; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "mbstring.func_overload" ) ) {
- $fatal = true;
- ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload'>mbstring.func_overload</a> is active!</strong>
- This option causes errors and may corrupt data unpredictably;
- you cannot install or use MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-if( wfIniGetBool( "zend.ze1_compatibility_mode" ) ) {
- $fatal = true;
- ?><li class="error"><strong>Fatal: <a href="http://www.php.net/manual/en/ini.core.php">zend.ze1_compatibility_mode</a> is active!</strong>
- This option causes horrible bugs with MediaWiki; you cannot install or use
- MediaWiki unless this option is disabled.</li>
- <?php
-}
-
-
-if( $fatal ) {
- dieout( "Cannot install MediaWiki." );
-}
-
-if( wfIniGetBool( "safe_mode" ) ) {
- $conf->safeMode = true;
- ?>
- <li><b class='error'>Warning:</b> <strong>PHP's
- <a href='http://www.php.net/features.safe-mode'>safe mode</a> is active.</strong>
- You may have problems caused by this, particularly if using image uploads.
- </li>
- <?php
-} else {
- $conf->safeMode = false;
-}
-
-$sapi = htmlspecialchars( php_sapi_name() );
-print "<li>PHP server API is $sapi; ";
-$script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
-if( $wgUsePathInfo ) {
- print "ok, using pretty URLs (<tt>$script/Page_Title</tt>)";
-} else {
- print "using ugly URLs (<tt>$script?title=Page_Title</tt>)";
-}
-print "</li>\n";
-
-$conf->xml = function_exists( "utf8_encode" );
-if( $conf->xml ) {
- print "<li>Have XML / Latin1-UTF-8 conversion support.</li>\n";
-} else {
- dieout( "PHP's XML module is missing; the wiki requires functions in
- this module and won't work in this configuration.
- If you're running Mandrake, install the php-xml package." );
+# Check for PHP 5
+if ( !function_exists( 'version_compare' )
+ || version_compare( phpversion(), '5.0.0' ) < 0
+) {
+ define( 'MW_PHP4', '1' );
+ require( "$IP/includes/DefaultSettings.php" );
+ require( "$IP/includes/templates/PHP4.php" );
+ exit;
}
-# Check for session support
-if( !function_exists( 'session_name' ) )
- dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
-
-# session.save_path doesn't *have* to be set, but if it is, and it's
-# not valid/writable/etc. then it can cause problems
-$sessionSavePath = mw_get_session_save_path();
-$ssp = htmlspecialchars( $sessionSavePath );
-# Warn the user if it's not set, but let them proceed
-if( !$sessionSavePath ) {
- print "<li><strong>Warning:</strong> A value for <tt>session.save_path</tt>
- has not been set in PHP.ini. If the default value causes problems with
- saving session data, set it to a valid path which is read/write/execute
- for the user your web server is running under.</li>";
-} elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) {
- # All good? Let the user know
- print "<li>Session save path (<tt>{$ssp}</tt>) appears to be valid.</li>";
-} else {
- # Something not right? Warn the user, but let them proceed
- print "<li><strong>Warning:</strong> Your <tt>session.save_path</tt> value (<tt>{$ssp}</tt>)
- appears to be invalid or is not writable. PHP needs to be able to save data to
- this location for correct session operation.</li>";
-}
-
-# Check for PCRE support
-if( !function_exists( 'preg_match' ) )
- dieout( "The PCRE support module appears to be missing. MediaWiki requires the
- Perl-compatible regular expression functions." );
-
-$memlimit = ini_get( "memory_limit" );
-$conf->raiseMemory = false;
-if( empty( $memlimit ) || $memlimit == -1 ) {
- print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
-} else {
- print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". ";
- $n = intval( $memlimit );
- if( preg_match( '/^([0-9]+)[Mm]$/', trim( $memlimit ), $m ) ) {
- $n = intval( $m[1] * (1024*1024) );
- }
- if( $n < 20*1024*1024 ) {
- print "Attempting to raise limit to 20M... ";
- if( false === ini_set( "memory_limit", "20M" ) ) {
- print "failed.<br /><b>" . htmlspecialchars( $memlimit ) . " seems too low, installation may fail!</b>";
- } else {
- $conf->raiseMemory = true;
- print "ok.";
- }
- }
- print "</li>\n";
-}
-
-$conf->turck = function_exists( 'mmcache_get' );
-if ( $conf->turck ) {
- print "<li><a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache</a> installed</li>\n";
-}
-
-$conf->xcache = function_exists( 'xcache_get' );
-if( $conf->xcache )
- print "<li><a href=\"http://trac.lighttpd.net/xcache/\">XCache</a> installed</li>\n";
-
-$conf->apc = function_exists('apc_fetch');
-if ($conf->apc ) {
- print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>\n";
-}
-
-$conf->eaccel = function_exists( 'eaccelerator_get' );
-if ( $conf->eaccel ) {
- $conf->turck = 'eaccelerator';
- print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
-}
-
-$conf->dba = function_exists( 'dba_open' );
-
-if( !( $conf->turck || $conf->eaccel || $conf->apc || $conf->xcache ) ) {
- echo( '<li>Couldn\'t find <a href="http://turck-mmcache.sourceforge.net">Turck MMCache</a>,
- <a href="http://eaccelerator.sourceforge.net">eAccelerator</a>,
- <a href="http://www.php.net/apc">APC</a> or <a href="http://trac.lighttpd.net/xcache/">XCache</a>;
- cannot use these for object caching.</li>' );
-}
-
-$conf->diff3 = false;
-$diff3locations = array_merge(
- array(
- "/usr/bin",
- "/usr/local/bin",
- "/opt/csw/bin",
- "/usr/gnu/bin",
- "/usr/sfw/bin" ),
- explode( PATH_SEPARATOR, getenv( "PATH" ) ) );
-$diff3names = array( "gdiff3", "diff3", "diff3.exe" );
-
-$diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
-foreach ($diff3locations as $loc) {
- $exe = locate_executable($loc, $diff3names, $diff3versioninfo);
- if ($exe !== false) {
- $conf->diff3 = $exe;
- break;
- }
-}
-
-if ($conf->diff3)
- print "<li>Found GNU diff3: <tt>$conf->diff3</tt>.</li>";
-else
- print "<li>GNU diff3 not found.</li>";
-
-$conf->ImageMagick = false;
-$imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
-foreach( $imcheck as $dir ) {
- $im = "$dir/convert";
- if( @file_exists( $im ) ) {
- print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
- $conf->ImageMagick = $im;
- break;
- }
-}
-
-$conf->HaveGD = function_exists( "imagejpeg" );
-if( $conf->HaveGD ) {
- print "<li>Found GD graphics library built-in";
- if( !$conf->ImageMagick ) {
- print ", image thumbnailing will be enabled if you enable uploads";
- }
- print ".</li>\n";
-} else {
- if( !$conf->ImageMagick ) {
- print "<li>Couldn't find GD library or ImageMagick; image thumbnailing disabled.</li>\n";
- }
-}
-
-$conf->IP = dirname( dirname( __FILE__ ) );
-print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
-
-
-// PHP_SELF isn't available sometimes, such as when PHP is CGI but
-// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
-// to get the path to the current script... hopefully it's reliable. SIGH
-$path = ($_SERVER["PHP_SELF"] === '')
- ? $_SERVER["SCRIPT_NAME"]
- : $_SERVER["PHP_SELF"];
-
-$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
-print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
-
-
-
-// We may be installing from *.php5 extension file, if so, print message
-$conf->ScriptExtension = '.php';
-if (defined('MW_INSTALL_PHP5_EXT')) {
- $conf->ScriptExtension = '.php5';
- print "<li>Installing MediaWiki with <tt>php5</tt> file extensions</li>\n";
-} else {
- print "<li>Installing MediaWiki with <tt>php</tt> file extensions</li>\n";
-}
-
-
-print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
- $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
-
- $conf->Sitename = ucfirst( importPost( "Sitename", "" ) );
- $defaultEmail = empty( $_SERVER["SERVER_ADMIN"] )
- ? 'root@localhost'
- : $_SERVER["SERVER_ADMIN"];
- $conf->EmergencyContact = importPost( "EmergencyContact", $defaultEmail );
- $conf->DBtype = importPost( "DBtype", $DefaultDBtype );
- if ( !isset( $ourdb[$conf->DBtype] ) ) {
- $conf->DBtype = $DefaultDBtype;
- }
-
- $conf->DBserver = importPost( "DBserver", "localhost" );
- $conf->DBname = importPost( "DBname", "wikidb" );
- $conf->DBuser = importPost( "DBuser", "wikiuser" );
- $conf->DBpassword = importPost( "DBpassword" );
- $conf->DBpassword2 = importPost( "DBpassword2" );
- $conf->SysopName = importPost( "SysopName", "WikiSysop" );
- $conf->SysopPass = importPost( "SysopPass" );
- $conf->SysopPass2 = importPost( "SysopPass2" );
- $conf->RootUser = importPost( "RootUser", "root" );
- $conf->RootPW = importPost( "RootPW", "" );
- $useRoot = importCheck( 'useroot', false );
- $conf->LanguageCode = importPost( "LanguageCode", "en" );
- ## MySQL specific:
- $conf->DBprefix = importPost( "DBprefix" );
- $conf->setSchema(
- importPost( "DBschema", "mysql5-binary" ),
- importPost( "DBengine", "InnoDB" ) );
-
- ## Postgres specific:
- $conf->DBport = importPost( "DBport", "5432" );
- $conf->DBmwschema = importPost( "DBmwschema", "mediawiki" );
- $conf->DBts2schema = importPost( "DBts2schema", "public" );
-
- ## SQLite specific
- $conf->SQLiteDataDir = importPost( "SQLiteDataDir", "" );
-
- ## MSSQL specific
- // We need a second field so it doesn't overwrite the MySQL one
- $conf->DBprefix2 = importPost( "DBprefix2" );
-
- ## DB2 specific:
- // New variable in order to have a different default port number
- $conf->DBport_db2 = importPost( "DBport_db2", "50000" );
- $conf->DBmwschema = importPost( "DBmwschema", "mediawiki" );
- $conf->DBcataloged = importPost( "DBcataloged", "cataloged" );
-
- $conf->ShellLocale = getShellLocale( $conf->LanguageCode );
-
-/* Check for validity */
-$errs = array();
-
-if( preg_match( '/^$|^mediawiki$|#/i', $conf->Sitename ) ) {
- $errs["Sitename"] = "Must not be blank or \"MediaWiki\" and may not contain \"#\"";
-}
-if( $conf->DBuser == "" ) {
- $errs["DBuser"] = "Must not be blank";
-}
-if( ($conf->DBtype == 'mysql') && (strlen($conf->DBuser) > 16) ) {
- $errs["DBuser"] = "Username too long";
-}
-if( $conf->DBpassword == "" && $conf->DBtype != "postgres" ) {
- $errs["DBpassword"] = "Must not be blank";
-}
-if( $conf->DBpassword != $conf->DBpassword2 ) {
- $errs["DBpassword2"] = "Passwords don't match!";
-}
-if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
- $errs["DBprefix"] = "Invalid table prefix";
-} else {
- untaint( $conf->DBprefix, TC_MYSQL );
-}
-
-error_reporting( E_ALL );
-
-/**
- * Initialise $wgLang and $wgContLang to something so we can
- * call case-folding methods. Per Brion, this is English for
- * now, although we could be clever and initialise to the
- * user-selected language.
- */
-$wgContLang = Language::factory( 'en' );
-$wgLang = $wgContLang;
-
-/**
- * We're messing about with users, so we need a stub
- * authentication plugin...
- */
-$wgAuth = new AuthPlugin();
-
-/**
- * Validate the initial administrator account; username,
- * password checks, etc.
- */
-if( $conf->SysopName ) {
- # Check that the user can be created
- $u = User::newFromName( $conf->SysopName );
- if( is_a($u, 'User') ) { // please do not use instanceof, it breaks PHP4
- # Various password checks
- if( $conf->SysopPass != '' ) {
- if( $conf->SysopPass == $conf->SysopPass2 ) {
- if( !$u->isValidPassword( $conf->SysopPass ) ) {
- $errs['SysopPass'] = "Bad password";
- }
- } else {
- $errs['SysopPass2'] = "Passwords don't match";
- }
- } else {
- $errs['SysopPass'] = "Cannot be blank";
- }
- unset( $u );
- } else {
- $errs['SysopName'] = "Bad username";
- }
-}
-
-$conf->License = importRequest( "License", "none" );
-if( $conf->License == "gfdl1_2" ) {
- $conf->RightsUrl = "http://www.gnu.org/licenses/old-licenses/fdl-1.2.txt";
- $conf->RightsText = "GNU Free Documentation License 1.2";
- $conf->RightsCode = "gfdl1_2";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
-} elseif( $conf->License == "gfdl1_3" ) {
- $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
- $conf->RightsText = "GNU Free Documentation License 1.3";
- $conf->RightsCode = "gfdl1_3";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
-} elseif( $conf->License == "none" ) {
- $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
-} elseif( $conf->License == "pd" ) {
- $conf->RightsUrl = "http://creativecommons.org/licenses/publicdomain/";
- $conf->RightsText = "Public Domain";
- $conf->RightsCode = "pd";
- $conf->RightsIcon = '${wgScriptPath}/skins/common/images/public-domain.png';
-} else {
- $conf->RightsUrl = importRequest( "RightsUrl", "" );
- $conf->RightsText = importRequest( "RightsText", "" );
- $conf->RightsCode = importRequest( "RightsCode", "" );
- $conf->RightsIcon = importRequest( "RightsIcon", "" );
-}
-
-$conf->Shm = importRequest( "Shm", "none" );
-$conf->MCServers = importRequest( "MCServers" );
-
-/* Test memcached servers */
-
-if ( $conf->Shm == 'memcached' && $conf->MCServers ) {
- $conf->MCServerArray = wfArrayMap( 'trim', explode( ',', $conf->MCServers ) );
- foreach ( $conf->MCServerArray as $server ) {
- $error = testMemcachedServer( $server );
- if ( $error ) {
- $errs["MCServers"] = $error;
- break;
- }
- }
-} else if ( $conf->Shm == 'memcached' ) {
- $errs["MCServers"] = "Please specify at least one server if you wish to use memcached";
-}
-
-/* default values for installation */
-$conf->Email = importRequest("Email", "email_enabled");
-$conf->Emailuser = importRequest("Emailuser", "emailuser_enabled");
-$conf->Enotif = importRequest("Enotif", "enotif_allpages");
-$conf->Eauthent = importRequest("Eauthent", "eauthent_enabled");
-
-if( $conf->posted && ( 0 == count( $errs ) ) ) {
- do { /* So we can 'continue' to end prematurely */
- $conf->Root = ($conf->RootPW != "");
-
- /* Load up the settings and get installin' */
- $local = writeLocalSettings( $conf );
- echo "<li style=\"list-style: none\">\n";
- echo "<p><b>Generating configuration file...</b></p>\n";
- echo "</li>\n";
-
- $wgCommandLineMode = false;
- chdir( ".." );
- $ok = eval( $local );
- if( $ok === false ) {
- dieout( "<p>Errors in generated configuration; " .
- "most likely due to a bug in the installer... " .
- "Config file was: </p>" .
- "<pre>" .
- htmlspecialchars( $local ) .
- "</pre>" );
- }
- $conf->DBtypename = '';
- foreach (array_keys($ourdb) as $db) {
- if ($conf->DBtype === $db)
- $conf->DBtypename = $ourdb[$db]['fullname'];
- }
- if ( ! strlen($conf->DBtype)) {
- $errs["DBpicktype"] = "Please choose a database type";
- continue;
- }
-
- if (! $conf->DBtypename) {
- $errs["DBtype"] = "Unknown database type '$conf->DBtype'";
- continue;
- }
- print "<li>Database type: " . htmlspecialchars( $conf->DBtypename ) . "</li>\n";
- $dbclass = 'Database'.ucfirst($conf->DBtype);
- $wgDBtype = $conf->DBtype;
- $wgDBadminuser = "root";
- $wgDBadminpassword = $conf->RootPW;
-
- ## Mysql specific:
- $wgDBprefix = $conf->DBprefix;
-
- ## Postgres specific:
- $wgDBport = $conf->DBport;
- $wgDBmwschema = $conf->DBmwschema;
- $wgDBts2schema = $conf->DBts2schema;
-
- if( $conf->DBprefix2 != '' ) {
- // For MSSQL
- $wgDBprefix = $conf->DBprefix2;
- }
-
- ## DB2 specific:
- $wgDBcataloged = $conf->DBcataloged;
-
- $wgCommandLineMode = true;
- if (! defined ( 'STDERR' ) )
- define( 'STDERR', fopen("php://stderr", "wb"));
- $wgUseDatabaseMessages = false; /* FIXME: For database failure */
- require_once( "$IP/includes/Setup.php" );
- chdir( "config" );
-
- $wgTitle = Title::newFromText( "Installation script" );
- error_reporting( E_ALL );
- print "<li>Loading class: " . htmlspecialchars( $dbclass ) . "</li>\n";
- if ( $conf->DBtype != 'sqlite' ) {
- $dbc = new $dbclass;
- }
-
- if( $conf->DBtype == 'mysql' ) {
- $mysqlOldClient = version_compare( mysql_get_client_info(), "4.1.0", "lt" );
- if( $mysqlOldClient ) {
- print "<li><b>PHP is linked with old MySQL client libraries. If you are
- using a MySQL 4.1 server and have problems connecting to the database,
- see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
- >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
- }
- $ok = true; # Let's be optimistic
-
- # Decide if we're going to use the superuser or the regular database user
- $conf->Root = $useRoot;
- if( $conf->Root ) {
- $db_user = $conf->RootUser;
- $db_pass = $conf->RootPW;
- } else {
- $db_user = $wgDBuser;
- $db_pass = $wgDBpassword;
- }
-
- # Attempt to connect
- echo( "<li>Attempting to connect to database server as " . htmlspecialchars( $db_user ) . "..." );
- $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
-
- # Check the connection and respond to errors
- if( $wgDatabase->isOpen() ) {
- # Seems OK
- $ok = true;
- $wgDBadminuser = $db_user;
- $wgDBadminpassword = $db_pass;
- echo( "success.</li>\n" );
- $wgDatabase->ignoreErrors( true );
- $myver = $wgDatabase->getServerVersion();
- } else {
- # There were errors, report them and back out
- $ok = false;
- $errno = mysql_errno();
- $errtx = htmlspecialchars( mysql_error() );
- switch( $errno ) {
- case 1045:
- case 2000:
- echo( "failed due to authentication errors. Check passwords.</li>" );
- if( $conf->Root ) {
- # The superuser details are wrong
- $errs["RootUser"] = "Check username";
- $errs["RootPW"] = "and password";
- } else {
- # The regular user details are wrong
- $errs["DBuser"] = "Check username";
- $errs["DBpassword"] = "and password";
- }
- break;
- case 2002:
- case 2003:
- default:
- # General connection problem
- echo( htmlspecialchars( "failed with error [$errno] $errtx." ) . "</li>\n" );
- $errs["DBserver"] = "Connection failed";
- break;
- } # switch
- } #conn. att.
-
- if( !$ok ) { continue; }
- }
- else if( $conf->DBtype == 'ibm_db2' ) {
- if( $useRoot ) {
- $db_user = $conf->RootUser;
- $db_pass = $conf->RootPW;
- } else {
- $db_user = $wgDBuser;
- $db_pass = $wgDBpassword;
- }
-
- echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
- "\" as \"" . htmlspecialchars( $db_user ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $db_user, $db_pass, $wgDBname, 1);
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
-
- } elseif ( $conf->DBtype == 'sqlite' ) {
- if ("$wgSQLiteDataDir" == '') {
- $wgSQLiteDataDir = dirname($_SERVER['DOCUMENT_ROOT']).'/data';
- }
- echo "<li>Attempting to connect to SQLite database at \"" .
- htmlspecialchars( $wgSQLiteDataDir ) . "\"";
- if ( !is_dir( $wgSQLiteDataDir ) ) {
- if ( is_writable( dirname( $wgSQLiteDataDir ) ) ) {
- $ok = wfMkdirParents( $wgSQLiteDataDir, $wgSQLiteDataDirMode );
- } else {
- $ok = false;
- }
- if ( !$ok ) {
- echo ": cannot create data directory</li>";
- $errs['SQLiteDataDir'] = 'Enter a valid data directory';
- continue;
- }
- }
- if ( !is_writable( $wgSQLiteDataDir ) ) {
- echo ": data directory not writable</li>";
- $errs['SQLiteDataDir'] = 'Enter a writable data directory';
- continue;
- }
- $dataFile = "$wgSQLiteDataDir/$wgDBname.sqlite";
- if ( file_exists( $dataFile ) && !is_writable( $dataFile ) ) {
- echo ": data file not writable</li>";
- $errs['SQLiteDataDir'] = "$wgDBname.sqlite is not writable";
- continue;
- }
- $wgDatabase = new DatabaseSqlite( false, false, false, $wgDBname, 1 );
- if (!$wgDatabase->isOpen()) {
- print ": error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- $errs['SQLiteDataDir'] = 'Could not connect to database';
- continue;
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
- echo "ok</li>\n";
- } else { # not mysql
- error_reporting( E_ALL );
- $wgSuperUser = '';
- ## Possible connect as a superuser
- // Changed !mysql to postgres check since it seems to only apply to postgres
- if( $useRoot && $conf->DBtype == 'postgres' ) {
- $wgDBsuperuser = $conf->RootUser;
- echo( "<li>Attempting to connect to database \"postgres\" as superuser \"" .
- htmlspecialchars( $wgDBsuperuser ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- $errs["DBserver"] = "Could not connect to database as superuser";
- $errs["RootUser"] = "Check username";
- $errs["RootPW"] = "and password";
- continue;
- }
- $wgDatabase->initial_setup($conf->RootPW, 'postgres');
- }
- echo( "<li>Attempting to connect to database \"" . htmlspecialchars( $wgDBname ) .
- "\" as \"" . htmlspecialchars( $wgDBuser ) . "\"..." );
- $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
- if (!$wgDatabase->isOpen()) {
- print " error: " . htmlspecialchars( $wgDatabase->lastError() ) . "</li>\n";
- } else {
- $myver = $wgDatabase->getServerVersion();
- }
- if (is_callable(array($wgDatabase, 'initial_setup'))) $wgDatabase->initial_setup('', $wgDBname);
- }
-
- if ( !$wgDatabase->isOpen() ) {
- $errs["DBserver"] = "Couldn't connect to database";
- continue;
- }
-
- print "<li>Connected to " . htmlspecialchars( "{$conf->DBtype} $myver" );
- if ($conf->DBtype == 'mysql') {
- if( version_compare( $myver, "4.0.14" ) < 0 ) {
- print "</li>\n";
- dieout( "-- mysql 4.0.14 or later required. Aborting." );
- }
- $mysqlNewAuth = version_compare( $myver, "4.1.0", "ge" );
- if( $mysqlNewAuth && $mysqlOldClient ) {
- print "; <b class='error'>You are using MySQL 4.1 server, but PHP is linked
- to old client libraries; if you have trouble with authentication, see
- <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
- >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
- }
- if( $wgDBmysql5 ) {
- if( $mysqlNewAuth ) {
- print "; enabling MySQL 4.1/5.0 charset mode";
- } else {
- print "; <b class='error'>MySQL 4.1/5.0 charset mode enabled,
- but older version detected; will likely fail.</b>";
- }
- }
- print "</li>\n";
-
- @$sel = $wgDatabase->selectDB( $wgDBname );
- if( $sel ) {
- print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
- } else {
- $err = mysql_errno();
- $databaseSafe = htmlspecialchars( $wgDBname );
- if( $err == 1102 /* Invalid database name */ ) {
- print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
- continue;
- } elseif( $err != 1049 /* Database doesn't exist */ ) {
- print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
- print htmlspecialchars( mysql_error() ) . "</li></ul>";
- continue;
- }
- print "<li>Attempting to create database...</li>";
- $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
- if( !$res ) {
- print "<li>Couldn't create database <tt>" .
- htmlspecialchars( $wgDBname ) .
- "</tt>; try with root access or check your username/pass.</li>\n";
- $errs["RootPW"] = "&lt;- Enter";
- continue;
- }
- print "<li>Created database <tt>" . htmlspecialchars( $wgDBname ) . "</tt></li>\n";
- }
- $wgDatabase->selectDB( $wgDBname );
- }
- else if ($conf->DBtype == 'postgres') {
- if( version_compare( $myver, "8.0" ) < 0 ) {
- dieout( "<b>Postgres 8.0 or later is required</b>. Aborting." );
- }
- }
-
- if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
- print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
-
- if ( $conf->DBtype == 'mysql') {
- # Determine existing default character set
- if ( $wgDatabase->tableExists( "revision" ) ) {
- $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' );
- $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" );
- $row = $wgDatabase->fetchObject( $res );
- if ( !$row ) {
- echo "<li>SHOW TABLE STATUS query failed!</li>\n";
- $existingSchema = false;
- $existingEngine = false;
- } else {
- if ( preg_match( '/^latin1/', $row->Collation ) ) {
- $existingSchema = 'mysql4';
- } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
- $existingSchema = 'mysql5';
- } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
- $existingSchema = 'mysql5-binary';
- } else {
- $existingSchema = false;
- echo "<li><strong>Warning:</strong> Unrecognised existing collation</li>\n";
- }
- if ( isset( $row->Engine ) ) {
- $existingEngine = $row->Engine;
- } else {
- $existingEngine = $row->Type;
- }
- }
- if ( $existingSchema && $existingSchema != $conf->DBschema ) {
- $encExisting = htmlspecialchars( $existingSchema );
- $encRequested = htmlspecialchars( $conf->DBschema );
- print "<li><strong>Warning:</strong> you requested the $encRequested schema, " .
- "but the existing database has the $encExisting schema. This upgrade script ".
- "can't convert it, so it will remain $encExisting.</li>\n";
- $conf->setSchema( $existingSchema, $conf->DBengine );
- }
- if ( $existingEngine && $existingEngine != $conf->DBengine ) {
- $encExisting = htmlspecialchars( $existingEngine );
- $encRequested = htmlspecialchars( $conf->DBengine );
- print "<li><strong>Warning:</strong> you requested the $encRequested storage " .
- "engine, but the existing database uses the $encExisting engine. This upgrade " .
- "script can't convert it, so it will remain $encExisting.</li>\n";
- $conf->setSchema( $conf->DBschema, $existingEngine );
- }
- }
-
- # Create user if required
- if ( $conf->Root ) {
- $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
- if ( $conn->isOpen() ) {
- print "<li>DB user account ok</li>\n";
- $conn->close();
- } else {
- print "<li>Granting user permissions...";
- if( $mysqlOldClient && $mysqlNewAuth ) {
- print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
- }
- print "</li>\n";
- dbsource( "../maintenance/users.sql", $wgDatabase );
- }
- }
- }
- print "</ul><pre>\n";
- chdir( ".." );
- flush();
- do_all_updates();
- chdir( "config" );
- print "</pre>\n";
- print "<ul><li>Finished update checks.</li>\n";
- } else {
- # Determine available storage engines if possible
- if ( $conf->DBtype == 'mysql' && version_compare( $myver, "4.1.2", "ge" ) ) {
- $res = $wgDatabase->query( 'SHOW ENGINES' );
- $found = false;
- while ( $row = $wgDatabase->fetchObject( $res ) ) {
- if ( $row->Engine == $conf->DBengine ) {
- $found = true;
- break;
- }
- }
- $wgDatabase->freeResult( $res );
- if ( !$found && $conf->DBengine != 'MyISAM' ) {
- echo "<li><strong>Warning:</strong> " . htmlspecialchars( $conf->DBengine ) .
- " storage engine not available, " .
- "using MyISAM instead</li>\n";
- $conf->setSchema( $conf->DBschema, 'MyISAM' );
- }
- }
-
- # FIXME: Check for errors
- print "<li>Creating tables...";
- if ($conf->DBtype == 'mysql') {
- dbsource( "../maintenance/tables.sql", $wgDatabase );
- dbsource( "../maintenance/interwiki.sql", $wgDatabase );
- } elseif (is_callable(array($wgDatabase, 'setup_database'))) {
- $wgDatabase->setup_database();
- }
- else {
- $errs["DBtype"] = "Do not know how to handle database type '$conf->DBtype'";
- continue;
- }
-
- print " done.</li>\n";
-
- print "<li>Initializing statistics...</li>\n";
- $wgDatabase->insert( 'site_stats',
- array ( 'ss_row_id' => 1,
- 'ss_total_views' => 0,
- 'ss_total_edits' => 1, # Main page first edit
- 'ss_good_articles' => 0, # Main page is not a good article - no internal link
- 'ss_total_pages' => 1, # Main page
- 'ss_users' => $conf->SysopName ? 1 : 0, # Sysop account, if created
- 'ss_admins' => $conf->SysopName ? 1 : 0, # Sysop account, if created
- 'ss_images' => 0 ) );
-
- # Set up the "regular user" account *if we can, and if we need to*
- if( $conf->Root and $conf->DBtype == 'mysql') {
- # See if we need to
- $wgDatabase2 = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
- if( $wgDatabase2->isOpen() ) {
- # Nope, just close the test connection and continue
- $wgDatabase2->close();
- echo( "<li>User " . htmlspecialchars( $wgDBuser ) . " exists. Skipping grants.</li>\n" );
- } else {
- # Yes, so run the grants
- echo( "<li>" . htmlspecialchars( "Granting user permissions to $wgDBuser on $wgDBname..." ) );
- dbsource( "../maintenance/users.sql", $wgDatabase );
- echo( "success.</li>\n" );
- }
- }
-
- if( $conf->SysopName ) {
- $u = User::newFromName( $conf->getSysopName() );
- if ( !$u ) {
- print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
- }
- else if ( 0 == $u->idForName() ) {
- $u->addToDatabase();
- $u->setPassword( $conf->getSysopPass() );
- $u->saveSettings();
-
- $u->addGroup( "sysop" );
- $u->addGroup( "bureaucrat" );
-
- print "<li>Created sysop account <tt>" .
- htmlspecialchars( $conf->SysopName ) . "</tt>.</li>\n";
- } else {
- print "<li>Could not create user - already exists!</li>\n";
- }
- } else {
- print "<li>Skipped sysop account creation, no name given.</li>\n";
- }
-
- $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
- $article = new Article( $titleobj );
- $newid = $article->insertOn( $wgDatabase );
- $revision = new Revision( array(
- 'page' => $newid,
- 'text' => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsgNoTrans( 'mainpagedocfooter' ),
- 'comment' => '',
- 'user' => 0,
- 'user_text' => 'MediaWiki default',
- ) );
- $revid = $revision->insertOn( $wgDatabase );
- $article->updateRevisionOn( $wgDatabase, $revision );
- }
- // Now that all database work is done, make sure everything is committed
- $wgDatabase->commit();
-
- /* Write out the config file now that all is well */
- print "<li style=\"list-style: none\">\n";
- print "<p>Creating LocalSettings.php...</p>\n\n";
- $localSettings = "<" . "?php$endl$local";
- // Fix up a common line-ending problem (due to CVS on Windows)
- $localSettings = str_replace( "\r\n", "\n", $localSettings );
- $f = fopen( "LocalSettings.php", 'xt' );
-
- if( $f == false ) {
- print( "</li>\n" );
- dieout( "<p>Couldn't write out LocalSettings.php. Check that the directory permissions are correct and that there isn't already a file of that name here...</p>\n" .
- "<p>Here's the file that would have been written, try to paste it into place manually:</p>\n" .
- "<pre>\n" . htmlspecialchars( $localSettings ) . "</pre>\n" );
- }
- if(fwrite( $f, $localSettings ) ) {
- fclose( $f );
- print "<hr/>\n";
- writeSuccessMessage();
- print "</li>\n";
- } else {
- fclose( $f );
- dieout( "<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p></li>\n" );
- }
-
- } while( false );
-}
-
-print "</ul>\n";
-$mainListOpened = false;
-
-if( count( $errs ) ) {
- /* Display options form */
-
- if( $conf->posted ) {
- echo "<p class='error-top'>Something's not quite right yet; make sure everything below is filled out correctly.</p>\n";
- }
-?>
-
-<form action="<?php echo defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php'; ?>" name="config" method="post">
-
-<h2>Site config</h2>
-
-<div class="config-section">
- <div class="config-input">
- <?php aField( $conf, "Sitename", "Wiki name:" ); ?>
- </div>
- <p class="config-desc">
- Preferably a short word without punctuation, i.e. "Wikipedia".<br />
- Will appear as the namespace name for "meta" pages, and throughout the interface.
- </p>
- <div class="config-input"><?php aField( $conf, "EmergencyContact", "Contact e-mail:" ); ?></div>
- <p class="config-desc">
- Displayed to users in some error messages, used as the return address for password reminders, and used as the default sender address of e-mail notifications.
- </p>
-
- <div class="config-input">
- <label class='column' for="LanguageCode">Language:</label>
- <select id="LanguageCode" name="LanguageCode"><?php
- $list = getLanguageList();
- foreach( $list as $code => $name ) {
- $sel = ($code == $conf->LanguageCode) ? 'selected="selected"' : '';
- $encCode = htmlspecialchars( $code );
- $encName = htmlspecialchars( $name );
- echo "\n\t\t<option value=\"$encCode\" $sel>$encName</option>";
- }
- echo "\n";
- ?>
- </select>
- </div>
- <p class="config-desc">
- Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
- </p>
-
- <div class="config-input">
- <label class='column'>Copyright/license:</label>
-
- <ul class="plain">
- <li><?php aField( $conf, "License", "No license metadata", "radio", "none" ); ?></li>
- <li><?php aField( $conf, "License", "Public Domain", "radio", "pd" ); ?></li>
- <li><?php aField( $conf, "License", "GNU Free Documentation License 1.2 (Wikipedia-compatible)", "radio", "gfdl1_2" ); ?></li>
- <li><?php aField( $conf, "License", "GNU Free Documentation License 1.3", "radio", "gfdl1_3" ); ?></li>
- <li><?php
- aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
- $partner = "MediaWiki";
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/$script?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
- $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
- $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
- print "<a href=\"$ccApp\" target='_blank'>choose</a>";
- if( $conf->License == "cc" ) { ?>
- <ul>
- <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
- <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
- </ul>
- <?php } ?>
- </li>
- </ul>
- </div>
- <p class="config-desc">
- A notice, icon, and machine-readable copyright metadata will be displayed for the license you pick.
- </p>
-
-
- <div class="config-input">
- <?php aField( $conf, "SysopName", "Admin username:" ) ?>
- </div>
- <div class="config-input">
- <?php aField( $conf, "SysopPass", "Password:", "password" ) ?>
- </div>
- <div class="config-input">
- <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
- </div>
- <p class="config-desc">
- An admin can lock/delete pages, block users from editing, and do other maintenance tasks.<br />
- A new account will be added only when creating a new wiki database.
- <br /><br />
- The password cannot be the same as the username.
- </p>
-
- <div class="config-input">
- <label class='column'>Object caching:</label>
-
- <ul class="plain">
- <li><?php aField( $conf, "Shm", "No caching", "radio", "none" ); ?></li>
- <?php
- if ( $conf->turck ) {
- echo "<li>";
- aField( $conf, "Shm", "Turck MMCache", "radio", "turck" );
- echo "</li>\n";
- }
- if( $conf->xcache ) {
- echo "<li>";
- aField( $conf, 'Shm', 'XCache', 'radio', 'xcache' );
- echo "</li>\n";
- }
- if ( $conf->apc ) {
- echo "<li>";
- aField( $conf, "Shm", "APC", "radio", "apc" );
- echo "</li>\n";
- }
- if ( $conf->eaccel ) {
- echo "<li>";
- aField( $conf, "Shm", "eAccelerator", "radio", "eaccel" );
- echo "</li>\n";
- }
- if ( $conf->dba ) {
- echo "<li>";
- aField( $conf, "Shm", "DBA (not recommended)", "radio", "dba" );
- echo "</li>";
- }
- ?>
- <li><?php aField( $conf, "Shm", "Memcached", "radio", "memcached" ); ?></li>
- </ul>
- <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
- </div>
- <p class="config-desc">
- An object caching system such as memcached will provide a significant performance boost,
- but needs to be installed. Provide the server addresses and ports in a comma-separated list.
- <br /><br />
- MediaWiki can also detect and support eAccelerator, Turck MMCache, APC, and XCache, but
- these should not be used if the wiki will be running on multiple application servers.
- <br/><br/>
- DBA (Berkeley-style DB) is generally slower than using no cache at all, and is only
- recommended for testing.
- </p>
-</div>
-
-<h2>E-mail, e-mail notification and authentication setup</h2>
-
-<div class="config-section">
- <div class="config-input">
- <label class='column'>E-mail features (global):</label>
- <ul class="plain">
- <li><?php aField( $conf, "Email", "Enabled", "radio", "email_enabled" ); ?></li>
- <li><?php aField( $conf, "Email", "Disabled", "radio", "email_disabled" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- Use this to disable all e-mail functions (password reminders, user-to-user e-mail, and e-mail notifications)
- if sending mail doesn't work on your server.
- </p>
-
- <div class="config-input">
- <label class='column'>User-to-user e-mail:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Emailuser", "Enabled", "radio", "emailuser_enabled" ); ?></li>
- <li><?php aField( $conf, "Emailuser", "Disabled", "radio", "emailuser_disabled" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- The user-to-user e-mail feature (Special:Emailuser) lets the wiki act as a relay to allow users to exchange e-mail without publicly advertising their e-mail address.
- </p>
- <div class="config-input">
- <label class='column'>E-mail notification about changes:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Enotif", "Disabled", "radio", "enotif_disabled" ); ?></li>
- <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages only", "radio", "enotif_usertalk" ); ?></li>
- <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages, and to pages on watchlists (not recommended for large wikis)", "radio", "enotif_allpages" ); ?></li>
- </ul>
- </div>
- <div class="config-desc">
- <p>
- For this feature to work, an e-mail address must be present for the user account, and the notification
- options in the user's preferences must be enabled. Also note the
- authentication option below. When testing the feature, keep in mind that your own changes will never trigger notifications to be sent to yourself.</p>
-
- <p>There are additional options for fine tuning in /includes/DefaultSettings.php; copy these to your LocalSettings.php and edit them there to change them.</p>
- </div>
-
- <div class="config-input">
- <label class='column'>E-mail address authentication:</label>
- <ul class="plain">
- <li><?php aField( $conf, "Eauthent", "Disabled", "radio", "eauthent_disabled" ); ?></li>
- <li><?php aField( $conf, "Eauthent", "Enabled", "radio", "eauthent_enabled" ); ?></li>
- </ul>
- </div>
- <div class="config-desc">
- <p>If this option is enabled, users have to confirm their e-mail address using a magic link sent to them whenever they set or change it, and only authenticated e-mail addresses can receive mails from other users and/or
- change notification mails. Setting this option is <b>recommended</b> for public wikis because of potential abuse of the e-mail features above.</p>
- </div>
-
-</div>
-
-<h2>Database config</h2>
-
-<div class="config-section">
-<div class="config-input">
- <label class='column'>Database type:</label>
-<?php
- if (isset($errs['DBpicktype'])) {
- print "\t<span class='error'>" . htmlspecialchars( $errs['DBpicktype'] ) . "</span>\n";
- }
-?>
- <ul class='plain'><?php
- database_picker($conf);
- ?></ul>
- </div>
-
- <div class="config-input" style="clear:left">
- <?php aField( $conf, "DBserver", "Database host:" ); ?>
- </div>
- <p class="config-desc">
- If your database server isn't on your web server, enter the name or IP address here.
- </p>
-
- <div class="config-input"><?php aField( $conf, "DBname", "Database name:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBuser", "DB username:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBpassword", "DB password:", "password" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBpassword2", "DB password confirm:", "password" ); ?></div>
- <p class="config-desc">
- If you only have a single user account and database available,
- enter those here. If you have database root access (see below)
- you can specify new accounts/databases to be created. This account
- will not be created if it pre-exists. If this is the case, ensure that it
- has SELECT, INSERT, UPDATE, and DELETE permissions on the MediaWiki database.
- </p>
-
- <div class="config-input">
- <label class="column">Superuser account:</label>
- <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?> />
- &nbsp;<label for="useroot">Use superuser account</label>
- </div>
- <div class="config-input"><?php aField( $conf, "RootUser", "Superuser name:", "text" ); ?></div>
- <div class="config-input"><?php aField( $conf, "RootPW", "Superuser password:", "password" ); ?></div>
-
- <p class="config-desc">
- If the database user specified above does not exist, or does not have access to create
- the database (if needed) or tables within it, please check the box and provide details
- of a superuser account, such as <strong>root</strong>, which does.
- </p>
-
- <?php database_switcher('mysql'); ?>
- <div class="config-input"><?php aField( $conf, "DBprefix", "Database table prefix:" ); ?></div>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may choose to
- add a prefix to all the table names to avoid conflicts.</p>
-
- <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
- </div>
-
- <div class="config-input"><label class="column">Storage Engine</label>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBengine", "InnoDB", "radio", "InnoDB" ); ?></li>
- <li><?php aField( $conf, "DBengine", "MyISAM", "radio", "MyISAM" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- InnoDB is best for public web installations, since it has good concurrency
- support. MyISAM may be faster in single-user installations. MyISAM databases
- tend to get corrupted more often than InnoDB databases.
- </p>
- <div class="config-input"><label class="column">Database character set</label>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
- <li><?php aField( $conf, "DBschema", "MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
- <li><?php aField( $conf, "DBschema", "MySQL 4.0 backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
- </ul>
- </div>
- <p class="config-desc">
- This option is ignored on upgrade, the same character set will be kept.
- <br/><br/>
- <b>WARNING:</b> If you use <b>backwards-compatible UTF-8</b> on MySQL 4.1+, and subsequently back up the database with <tt>mysqldump</tt>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!.
- <br/><br/>
- In <b>binary mode</b>, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. In <b>UTF-8 mode</b>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it won't let you store characters above the <a target="_blank" href="http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes">Basic Multilingual Plane</a>.
- </p>
- </fieldset>
-
- <?php database_switcher('postgres'); ?>
- <div class="config-input"><?php aField( $conf, "DBport", "Database port:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBmwschema", "Schema for mediawiki:" ); ?></div>
- <div class="config-input"><?php aField( $conf, "DBts2schema", "Schema for tsearch2:" ); ?></div>
- <div class="config-desc">
- <p>The username specified above (at "DB username") will have its search path set to the above schemas,
- so it is recommended that you create a new user. The above schemas are generally correct:
- only change them if you are sure you need to.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('sqlite'); ?>
- <div class="config-desc">
- <b>NOTE:</b> SQLite only uses the <i>Database name</i> setting above, the user, password and root settings are ignored.
- </div>
- <div class="config-input"><?php
- aField( $conf, "SQLiteDataDir", "SQLite data directory:" );
- ?></div>
- <div class="config-desc">
- <p>SQLite stores table data into files in the filesystem.
- If you do not provide an explicit path, a "data" directory in
- the parent of your document root will be used.</p>
-
- <p>This directory must exist and be writable by the web server.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('mssql'); ?>
- <div class="config-input"><?php
- aField( $conf, "DBprefix2", "Database table prefix:" );
- ?></div>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may choose to
- add a prefix to all the table names to avoid conflicts.</p>
-
- <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
- </div>
- </fieldset>
-
- <?php database_switcher('ibm_db2'); ?>
- <div class="config-input"><?php
- aField( $conf, "DBport_db2", "Database port:" );
- ?></div>
- <div class="config-input"><?php
- aField( $conf, "DBmwschema", "Schema for mediawiki:" );
- ?></div>
- <div>Select one:</div>
- <ul class="plain">
- <li><?php aField( $conf, "DBcataloged", "Cataloged (DB2 installed locally)", "radio", "cataloged" ); ?></li>
- <li><?php aField( $conf, "DBcataloged", "Uncataloged (remote DB2 through ODBC)", "radio", "uncataloged" ); ?></li>
- </ul>
- <div class="config-desc">
- <p>If you need to share one database between multiple wikis, or
- between MediaWiki and another web application, you may specify
- a different schema to avoid conflicts.</p>
- </div>
- </fieldset>
-
- <div class="config-input" style="padding:2em 0 3em">
- <label class='column'>&nbsp;</label>
- <input type="submit" value="Install MediaWiki!" class="btn-install" />
- </div>
-</div>
-</form>
-<script type="text/javascript">
-window.onload = toggleDBarea( <?php echo Xml::encodeJsVar( $conf->DBtype ); ?>,
-<?php
- ## If they passed in a root user name, don't populate it on page load
- echo strlen(importPost('RootUser', '')) ? 0 : 1;
-?>);
-</script>
-<?php
-}
-
-/* -------------------------------------------------------------------------------------- */
-function writeSuccessMessage() {
- $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
- if ( wfIniGetBool( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
- echo <<<EOT
-<div class="success-box">
-<p>Installation successful!</p>
-<p>To complete the installation, please do the following:
-<ol>
- <li>Download config/LocalSettings.php with your FTP client or file manager</li>
- <li>Upload it to the parent directory</li>
- <li>Delete config/LocalSettings.php</li>
- <li>Start using <a href='../$script'>your wiki</a>!
-</ol>
-<p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
-remotely. LocalSettings.php is currently owned by the user your webserver is running under,
-which means that anyone on the same server can read your database password! Downloading
-it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
-</div>
-EOT;
- } else {
- echo <<<EOT
-<div class="success-box">
-<p>
-<span class="success-message">Installation successful!</span>
-Move the <tt>config/LocalSettings.php</tt> file to the parent directory, then follow
-<a href="../$script"> this link</a> to your wiki.</p>
-<p>You should change file permissions for <tt>LocalSettings.php</tt> as required to
-prevent other users on the server reading passwords and altering configuration data.</p>
-</div>
-EOT;
- }
-}
-
-
-function escapePhpString( $string ) {
- if ( is_array( $string ) || is_object( $string ) ) {
- return false;
- }
- return strtr( $string,
- array(
- "\n" => "\\n",
- "\r" => "\\r",
- "\t" => "\\t",
- "\\" => "\\\\",
- "\$" => "\\\$",
- "\"" => "\\\""
- ));
-}
-
-function writeLocalSettings( $conf ) {
- $conf->PasswordSender = $conf->EmergencyContact;
- $magic = ($conf->ImageMagick ? "" : "# ");
- $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
- $rights = ($conf->RightsUrl) ? "" : "# ";
- $hashedUploads = $conf->safeMode ? '' : '# ';
-
- if ( $conf->ShellLocale ) {
- $locale = '';
- } else {
- $locale = '# ';
- $conf->ShellLocale = 'en_US.UTF-8';
- }
-
- switch ( $conf->Shm ) {
- case 'memcached':
- $cacheType = 'CACHE_MEMCACHED';
- $mcservers = var_export( $conf->MCServerArray, true );
- break;
- case 'turck':
- case 'xcache':
- case 'apc':
- case 'eaccel':
- $cacheType = 'CACHE_ACCEL';
- $mcservers = 'array()';
- break;
- case 'dba':
- $cacheType = 'CACHE_DBA';
- $mcservers = 'array()';
- break;
- default:
- $cacheType = 'CACHE_NONE';
- $mcservers = 'array()';
- }
-
- if ( $conf->Email == 'email_enabled' ) {
- $enableemail = 'true';
- $enableuseremail = ( $conf->Emailuser == 'emailuser_enabled' ) ? 'true' : 'false' ;
- $eauthent = ( $conf->Eauthent == 'eauthent_enabled' ) ? 'true' : 'false' ;
- switch ( $conf->Enotif ) {
- case 'enotif_usertalk':
- $enotifusertalk = 'true';
- $enotifwatchlist = 'false';
- break;
- case 'enotif_allpages':
- $enotifusertalk = 'true';
- $enotifwatchlist = 'true';
- break;
- default:
- $enotifusertalk = 'false';
- $enotifwatchlist = 'false';
- }
- } else {
- $enableuseremail = 'false';
- $enableemail = 'false';
- $eauthent = 'false';
- $enotifusertalk = 'false';
- $enotifwatchlist = 'false';
- }
-
- $file = @fopen( "/dev/urandom", "r" );
- if ( $file ) {
- $secretKey = bin2hex( fread( $file, 32 ) );
- fclose( $file );
- } else {
- $secretKey = "";
- for ( $i=0; $i<8; $i++ ) {
- $secretKey .= dechex(mt_rand(0, 0x7fffffff));
- }
- print "<li>Warning: \$wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.</li>\n";
- }
-
- # Add slashes to strings for double quoting
- $slconf = wfArrayMap( "escapePhpString", get_object_vars( $conf ) );
- if( $conf->License == 'gfdl1_2' || $conf->License == 'pd' || $conf->License == 'gfdl1_3' ) {
- # Needs literal string interpolation for the current style path
- $slconf['RightsIcon'] = $conf->RightsIcon;
- }
-
- if( $conf->DBtype == 'mysql' ) {
- $dbsettings =
-"# MySQL specific settings
-\$wgDBprefix = \"{$slconf['DBprefix']}\";
-
-# MySQL table options to use during installation or update
-\$wgDBTableOptions = \"{$slconf['DBTableOptions']}\";
-
-# Experimental charset support for MySQL 4.1/5.0.
-\$wgDBmysql5 = {$conf->DBmysql5};";
- } elseif( $conf->DBtype == 'postgres' ) {
- $dbsettings =
-"# Postgres specific settings
-\$wgDBport = \"{$slconf['DBport']}\";
-\$wgDBmwschema = \"{$slconf['DBmwschema']}\";
-\$wgDBts2schema = \"{$slconf['DBts2schema']}\";";
- } elseif( $conf->DBtype == 'sqlite' ) {
- $dbsettings =
-"# SQLite-specific settings
-\$wgSQLiteDataDir = \"{$slconf['SQLiteDataDir']}\";";
- } elseif( $conf->DBtype == 'mssql' ) {
- $dbsettings =
-"# MSSQL specific settings
-\$wgDBprefix = \"{$slconf['DBprefix2']}\";";
- } elseif( $conf->DBtype == 'ibm_db2' ) {
- $dbsettings =
-"# DB2 specific settings
-\$wgDBport_db2 = \"{$slconf['DBport_db2']}\";
-\$wgDBmwschema = \"{$slconf['DBmwschema']}\";
-\$wgDBcataloged = \"{$slconf['DBcataloged']}\";";
- } else {
- // ummm... :D
- $dbsettings = '';
- }
-
-
- $localsettings = "
-# This file was automatically generated by the MediaWiki installer.
-# If you make manual changes, please keep track in case you need to
-# recreate them later.
-#
-# See includes/DefaultSettings.php for all configurable settings
-# and their default values, but don't forget to make changes in _this_
-# file, not there.
-#
-# Further documentation for configuration settings may be found at:
-# http://www.mediawiki.org/wiki/Manual:Configuration_settings
-
-# If you customize your file layout, set \$IP to the directory that contains
-# the other MediaWiki files. It will be used as a base to locate files.
-if( defined( 'MW_INSTALL_PATH' ) ) {
- \$IP = MW_INSTALL_PATH;
-} else {
- \$IP = dirname( __FILE__ );
-}
-
-\$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
-set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
-
-require_once( \"\$IP/includes/DefaultSettings.php\" );
-
-# If PHP's memory limit is very low, some operations may fail.
-" . ($conf->raiseMemory ? '' : '# ' ) . "ini_set( 'memory_limit', '20M' );" . "
-
-if ( \$wgCommandLineMode ) {
- if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
- die( \"This script must be run from the command line\\n\" );
- }
-}
-## Uncomment this to disable output compression
-# \$wgDisableOutputCompression = true;
-
-\$wgSitename = \"{$slconf['Sitename']}\";
-
-## The URL base path to the directory containing the wiki;
-## defaults for all runtime URL paths are based off of this.
-## For more information on customizing the URLs please see:
-## http://www.mediawiki.org/wiki/Manual:Short_URL
-\$wgScriptPath = \"{$slconf['ScriptPath']}\";
-\$wgScriptExtension = \"{$slconf['ScriptExtension']}\";
-
-## UPO means: this is also a user preference option
-
-\$wgEnableEmail = $enableemail;
-\$wgEnableUserEmail = $enableuseremail; # UPO
-
-\$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
-\$wgPasswordSender = \"{$slconf['PasswordSender']}\";
-
-\$wgEnotifUserTalk = $enotifusertalk; # UPO
-\$wgEnotifWatchlist = $enotifwatchlist; # UPO
-\$wgEmailAuthentication = $eauthent;
-
-## Database settings
-\$wgDBtype = \"{$slconf['DBtype']}\";
-\$wgDBserver = \"{$slconf['DBserver']}\";
-\$wgDBname = \"{$slconf['DBname']}\";
-\$wgDBuser = \"{$slconf['DBuser']}\";
-\$wgDBpassword = \"{$slconf['DBpassword']}\";
-
-{$dbsettings}
-
-## Shared memory settings
-\$wgMainCacheType = $cacheType;
-\$wgMemCachedServers = $mcservers;
-
-## To enable image uploads, make sure the 'images' directory
-## is writable, then set this to true:
-\$wgEnableUploads = false;
-{$magic}\$wgUseImageMagick = true;
-{$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
-
-## If you use ImageMagick (or any other shell command) on a
-## Linux server, this will need to be set to the name of an
-## available UTF-8 locale
-{$locale}\$wgShellLocale = \"{$slconf['ShellLocale']}\";
-
-## If you want to use image uploads under safe mode,
-## create the directories images/archive, images/thumb and
-## images/temp, and make them all writable. Then uncomment
-## this, if it's not already uncommented:
-{$hashedUploads}\$wgHashedUploadDirectory = false;
-
-## If you have the appropriate support software installed
-## you can enable inline LaTeX equations:
-\$wgUseTeX = false;
-
-\$wgLocalInterwiki = strtolower( \$wgSitename );
-
-\$wgLanguageCode = \"{$slconf['LanguageCode']}\";
-
-\$wgSecretKey = \"$secretKey\";
-
-## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook':
-\$wgDefaultSkin = 'monobook';
-
-## For attaching licensing metadata to pages, and displaying an
-## appropriate copyright notice / icon. GNU Free Documentation
-## License and Creative Commons licenses are supported so far.
-{$rights}\$wgEnableCreativeCommonsRdf = true;
-\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
-\$wgRightsUrl = \"{$slconf['RightsUrl']}\";
-\$wgRightsText = \"{$slconf['RightsText']}\";
-\$wgRightsIcon = \"{$slconf['RightsIcon']}\";
-# \$wgRightsCode = \"{$slconf['RightsCode']}\"; # Not yet used
-
-\$wgDiff3 = \"{$slconf['diff3']}\";
-
-# When you make changes to this configuration file, this will make
-# sure that cached pages are cleared.
-\$wgCacheEpoch = max( \$wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
-"; ## End of setting the $localsettings string
-
- // Keep things in Unix line endings internally;
- // the system will write out as local text type.
- return str_replace( "\r\n", "\n", $localsettings );
-}
-
-function dieout( $text ) {
- global $mainListOpened;
- if( $mainListOpened ) echo( "</ul>" );
- if( $text != '' && substr( $text, 0, 2 ) != '<p' && substr( $text, 0, 2 ) != '<h' ){
- echo "<p>$text</p>\n";
- } else {
- echo $text;
- }
- die( "\n\n</div>\n</div>\n</div>\n</div>\n</body>\n</html>" );
-}
-
-function importVar( &$var, $name, $default = "" ) {
- if( isset( $var[$name] ) ) {
- $retval = $var[$name];
- if ( get_magic_quotes_gpc() ) {
- $retval = stripslashes( $retval );
- }
- } else {
- $retval = $default;
- }
- taint( $retval );
- return $retval;
-}
-
-function importPost( $name, $default = "" ) {
- return importVar( $_POST, $name, $default );
-}
-
-function importCheck( $name ) {
- return isset( $_POST[$name] );
-}
-
-function importRequest( $name, $default = "" ) {
- return importVar( $_REQUEST, $name, $default );
-}
-
-function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
- static $radioCount = 0;
- if( $type != "" ) {
- $xtype = "type=\"$type\"";
- } else {
- $xtype = "";
- }
-
- $id = $field;
- $nolabel = ($type == "radio") || ($type == "hidden");
-
- if ($type == 'radio')
- $id .= $radioCount++;
-
- if( !$nolabel ) {
- echo "<label class='column' for=\"$id\">$text</label>";
- }
-
- if( $type == "radio" && $value == $conf->$field ) {
- $checked = "checked='checked'";
- } else {
- $checked = "";
- }
- echo "<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
- if ($onclick) {
- echo " onclick='toggleDBarea(\"$value\",1)' " ;
- }
- echo "value=\"";
- if( $type == "radio" ) {
- echo htmlspecialchars( $value );
- } else {
- echo htmlspecialchars( $conf->$field );
- }
-
-
- echo "\" />";
- if( $nolabel ) {
- echo "<label for=\"$id\">$text</label>";
- }
-
- global $errs;
- if(isset($errs[$field])) {
- echo "<span class='error'>" . htmlspecialchars( $errs[$field] ) . "</span>\n";
- }
-}
-
-function getLanguageList() {
- global $wgLanguageNames, $IP;
- if( !isset( $wgLanguageNames ) ) {
- require_once( "$IP/languages/Names.php" );
- }
-
- $codes = array();
-
- $d = opendir( "../languages/messages" );
- /* In case we are called from the root directory */
- if (!$d)
- $d = opendir( "languages/messages");
- while( false !== ($f = readdir( $d ) ) ) {
- $m = array();
- if( preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
- $code = str_replace( '_', '-', strtolower( $m[1] ) );
- if( isset( $wgLanguageNames[$code] ) ) {
- $name = $code . ' - ' . $wgLanguageNames[$code];
- } else {
- $name = $code;
- }
- $codes[$code] = $name;
- }
- }
- closedir( $d );
- ksort( $codes );
- return $codes;
-}
-
-#Check for location of an executable
-# @param string $loc single location to check
-# @param array $names filenames to check for.
-# @param mixed $versioninfo array of details to use when checking version, use false for no version checking
-function locate_executable($loc, $names, $versioninfo = false) {
- if (!is_array($names))
- $names = array($names);
-
- foreach ($names as $name) {
- $command = "$loc".DIRECTORY_SEPARATOR."$name";
- if (@file_exists($command)) {
- if (!$versioninfo)
- return $command;
-
- $file = str_replace('$1', $command, $versioninfo[0]);
- if (strstr(`$file`, $versioninfo[1]) !== false)
- return $command;
- }
- }
- return false;
-}
-
-# Test a memcached server
-function testMemcachedServer( $server ) {
- $hostport = explode(":", $server);
- $errstr = false;
- $fp = false;
- if ( !function_exists( 'fsockopen' ) ) {
- $errstr = "Can't connect to memcached, fsockopen() not present";
- }
- if ( !$errstr && count( $hostport ) != 2 ) {
- $errstr = 'Please specify host and port';
- }
- if ( !$errstr ) {
- list( $host, $port ) = $hostport;
- $errno = 0;
- $fsockerr = '';
-
- $fp = @fsockopen( $host, $port, $errno, $fsockerr, 1.0 );
- if ( $fp === false ) {
- $errstr = "Cannot connect to memcached on $host:$port : $fsockerr";
- }
- }
- if ( !$errstr ) {
- $command = "version\r\n";
- $bytes = fwrite( $fp, $command );
- if ( $bytes != strlen( $command ) ) {
- $errstr = "Cannot write to memcached socket on $host:$port";
- }
- }
- if ( !$errstr ) {
- $expected = "VERSION ";
- $response = fread( $fp, strlen( $expected ) );
- if ( $response != $expected ) {
- $errstr = "Didn't get correct memcached response from $host:$port";
- }
- }
- if ( $fp ) {
- fclose( $fp );
- }
- if ( !$errstr ) {
- echo "<li>Connected to memcached on " . htmlspecialchars( "$host:$port" ) ." successfully</li>";
- }
- return $errstr;
-}
-
-function database_picker($conf) {
- global $ourdb;
- print "\n";
- foreach(array_keys($ourdb) as $db) {
- if ($ourdb[$db]['havedriver']) {
- print "\t<li>";
- aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
- print "</li>\n";
- }
- }
- print "\n\t";
-}
-
-function database_switcher($db) {
- global $ourdb;
- $color = $ourdb[$db]['bgcolor'];
- $full = $ourdb[$db]['fullname'];
- print "<fieldset id='$db'><legend>$full specific options</legend>\n";
-}
-
-function printListItem( $item ) {
- print "<li>$item</li>";
-}
-
-# Determine a suitable value for $wgShellLocale
-function getShellLocale( $wikiLang ) {
- # Give up now if we're in safe mode or open_basedir
- # It's theoretically possible but tricky to work with
- if ( wfIniGetBool( "safe_mode" ) || ini_get( 'open_basedir' ) ) {
- return false;
- }
-
- $os = php_uname( 's' );
- $supported = array( 'Linux', 'SunOS', 'HP-UX' ); # Tested these
- if ( !in_array( $os, $supported ) ) {
- return false;
- }
-
- # Get a list of available locales
- $lines = $ret = false;
- exec( '/usr/bin/locale -a', $lines, $ret );
- if ( $ret ) {
- return false;
- }
-
- $lines = wfArrayMap( 'trim', $lines );
- $candidatesByLocale = array();
- $candidatesByLang = array();
- foreach ( $lines as $line ) {
- if ( $line === '' ) {
- continue;
- }
- if ( !preg_match( '/^([a-zA-Z]+)(_[a-zA-Z]+|)\.(utf8|UTF-8)(@[a-zA-Z_]*|)$/i', $line, $m ) ) {
- continue;
- }
- list( $all, $lang, $territory, $charset, $modifier ) = $m;
- $candidatesByLocale[$m[0]] = $m;
- $candidatesByLang[$lang][] = $m;
- }
-
- # Try the current value of LANG
- if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
- return getenv( 'LANG' );
- }
-
- # Try the most common ones
- $commonLocales = array( 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' );
- foreach ( $commonLocales as $commonLocale ) {
- if ( isset( $candidatesByLocale[$commonLocale] ) ) {
- return $commonLocale;
- }
- }
-
- # Is there an available locale in the Wiki's language?
- if ( isset( $candidatesByLang[$wikiLang] ) ) {
- $m = reset( $candidatesByLang[$wikiLang] );
- return $m[0];
- }
-
- # Are there any at all?
- if ( count( $candidatesByLocale ) ) {
- $m = reset( $candidatesByLocale );
- return $m[0];
- }
-
- # Give up
- return false;
-}
-
-function wfArrayMap( $function, $input ) {
- $ret = array_map( $function, $input );
- foreach ( $ret as $key => $value ) {
- $taint = istainted( $input[$key] );
- if ( $taint ) {
- taint( $ret[$key], $taint );
- }
- }
- return $ret;
-}
-
-?>
-
- <div class="license">
- <hr/>
- <p>This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.</p>
-
- <p>This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.</p>
-
- <p>You should have received <a href="../COPYING">a copy of the GNU General Public License</a>
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- or <a href="http://www.gnu.org/copyleft/gpl.html">read it online</a></p>
- </div>
-
-</div></div></div>
-
-
-<div id="column-one">
- <div class="portlet" id="p-logo">
- <a style="background-image: url(../skins/common/images/mediawiki.png);"
- href="../"
- title="Main Page"></a>
- </div>
- <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
- <div class='portlet'><div class='pBody'>
- <ul>
- <li><a href="../README">Readme</a></li>
- <li><a href="../RELEASE-NOTES">Release notes</a></li>
- <li><a href="../docs/">Documentation</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Help:Contents">User's Guide</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Manual:Contents">Administrator's Guide</a></li>
- <li><a href="http://www.mediawiki.org/wiki/Manual:FAQ">FAQ</a></li>
- </ul>
- <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright © 2001-2009 by Magnus Manske, Brion Vibber,
- Lee Daniel Crocker, Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason, Niklas Laxström,
- Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor, Aaron Schulz and others.</p>
- </div></div>
-</div>
-
-</div>
-
-</body>
-</html>
+// Isolate the rest of the code so this file can die out cleanly
+// if we find we're running under PHP 4.x... We use PHP 5 syntax
+// which doesn't parse under 4.
+require( dirname( __FILE__ ) . "/Installer.php" );
diff --git a/config/index.php5 b/config/index.php5
index 1be08780..8e6ceda9 100644
--- a/config/index.php5
+++ b/config/index.php5
@@ -2,5 +2,3 @@
define('MW_INSTALL_PHP5_EXT', 1);
require './index.php';
-
-?>
diff --git a/docs/design.txt b/docs/design.txt
index d1904e1e..192e8c6a 100644
--- a/docs/design.txt
+++ b/docs/design.txt
@@ -56,7 +56,7 @@ Primary classes:
interface language is instantiated as $wgLang, and the local content
language as $wgContLang; be sure to use the *correct* language object
depending upon the circumstances.
- See also language.txt.
+ See also language.txt.
Parser
Class used to transform wikitext to html.
diff --git a/docs/distributors.txt b/docs/distributors.txt
new file mode 100644
index 00000000..5586df12
--- /dev/null
+++ b/docs/distributors.txt
@@ -0,0 +1,192 @@
+This document is intended to provide useful advice for parties seeking to
+redistribute MediaWiki to end users. It's targeted particularly at maintainers
+for Linux distributions, since it's been observed that distribution packages of
+MediaWiki often break. We've consistently had to recommend that users seeking
+support use official tarballs instead of their distribution's packages, and
+this often solves whatever problem the user is having. It would be nice if
+this could change.
+
+== Background: why web applications are different ==
+
+MediaWiki is intended to be usable on any web host that provides support for
+PHP and a database. Many users of low-end shared hosting have very limited
+access to their machine: often only FTP access to some subdirectory of the web
+root. Support for these users entails several restrictions, such as:
+
+ 1) We cannot require installation of any files outside the web root. Few of
+ our users have access to directories like /usr or /etc.
+ 2) We cannot require the ability to run any utility on the command line.
+ Many shared hosts have exec() and similar PHP functions disabled.
+ 3) We cannot assume that the software has write access anywhere useful. The
+ user account that MediaWiki (including its installer) runs under is often
+ different from the account the user used to upload the files, and we might be
+ restricted by PHP settings such as safe mode or open_basedir.
+ 4) We cannot assume that the software even has read access anywhere useful.
+ Many shared hosts run all users' web applications under the same user, so
+ they can't rely on Unix permissions, and must forbid reads to even standard
+ directories like /tmp lest users read each others' files.
+ 5) We cannot assume that the user has the ability to install or run any
+ programs not written as web-accessible PHP scripts.
+
+Since anything that works on cheap shared hosting will work if you have shell
+or root access too, MediaWiki's design is based around catering to the lowest
+common denominator. Although we support higher-end setups as well (like
+Wikipedia!), the way many things work by default is tailored toward shared
+hosting. These defaults are unconventional from the point of view of normal
+(non-web) applications -- they might conflict with distributors' policies, and
+they certainly aren't ideal for someone who's installing MediaWiki as root.
+
+== Directory structure ==
+
+Because of constraint (1) above, MediaWiki does not conform to normal
+Unix filesystem layout. Hopefully we'll offer direct support for standard
+layouts in the future, but for now *any change to the location of files is
+unsupported*. Moving things and leaving symlinks will *probably* not break
+anything, but it is *strongly* advised not to try any more intrusive changes to
+get MediaWiki to conform more closely to your filesystem hierarchy. Any such
+attempt will almost certainly result in unnecessary bugs.
+
+The standard recommended location to install MediaWiki, relative to the web
+root, is /w (so, e.g., /var/www/w). Rewrite rules can then be used to enable
+"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article. (This
+is the convention Wikipedia uses.) In theory, it should be possible to enable
+the appropriate rewrite rules by default, if you can reconfigure the web
+server, but you'd need to alter LocalSettings.php too. See
+<http://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
+
+If you really must mess around with the directory structure, note that the
+following files *must* all be web-accessible for MediaWiki to function
+correctly:
+
+ * api.php, img_auth.php, index.php, mwScriptLoader.php, opensearch_desc.php,
+ profileinfo.php, redirect.php, thumb.php, trackback.php. These are the entry
+ points for normal usage. This list may be incomplete and is subject to
+ change.
+ * config/index.php: Used for web-based installation (sets up the database,
+ prompts for the name of the wiki, etc.). No command-line installation is
+ currently available.
+ * images/: Used for uploaded files. This could be somewhere else if
+ $wgUploadDirectory and $wgUploadPath are changed appropriately.
+ * skins/*/: Subdirectories of skins/ contain CSS and JavaScript files that
+ must be accessible to web browsers. The PHP files and Skin.sample in skins/
+ don't need to be accessible. This could be somewhere else if
+ $wgStyleDirectory and $wgStylePath are changed appropriately.
+ * extensions/: Many extensions include CSS and JavaScript files in their
+ extensions directory, and will break if they aren't web-accessible. Some
+ extensions might theoretically provide additional entry points as well, at
+ least in principle.
+
+But all files should keep their position relative to the web-visible
+installation directory no matter what. If you must move includes/ somewhere in
+/usr/share, provide a symlink from /var/www/w. If you don't, you *will* break
+something. You have been warned.
+
+== Configuration ==
+
+MediaWiki is configured using LocalSettings.php. This is a PHP file that's
+generated when the user visits config/index.php to install the software, and
+which the user can edit by hand thereafter. It's just a plain old PHP file,
+and can contain any PHP statements. It usually sets global variables that are
+used for configuration, and includes files used by any extensions.
+
+Distributors cannot easily add extra statements to the autogenerated
+LocalSettings.php at the present time -- although hacking config/index.php
+would work. It would be nice if this situation could be improved.
+
+Some configuration options that distributors might be in a position to set
+intelligently:
+
+ * $wgEmergencyContact: An e-mail address that can be used to contact the wiki
+ administrator. By default, "wikiadmin@$wgServerName".
+ * $wgPasswordSender: The e-mail address to use when sending password e-mails.
+ By default, "MediaWiki Mail <apache@$wgServerName>".
+ * $wgSMTP: Can be configured to use SMTP for mail sending instead of PHP
+ mail().
+
+== Documentation ==
+
+MediaWiki's official documentation is split between two places: the source
+code, and <http://www.mediawiki.org/>. The source code documentation is written
+exclusively by developers, and so is likely to be reliable (at worst,
+outdated). However, it can be pretty sparse. mediawiki.org documentation is
+often much more thorough, but it's maintained by a wiki that's open to
+anonymous edits, so its quality is sometimes sketchy -- don't assume that
+anything there is officially endorsed!
+
+== Upstream ==
+
+MediaWiki is a project hosted and led by the Wikimedia Foundation, the
+not-for-profit charity that operates Wikipedia. Wikimedia employs the lead
+developer and several other paid developers, but commit access is given out
+liberally and there are multiple very active volunteer developers as well. A
+list of developers can be found at <http://www.mediawiki.org/wiki/Developers>.
+
+MediaWiki's bug tracker is at <https://bugzilla.wikimedia.org>. However, most
+developers follow the bug tracker little or not at all. The best place to
+post if you want to get developers' attention is the wikitech-l mailing list
+<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>. Posts to wikitech-l
+will inevitably be read by multiple experienced MediaWiki developers. There's
+also an active IRC chat at <irc://irc.freenode.net/mediawiki>, where there are
+usually several developers at reasonably busy times of day.
+
+Unfortunately, we don't have a very good system for patch review. Patches
+should be submitted on Bugzilla (as unified diffs produced with "svn diff"
+against the latest trunk revision), but many patches languish without review
+until they bitrot into uselessness. You might want to get a developer to
+commit to reviewing your patch before you put too much effort into it.
+Reasonably straightforward patches shouldn't be too hard to get accepted if
+there's an interested developer, however -- posting to Bugzilla and then
+dropping a note on wikitech-l if nobody responds is a good tactic.
+
+All redistributors of MediaWiki should be subscribed to mediawiki-announce
+<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>. It's
+extremely low-traffic, with an average of less than one post per month. All
+new releases are announced here, including critical security updates.
+
+== Useful software to install ==
+
+There are several other pieces of software that MediaWiki can make good use of.
+Distributors might choose to install these automatically with MediaWiki and
+perhaps configure it to use them (see Configuration section of this document):
+
+ * APC (Alternative PHP Cache), XCache, or similar: Will greatly speed up the
+ execution of MediaWiki, and all other PHP applications, at some cost in
+ memory usage. Will be used automatically for the most part.
+ * clamav: Can be used for virus scanning of uploaded files. Enable with
+ "$wgAntivirus = 'clamav';".
+ * DjVuLibre: Allows processing of DjVu files. To enable this, set
+ "$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
+ * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with "$wgUseTidy
+ = true;".
+ * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
+ it. PHP's GD can also be used, but ImageMagick is preferable.
+ * Squid: Can provide a drastic speedup and a major cut in resource
+ consumption, but enabling it may interfere with other applications. It might
+ be suitable for a separate mediawiki-squid package. For setup details, see:
+ <http://www.mediawiki.org/wiki/Manual:Squid_caching>
+ * rsvg or other SVG rasterizer: ImageMagick can be used for SVG support, but
+ is not ideal. Wikipedia (as of the time of this writing) uses rsvg. To
+ enable, set "$wgSVGConverter = 'rsvg';" (or other as appropriate).
+ * texvc: Included with MediaWiki. Instructions for compiling and
+ installing it are in the math/ directory.
+
+MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
+these are present in /usr/bin or some other reasonable location, they will be
+used automatically.
+
+MediaWiki also has a "job queue" that handles background processing. Because
+shared hosts often don't provide access to cron, the job queue is run on every
+page view by default. This means the background tasks aren't really done in
+the background. Busy wikis can set $wgJobRunRate to 0 and run
+maintenance/runJobs.php periodically out of cron. Distributors probably
+shouldn't set this up as a default, however, since the extra cron job is
+unnecessary overhead for a little-used wiki.
+
+== Web server configuration ==
+
+MediaWiki includes several .htaccess files to restrict access to some
+directories. If the web server is not configured to support these files, and
+the relevant directories haven't been moved someplace inaccessible anyway (e.g.
+symlinked in /usr/share with the web server configured to not follow symlinks),
+then it might be useful to deny web access to those directories in the web
+server's configuration.
diff --git a/docs/export-0.4.xsd b/docs/export-0.4.xsd
new file mode 100644
index 00000000..9ff39254
--- /dev/null
+++ b/docs/export-0.4.xsd
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.4.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.4/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.4/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.4/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have two titles differing only by case. -->
+ <!-- Not yet implemented as of MediaWiki 1.5 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/docs/export-demo.xml b/docs/export-demo.xml
index 1b4bd7cf..77b26a41 100644
--- a/docs/export-demo.xml
+++ b/docs/export-demo.xml
@@ -1,4 +1,4 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">
<!-- Optional global configuration info -->
<siteinfo>
@@ -49,6 +49,10 @@
<!-- Page ID numbers are kept across page moves, but may change -->
<!-- if a page is deleted and recreated. -->
<id>1</id>
+
+ <!-- Tag wether this article is a redirect -->
+ <!-- This corresponds to the page_is_redirect in the page table -->
+ <redirect />
<!-- If restricted, the ACL is listed here raw. -->
<restrictions>edit=sysop:move=sysop</restrictions>
@@ -112,4 +116,19 @@
</upload>
</page>
+<logitem>
+ <id>15</id>
+ <timestamp>2008-10-23T03:20:32Z</timestamp>
+ <contributor>
+ <username>Wikimedian</username>
+ <id>12345</id>
+ </contributor>
+ <comment>content was: 'I think this was a silly edit'</comment>
+ <type>delete</type>
+ <action>delete</action>
+ <logtitle>Silly page name</logtitle>
+ <params xml:space="preserve" />
+</logitem>
+
+
</mediawiki>
diff --git a/docs/hooks.txt b/docs/hooks.txt
index f973d6b8..174fb7d9 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -16,10 +16,10 @@ event
hook
A clump of code and data that should be run when an event happens. This can
be either a function and a chunk of data, or an object and a method.
-
+
hook function
The function part of a hook.
-
+
==Rationale==
Hooks allow us to decouple optionally-run code from code that is run for
@@ -54,21 +54,21 @@ email notification when an article is shown may add:
function showAnArticle($article) {
global $wgReverseTitle, $wgCapitalizeTitle, $wgNotifyArticle;
-
+
if ($wgReverseTitle) {
wfReverseTitle($article);
}
-
+
if ($wgCapitalizeTitle) {
wfCapitalizeTitle($article);
}
# code to actually show the article goes here
-
+
if ($wgNotifyArticle) {
wfNotifyArticleShow($article));
}
- }
+ }
Using a hook-running strategy, we can avoid having all this option-specific
stuff in our mainline code. Using hooks, the function becomes:
@@ -87,7 +87,7 @@ We've cleaned up the code here by removing clumps of weird, infrequently used
code and moving them off somewhere else. It's much easier for someone working
with this code to see what's _really_ going on, and make changes or fix bugs.
-In addition, we can take all the code that deals with the little-used
+In addition, we can take all the code that deals with the little-used
title-reversing options (say) and put it in one place. Instead of having little
title-reversing if-blocks spread all over the codebase in showAnArticle,
deleteAnArticle, exportArticle, etc., we can concentrate it all in an extension
@@ -116,8 +116,8 @@ Having all this code related to the title-reversion option in one place means
that it's easier to read and understand; you don't have to do a grep-find to see
where the $wgReverseTitle variable is used, say.
-If the code is well enough isolated, it can even be excluded when not used --
-making for some slight savings in memory and load-up performance at runtime.
+If the code is well enough isolated, it can even be excluded when not used --
+making for some slight savings in memory and load-up performance at runtime.
Admins who want to have all the reversed titles can add:
require_once('extensions/ReverseTitle.php');
@@ -162,7 +162,7 @@ would result in the following code being executed when 'EventName' happened:
$object->someMethod($param1, $param2)
# object with method and data
$object->someMethod($someData, $param1, $param2)
-
+
Note that when an object is the hook, and there's no specified method, the
default method called is 'onEventName'. For different events this would be
different: 'onArticleSave', 'onUserLogin', etc.
@@ -183,13 +183,13 @@ Hooks can return three possible values:
should be shown to the user
* false: the hook has successfully done the work necessary and the calling
function should skip
-
+
The last result would be for cases where the hook function replaces the main
functionality. For example, if you wanted to authenticate users to a custom
system (LDAP, another PHP program, whatever), you could do:
$wgHooks['UserLogin'][] = array('ldapLogin', $ldapServer);
-
+
function ldapLogin($username, $password) {
# log user into LDAP
return false;
@@ -199,7 +199,7 @@ Returning false makes less sense for events where the action is complete, and
will normally be ignored.
Note that none of the examples made use of create_function() as a way to
-attach a function to a hook. This is known to cause problems (notably with
+attach a function to a hook. This is known to cause problems (notably with
Special:Version), and should be avoided when at all possible.
==Using hooks==
@@ -207,7 +207,7 @@ Special:Version), and should be avoided when at all possible.
A calling function or method uses the wfRunHooks() function to run the hooks
related to a particular event, like so:
- class Article {
+ class Article {
# ...
function protect() {
global $wgUser;
@@ -217,7 +217,7 @@ related to a particular event, like so:
}
}
}
-
+
wfRunHooks() returns true if the calling function should continue processing
(the hooks ran OK, or there are no hooks to run), or false if it shouldn't (an
error occurred, or one of the hooks handled the action already). Checking the
@@ -270,7 +270,7 @@ is enabled ( $wgUseAjax = true; ).
'AlternateEdit': before checking if an user can edit a page and
before showing the edit form ( EditPage::edit() ). This is triggered
on &action=edit.
-$EditPage : the EditPage object
+$EditPage: the EditPage object
'APIAfterExecute': after calling the execute() method of an API module.
Use this to extend core API modules.
@@ -282,7 +282,7 @@ fail, returning an error message or an <edit result="Failure"> tag
if $resultArr was filled.
$EditPage : the EditPage object
$text : the new text of the article (has yet to be saved)
-$resultArr : data in this array will be added to the API result
+&$resultArr : data in this array will be added to the API result
'APIGetAllowedParams': use this hook to modify a module's parameters.
&$module: Module object
@@ -324,7 +324,8 @@ associated Revision object. In the hook, just add your callback to the
$tokenFunctions array and return true (returning false makes no sense)
$tokenFunctions: array(action => callback)
-'APIQueryRecentChangesTokens': use this hook to add custom tokens to list=recentchanges.
+'APIQueryRecentChangesTokens': use this hook to add custom tokens to
+list=recentchanges.
Every token has an action, which will be used in the rctoken parameter
and in the output (actiontoken="..."), and a callback function which
should return the token, or false if the user isn't allowed to obtain
@@ -335,10 +336,26 @@ associated RecentChange object. In the hook, just add your callback to the
$tokenFunctions array and return true (returning false makes no sense)
$tokenFunctions: array(action => callback)
-'ArticleAfterFetchContent': after fetching content of an article from the database
+'APIQueryUsersTokens': use this hook to add custom token to list=users.
+Every token has an action, which will be used in the ustoken parameter
+and in the output (actiontoken="..."), and a callback function which
+should return the token, or false if the user isn't allowed to obtain
+it. The prototype of the callback function is func($user) where $user
+is the User object. In the hook, just add your callback to the
+$tokenFunctions array and return true (returning false makes no sense)
+$tokenFunctions: array(action => callback)
+
+'ArticleAfterFetchContent': after fetching content of an article from
+the database
$article: the article (object) being loaded from the database
$content: the content (string) of the article
+'ArticleConfirmDelete': before writing the confirmation form for article
+ deletion
+$article: the article (object) being deleted
+$output: the OutputPage object ($wgOut)
+&$reason: the reason (string) the article is being deleted
+
'ArticleDelete': before an article is deleted
$article: the article (object) being deleted
$user: the user (object) deleting the article
@@ -352,18 +369,23 @@ $user: the user that deleted the article
$reason: the reason the article was deleted
$id: id of the article that was deleted
-'ArticleEditUpdateNewTalk': before updating user_newtalk when a user talk page was changed
+'ArticleEditUpdateNewTalk': before updating user_newtalk when a user talk page
+was changed
$article: article (object) of the user talk page
-'ArticleEditUpdates': when edit updates (mainly link tracking) are made when an article has been changed
+'ArticleEditUpdates': when edit updates (mainly link tracking) are made when an
+article has been changed
$article: the article (object)
-$editInfo: data holder that includes the parser output ($editInfo->output) for that page after the change
+$editInfo: data holder that includes the parser output ($editInfo->output) for
+that page after the change
$changed: bool for if the page was changed
-'ArticleEditUpdatesDeleteFromRecentchanges': before deleting old entries from recentchanges table, return false to not delete old entries
+'ArticleEditUpdatesDeleteFromRecentchanges': before deleting old entries from
+recentchanges table, return false to not delete old entries
$article: article (object) being modified
-'ArticleFromTitle': when creating an article object from a title object using Wiki::articleFromTitle()
+'ArticleFromTitle': when creating an article object from a title object using
+Wiki::articleFromTitle()
$title: title (object) used to create the article object
$article: article (object) that will be returned
@@ -380,7 +402,7 @@ $revision: New Revision of the article
'ArticleMergeComplete': after merging to article using Special:Mergehistory
$targetTitle: target title (object)
-$destTitle: destination title (object)
+$destTitle: destination title (object)
'ArticlePageDataAfter': after loading data of an article from the database
$article: article (object) whose data were loaded
@@ -404,7 +426,7 @@ $protect: boolean whether it was a protect or an unprotect
$reason: Reason for protect
$moveonly: boolean whether it was for move only or not
-'ArticlePurge': before executing "&action=purge"
+'ArticlePurge': before executing "&action=purge"
$article: article (object) to purge
'ArticleRevisionVisiblitySet': called when changing visibility of one or more
@@ -447,18 +469,22 @@ $baseRevId: the rev ID (or false) this edit was based on
$title: Title corresponding to the article restored
$create: Whether or not the restoration caused the page to be created
(i.e. it didn't exist before)
+$comment: The comment associated with the undeletion.
-'ArticleUpdateBeforeRedirect': After a page is updated (usually on save), before the user is redirected back to the page
+'ArticleUpdateBeforeRedirect': After a page is updated (usually on save),
+before the user is redirected back to the page
&$article: the article
&$sectionanchor: The section anchor link (e.g. "#overview" )
&$extraq: Extra query parameters which can be added via hooked functions
-'ArticleViewHeader': Before the parser cache is about to be tried for article viewing.
+'ArticleViewHeader': Before the parser cache is about to be tried for article
+viewing.
&$article: the article
&$pcache: whether to try the parser cache or not
&$outputDone: whether the output for this page finished or not
-'ArticleViewRedirect': before setting "Redirected from ..." subtitle when follwed an redirect
+'ArticleViewRedirect': before setting "Redirected from ..." subtitle when
+follwed an redirect
$article: target article (object)
'AuthPluginAutoCreate': Called when creating a local account for an user logged
@@ -484,9 +510,17 @@ rendered inline in wiki pages or galleries in category pages.
'BeforeGalleryFindFile': before an image is fetched for a gallery
&$gallery,: the gallery object
-&$nt: the image title
+&$nt: the image title
&$time: image timestamp
+'BeforeInitialize': before anything is initialized in performRequestForTitle()
+&$title: Title being used for request
+&$article: The associated Article object
+&$output: OutputPage object
+&$user: User
+$request: WebRequest object
+$mediaWiki: Mediawiki object
+
'BeforePageDisplay': Prior to outputting a page
&$out: OutputPage object
&$skin: Skin object
@@ -518,18 +552,21 @@ $user: the user who did the block (not the one being blocked)
'BookInformation': Before information output on Special:Booksources
$isbn: ISBN to show information for
$output: OutputPage object in use
-
+
'CategoryPageView': before viewing a categorypage in CategoryPage::view
$catpage: CategoryPage instance
'ChangesListInsertArticleLink': Override or augment link to article in RC list.
-&$this: ChangesList instance.
+&$changesList: ChangesList instance.
&$articlelink: HTML of link to article (already filled-in).
&$s: HTML of row that is being constructed.
&$rc: RecentChange instance.
$unpatrolled: Whether or not we are showing unpatrolled changes.
$watched: Whether or not the change is watched by the user.
+'ConfirmEmailComplete': Called after a user's email has been confirmed successfully
+$user: user (object) whose email is being confirmed
+
'ContribsPager::getQueryInfo': Before the contributions query is about to run
&$pager: Pager object for contributions
&queryInfo: The query for the contribs Pager
@@ -552,6 +589,9 @@ Return true to allow the normal editor to be used, or false
if implementing a custom editor, e.g. for a special namespace,
etc.
+'DatabaseOraclePostInit': Called after initialising an Oracle database
+&$db: the DatabaseOracle object
+
'NewDifferenceEngine': Called when a new DifferenceEngine object is made
$title: the diff page title (nullable)
&$oldId: the actual old Id to use in the diff
@@ -564,7 +604,8 @@ $diff: DifferenceEngine object that's calling
$oldRev: Revision object of the "old" revision (may be null/invalid)
$newRev: Revision object of the "new" revision
-'DisplayOldSubtitle': before creating subtitle when browsing old versions of an article
+'DisplayOldSubtitle': before creating subtitle when browsing old versions of
+an article
$article: article (object) being viewed
$oldid: oldid (int) being viewed
@@ -589,16 +630,27 @@ $summary: Edit summary for page
'EditFilterMerged': Post-section-merge edit filter
$editor: EditPage instance (object)
$text: content of the edit box
-$error: error message to return
+&$error: error message to return
$summary: Edit summary for page
-'EditFormPreloadText': Allows population of the edit form when creating new pages
+'EditFormPreloadText': Allows population of the edit form when creating
+new pages
&$text: Text to preload with
&$title: Title object representing the page being created
+'EditFormInitialText': Allows modifying the edit form when editing existing
+pages
+$editPage: EditPage object
+
'EditPage::attemptSave': called before an article is
saved, that is before insertNewArticle() is called
-&$editpage_Obj: the current EditPage object
+$editpage_Obj: the current EditPage object
+
+'EditPage::importFormData': allow extensions to read additional data
+posted in the form
+$editpage: EditPage instance
+$request: Webrequest
+return value is ignored (should always return true)
'EditPage::showEditForm:fields': allows injection of form field into e