This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | #!/usr/bin/env php |
||
2 | <?php |
||
3 | /** |
||
4 | * Run all updaters. |
||
5 | * |
||
6 | * This is used when the database schema is modified and we need to apply patches. |
||
7 | * |
||
8 | * This program is free software; you can redistribute it and/or modify |
||
9 | * it under the terms of the GNU General Public License as published by |
||
10 | * the Free Software Foundation; either version 2 of the License, or |
||
11 | * (at your option) any later version. |
||
12 | * |
||
13 | * This program is distributed in the hope that it will be useful, |
||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
16 | * GNU General Public License for more details. |
||
17 | * |
||
18 | * You should have received a copy of the GNU General Public License along |
||
19 | * with this program; if not, write to the Free Software Foundation, Inc., |
||
20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||
21 | * http://www.gnu.org/copyleft/gpl.html |
||
22 | * |
||
23 | * @file |
||
24 | * @todo document |
||
25 | * @ingroup Maintenance |
||
26 | */ |
||
27 | |||
28 | require_once __DIR__ . '/Maintenance.php'; |
||
29 | |||
30 | /** |
||
31 | * Maintenance script to run database schema updates. |
||
32 | * |
||
33 | * @ingroup Maintenance |
||
34 | */ |
||
35 | class UpdateMediaWiki extends Maintenance { |
||
36 | function __construct() { |
||
37 | parent::__construct(); |
||
38 | $this->addDescription( 'MediaWiki database updater' ); |
||
39 | $this->addOption( 'skip-compat-checks', 'Skips compatibility checks, mostly for developers' ); |
||
40 | $this->addOption( 'quick', 'Skip 5 second countdown before starting' ); |
||
41 | $this->addOption( 'doshared', 'Also update shared tables' ); |
||
42 | $this->addOption( 'nopurge', 'Do not purge the objectcache table after updates' ); |
||
43 | $this->addOption( 'noschema', 'Only do the updates that are not done during schema updates' ); |
||
44 | $this->addOption( |
||
45 | 'schema', |
||
46 | 'Output SQL to do the schema updates instead of doing them. Works ' |
||
47 | . 'even when $wgAllowSchemaUpdates is false', |
||
48 | false, |
||
49 | true |
||
50 | ); |
||
51 | $this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' ); |
||
52 | $this->addOption( |
||
53 | 'skip-external-dependencies', |
||
54 | 'Skips checking whether external dependencies are up to date, mostly for developers' |
||
55 | ); |
||
56 | } |
||
57 | |||
58 | function getDbType() { |
||
59 | return Maintenance::DB_ADMIN; |
||
60 | } |
||
61 | |||
62 | function compatChecks() { |
||
63 | $minimumPcreVersion = Installer::MINIMUM_PCRE_VERSION; |
||
64 | |||
65 | list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 ); |
||
66 | if ( version_compare( $pcreVersion, $minimumPcreVersion, '<' ) ) { |
||
67 | $this->error( |
||
68 | "PCRE $minimumPcreVersion or later is required.\n" . |
||
69 | "Your PHP binary is linked with PCRE $pcreVersion.\n\n" . |
||
70 | "More information:\n" . |
||
71 | "https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE\n\n" . |
||
72 | "ABORTING.\n", |
||
73 | true ); |
||
74 | } |
||
75 | |||
76 | $test = new PhpXmlBugTester(); |
||
77 | if ( !$test->ok ) { |
||
78 | $this->error( |
||
79 | "Your system has a combination of PHP and libxml2 versions that is buggy\n" . |
||
80 | "and can cause hidden data corruption in MediaWiki and other web apps.\n" . |
||
81 | "Upgrade to libxml2 2.7.3 or later.\n" . |
||
82 | "ABORTING (see https://bugs.php.net/bug.php?id=45996).\n", |
||
83 | true ); |
||
84 | } |
||
85 | } |
||
86 | |||
87 | function execute() { |
||
88 | global $wgVersion, $wgLang, $wgAllowSchemaUpdates; |
||
89 | |||
90 | if ( !$wgAllowSchemaUpdates |
||
91 | && !( $this->hasOption( 'force' ) |
||
92 | || $this->hasOption( 'schema' ) |
||
93 | || $this->hasOption( 'noschema' ) ) |
||
94 | ) { |
||
95 | $this->error( "Do not run update.php on this wiki. If you're seeing this you should\n" |
||
96 | . "probably ask for some help in performing your schema updates or use\n" |
||
97 | . "the --noschema and --schema options to get an SQL file for someone\n" |
||
98 | . "else to inspect and run.\n\n" |
||
99 | . "If you know what you are doing, you can continue with --force\n", true ); |
||
100 | } |
||
101 | |||
102 | $this->fileHandle = null; |
||
103 | if ( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) { |
||
104 | $this->error( "The --schema option requires a file as an argument.\n", true ); |
||
105 | } elseif ( $this->hasOption( 'schema' ) ) { |
||
106 | $file = $this->getOption( 'schema' ); |
||
107 | $this->fileHandle = fopen( $file, "w" ); |
||
108 | if ( $this->fileHandle === false ) { |
||
109 | $err = error_get_last(); |
||
110 | $this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true ); |
||
111 | } |
||
112 | } |
||
113 | |||
114 | $lang = Language::factory( 'en' ); |
||
115 | // Set global language to ensure localised errors are in English (bug 20633) |
||
116 | RequestContext::getMain()->setLanguage( $lang ); |
||
117 | $wgLang = $lang; // BackCompat |
||
118 | |||
119 | define( 'MW_UPDATER', true ); |
||
120 | |||
121 | $this->output( "MediaWiki {$wgVersion} Updater\n\n" ); |
||
122 | |||
123 | wfWaitForSlaves(); |
||
124 | |||
125 | if ( !$this->hasOption( 'skip-compat-checks' ) ) { |
||
126 | $this->compatChecks(); |
||
127 | } else { |
||
128 | $this->output( "Skipping compatibility checks, proceed at your own risk (Ctrl+C to abort)\n" ); |
||
129 | wfCountDown( 5 ); |
||
130 | } |
||
131 | |||
132 | // Check external dependencies are up to date |
||
133 | if ( !$this->hasOption( 'skip-external-dependencies' ) ) { |
||
134 | $composerLockUpToDate = $this->runChild( 'CheckComposerLockUpToDate' ); |
||
135 | $composerLockUpToDate->execute(); |
||
136 | } else { |
||
137 | $this->output( |
||
138 | "Skipping checking whether external dependencies are up to date, proceed at your own risk\n" |
||
139 | ); |
||
140 | } |
||
141 | |||
142 | # Attempt to connect to the database as a privileged user |
||
143 | # This will vomit up an error if there are permissions problems |
||
144 | $db = $this->getDB( DB_MASTER ); |
||
145 | |||
146 | $this->output( "Going to run database updates for " . wfWikiID() . "\n" ); |
||
147 | if ( $db->getType() === 'sqlite' ) { |
||
148 | /** @var Database|DatabaseSqlite $db */ |
||
149 | $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" ); |
||
150 | } |
||
151 | $this->output( "Depending on the size of your database this may take a while!\n" ); |
||
152 | |||
153 | if ( !$this->hasOption( 'quick' ) ) { |
||
154 | $this->output( "Abort with control-c in the next five seconds " |
||
155 | . "(skip this countdown with --quick) ... " ); |
||
156 | wfCountDown( 5 ); |
||
157 | } |
||
158 | |||
159 | $time1 = microtime( true ); |
||
160 | |||
161 | $shared = $this->hasOption( 'doshared' ); |
||
162 | |||
163 | $updates = [ 'core', 'extensions' ]; |
||
164 | if ( !$this->hasOption( 'schema' ) ) { |
||
165 | if ( $this->hasOption( 'noschema' ) ) { |
||
166 | $updates[] = 'noschema'; |
||
167 | } |
||
168 | $updates[] = 'stats'; |
||
169 | } |
||
170 | |||
171 | $updater = DatabaseUpdater::newForDB( $db, $shared, $this ); |
||
0 ignored issues
–
show
|
|||
172 | $updater->doUpdates( $updates ); |
||
173 | |||
174 | foreach ( $updater->getPostDatabaseUpdateMaintenance() as $maint ) { |
||
175 | $child = $this->runChild( $maint ); |
||
176 | |||
177 | // LoggedUpdateMaintenance is checking the updatelog itself |
||
178 | $isLoggedUpdate = $child instanceof LoggedUpdateMaintenance; |
||
179 | |||
180 | if ( !$isLoggedUpdate && $updater->updateRowExists( $maint ) ) { |
||
181 | continue; |
||
182 | } |
||
183 | |||
184 | $child->execute(); |
||
185 | if ( !$isLoggedUpdate ) { |
||
186 | $updater->insertUpdateRow( $maint ); |
||
187 | } |
||
188 | } |
||
189 | |||
190 | $updater->setFileAccess(); |
||
191 | if ( !$this->hasOption( 'nopurge' ) ) { |
||
192 | $updater->purgeCache(); |
||
193 | } |
||
194 | |||
195 | $time2 = microtime( true ); |
||
196 | |||
197 | $timeDiff = $lang->formatTimePeriod( $time2 - $time1 ); |
||
198 | $this->output( "\nDone in $timeDiff.\n" ); |
||
199 | } |
||
200 | |||
201 | function afterFinalSetup() { |
||
202 | global $wgLocalisationCacheConf; |
||
203 | |||
204 | # Don't try to access the database |
||
205 | # This needs to be disabled early since extensions will try to use the l10n |
||
206 | # cache from $wgExtensionFunctions (bug 20471) |
||
207 | $wgLocalisationCacheConf = [ |
||
208 | 'class' => 'LocalisationCache', |
||
209 | 'storeClass' => 'LCStoreNull', |
||
210 | 'storeDirectory' => false, |
||
211 | 'manualRecache' => false, |
||
212 | ]; |
||
213 | } |
||
214 | } |
||
215 | |||
216 | $maintClass = 'UpdateMediaWiki'; |
||
217 | require_once RUN_MAINTENANCE_IF_MAIN; |
||
218 |
Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code: