diff options
1276 files changed, 191230 insertions, 107703 deletions
@@ -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; @@ -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 @@ -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 @@ -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; @@ -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: @@ -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 } ?> /> + <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'> </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"] = "<- 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 } ?> /> - <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'> </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 |