Commit graph

80432 commits

Author SHA1 Message Date
Translation updater bot
a13c7cad6e
Localisation updates from https://translatewiki.net.
Change-Id: I8a9758cc9475d503948bdef92a4ea60a27cda6b3
2025-07-15 07:33:49 +02:00
Translation updater bot
97bc6ab0b3
Localisation updates from https://translatewiki.net.
Change-Id: If84426817dc71714bd7d89735afeef3b0b1ea696
2025-07-08 07:32:39 +02:00
Umherirrender
26734f2f5f autoload: Expand Autoloader::CORE_NAMESPACES
Add missing namespace prefix to the constant

Change-Id: I3ba37863b1e4de9d64d1c09045c0e5b1da678425
(cherry picked from commit ec02426638f0732a345bd8376f55819ec777741a)
2025-07-07 16:53:04 +00:00
Umherirrender
d433a9467a installer: Always check return of IDatabase::fieldInfo in postgres
A non-existing field may return null, when trying to drop the default.
Avoid a fatal error in this situation.
There is no real issue yet, but good coding practice to check for null.

Change-Id: I1041f24361febb52fd7fb20c42348b712dd70fe9
2025-07-02 00:08:01 +00:00
Umherirrender
595623d90e Cache: Move MessageCache hook interfaces into correct folder
The folder name must match the namespace used for the interface.

Change-Id: I5e2f6d12b33a8ff540eaf4b9998e573179e8a1cf
2025-07-02 00:34:15 +01:00
Umherirrender
10c01b23c0 Rest: Move ModuleConfigurationException into correct folder
The folder name must match the namespace used for the class.

Change-Id: I768a4f8c9031e51b4a61174f39164204f6331dc2
2025-07-02 00:24:28 +01:00
Reedy
1317199663 Prepare 1.43.3
Change-Id: I759bdcfafc659cf470353aa54bc026485bff020e
2025-07-01 14:47:09 +01:00
jenkins-bot
1698f0771a Merge "BlockListPagerTest: Fixup tests for pre REL1_44" into REL1_43 2025-07-01 12:43:42 +00:00
Translation updater bot
c129ebd2d2
Localisation updates from https://translatewiki.net.
Change-Id: Id745ce901c7efff83a022e0879125ca9fdebd44a
2025-07-01 07:34:28 +02:00
Reedy
923f7e6755 BlockListPagerTest: Fixup tests for pre REL1_44
* Fix test failures
* Cherry-pick message cache change I957b6fb2bc0d9d4b1aae6e
* Cherry-pick part of I638d6d6d23f9624ba1dff0f4fcc to change cache from
  static to non-static.

Change-Id: I77a2facf9923d38269538e48c79365fa117af9af
Follows-Up: Id5462b942f5e916c2f1dc725739615d54a1070de
Follows-Up: I5471fe615d222b936c6668bf3089dd8b5931cc75
Follows-Up: I7bbd6ae36a11840ed6b4620b5d07fa5158ff139e
2025-07-01 11:46:47 +10:00
Reedy
0af28b77ee Prep 1.43.2
Change-Id: I31d917df197780bbc2aa8b943035bdebe1a700bd
2025-06-30 21:26:00 +01:00
Tim Starling
71df9ed5b2 SECURITY: Fix leak of hidden usernames via autoblocks of those users
CVE-2025-6927

In BlockListPager, restore the bl_deleted=0 condition removed in the
previous commit. Add tests.

Bug: T397595
Change-Id: I5471fe615d222b936c6668bf3089dd8b5931cc75
2025-06-30 21:25:48 +01:00
Tim Starling
686589d207 SECURITY: BlockList: Hide rows containing suppressed users
CVE-2025-6589

Bug: T391343
Co-Authored-by: MusikAnimal <musikanimal@gmail.com>
Change-Id: Id5462b942f5e916c2f1dc725739615d54a1070de
2025-06-30 21:25:41 +01:00
Dayllan Maza
87ea0c739f SECURITY: Fix autoblocks visibility when bl_deleted=1
CVE-2025-6927

ApiQueryBlock was relying only on the filter returned by
HideUserUtils::getExpression which only works for blocks targeting a
user account

Bug: T397595
Change-Id: I7bbd6ae36a11840ed6b4620b5d07fa5158ff139e
2025-06-30 21:25:30 +01:00
Dylan F
b2310f4736 SECURITY: Escape usernames in HTMLUserTextField validation errors
CVE-2025-6590

The HTMLUserTextField is accessible to logged-out users on private wikis
through Special:PasswordReset. Validation error messages returned by this
field included unescaped usernames parsed as wikitext. This allowed
logged-out attackers arbitrary access to the parser, enabling them to
reveal page contents through transclusion, e.g., "{{:Private page}}".

Escape the username parameter using wfEscapeWikiText() to prevent
wikitext interpretation in error messages.

Bug: T392746
Change-Id: Ifd8283e107e1655fa3f5694183c4f67954e5c4c5
2025-06-30 20:57:16 +01:00
Gergő Tisza
b1adf3c728 SECURITY: Allow extensions to supress the reauth flag on login
CVE-2025-6926

This is a workaround for extensions with some sort of "autologin"
implemented via the login page to indicate that the login flow
didn't involve the user actually logging in, it merely copied
some central login state, and so isn't appropriate for the
reauthentication flag.

This isn't the best way to provide an interface to extensions
(if we keep it, a more explicit interface, such as a
SessionPropertiesAuthenticationRequest object that's part of
the initial request set and can be modified by providers,
and can also be used for the "remember me" flag, would be
nicer), and maybe the whole approach of letting extensions
suppress the reauthentication flag is not the best way of
handling the problem in the first place, but it's simple
which is important for a security patch.

Bug: T389010
Change-Id: Ifce73837b25b0caad2d3d3cba000cceb0184c29d
2025-06-30 19:58:42 +01:00
Gergő Tisza
3340302f40 SECURITY: Do not treat autocreation as login for reauthentication
CVE-2025-6597

Auotcreation doesn't necessarily involve real-time user
identification, it can be based on some provider identifying the
user based on a session cookie or similar low-fidelity information.
Do not restart the reauthentication timer.

Bug: T389009
Change-Id: Icfb4d0ffe71a92421e8630a92ae302cc459aa9d6
2025-06-30 19:58:42 +01:00
Michael Große
8a9ef65437 SECURITY: fix IP leak to unverified email
CVE-2025-6593

Bug: T396230
Bug: T31856
Change-Id: Ibc13fafa0a00b3dc41b097bd7aa77c6a28767a57
2025-06-30 19:58:26 +01:00
Kunal Mehta
4b59ce1f25 SECURITY: API: Escape i18n messages in action=feedcontributions
CVE-2025-6591

This is the same issue as CVE-2025-32072 (T386175), except in the
API's feedcontributions module. Escape the "Contributions" and
"colon-separator" messages so administrators cannot inject HTML
into them, triggering a potential XSS in feed readers.

Bug: T392276
Change-Id: Ic590a0d0cfc0a4a1e61859ecc57a175a8f5ec098
2025-06-30 19:58:26 +01:00
Atieno
da8d30e0c6 [REST Sandbox] Remove SwaggerUI from MediaWiki Releases
Bug: T397470
Change-Id: I4e25792e347e8eeeb1dee4db1d25128948c1cdd0
2025-06-30 16:05:49 +01:00
Umherirrender
101639f81c exception: Skip use of HookRunner when not autoloaded
When autoload of HookRunner class fails (due to wrong namespaced
interface), it cannot be used in the exception handler,
that results in error about not found class, hiding the real error.

Bug: T387408
Change-Id: I93daa8b05bab42a4008a3bc09f26c7e041030a22
(cherry picked from commit 2037f6e41fcfa4b5240912f7fe09bc28ea1f0ae9)
2025-06-28 20:17:53 +00:00
Máté Szabó
c3bdae9eca exception: Avoid service container init in exception handler
Why:

- The exception handler may be triggered during service container
  initialization, e.g. if an autoloaded class triggers a deprecation
  warning.
- This causes callLogExceptionHook() to try to setup the service
  container once again, which then causes a cryptic "class not found"
  error as the service container attempts to autoload whatever class
  triggered the deprecation warning once again and fails.

What:

- Avoid attempting to initialize the service container in our exception
  handler if it was not setup already, since it may be unsafe to do so.

Bug: T380456
Change-Id: Ib439f25d9e309b77eac00c59c32e39ffbf3aa2a4
(cherry picked from commit 0b1480e60ef7d649bf7d22de5a7c032d04ed0f7a)
2025-06-28 20:17:39 +00:00
Taavi Väänänen
bbd7861a38 specials: SpecialTalkPage: Use config from request context
A special page has access to the request context which includes the site
config, no need to inject that separately here.

Change-Id: If8f01466c64dbacf806b6fccfa0bc4736c259607
(cherry picked from commit 0110bba7c9a8bdaf1cd8579534300c76b29c038a)
2025-06-28 15:11:13 +00:00
Siddharth VP
4fb27b070e htmlform: fix min/max validations on empty input in int/float fields
Int and float fields that are optional cannot currently specify the min
attribute. An unfilled value fails the validation because in PHP 8 any
number is greater than the empty string.

(For comparing numbers with non-numeric strings, the number is first
converted to a string and then compared. In PHP 7, the string was
converted to a number instead.)

Bug: T397883
Bug: T397643
Change-Id: I37be84554708e17eee27a7e599815891787e95bf
(cherry picked from commit 8e7ae749c0870e8133d083ac4125280c11a12ea6)
2025-06-28 12:49:28 +00:00
daniel
db6013aa6c Api: Fix permission checks in action=compare
Why:
- action=compare was used to circumvent Lockdown

What:
- use checkTitleUserPermissions() to enforce read permissions in
  ApiComparePages.

Bug: T397521
Change-Id: Id275382743957004fa7fc56318fc104d8e2d267b
(cherry picked from commit c62e4d93a33e94c7fe6f716a4747b1dbd59b3f90)
2025-06-25 14:17:17 +00:00
daniel
7f1fa6f51f RefreshLinksJob: Check hastext before comparing HTML
Why:
- When comparing the newly generated HTML to the cached HTML, there
  might be cases when the new ParserOutput doesn't contain HTML.

What:
- If hasText() returns false, don't compare HTML and use the "unknown"
  value for the html_changed stats label.

Bug: T388406
Change-Id: Ibc3e79e79a6421d4780739104a949bac50a5b01f
(cherry picked from commit a275e02771bc2ed4243804d5294188f54e47f9fc)
2025-06-25 08:21:23 +00:00
Aaron Schulz
4659cbcccc rdbms: fix table prefixing in "FOR UPDATE" clause generation in Postgres
Make SqlPlatform::tableNameWithAlias() include the unqualified table
name as an alias if doing so is not redundant. This assures that the
default alias from JoinGroupBase::addJoin(), equal to the unqualified
table name, will be usable in SQL (regardless of table prefixes).

Clean up use of identifier quotes for sqlite_master tables. The called
methods expect unqualified names and a passthrough exception already
exists for sqlite_* tables.

Use "block_target.bt_user" directly in ApiQueryBlocks and BlockPager,
instead of using addIdentifierQuotes(). The "block_target" alias is
automatically added to the SQL by the rdbms layer when it's not clearly
redundant, so it is always safe to use block_target.bt_user. Also, there
is no reason for aliases to include quote characters. They are supposed
to be simple alphanumerics like column names. This makes it easy for
tableNameWithAlias() to avoid redundant aliases by checking tableName().

Avoid unneeded quotes around pg_catalog.* table names in the Postgres
installer. The relevant documentation of methods like selectField() is
that the table names be unqualified (no quotes nor dots), though dots
are still supported internally for compatibility reasons and ease of
querying schemas like pg_catalog and information_schema.

Change-Id: Ic7d7826da31f49915141692cb3bd84ed1e872e96
2025-06-24 22:33:30 +01:00
Translation updater bot
38a0f5d5e9
Localisation updates from https://translatewiki.net.
Change-Id: If2a15063f338e83caea4b85b0b87d67defbe80b4
2025-06-24 07:33:27 +02:00
C. Scott Ananian
ed94cc0b64 structure tests: allow PHP 8.1 syntax and autoload enums
Change-Id: I0069df20fbc7ee46c7dc177e5bf352434b8abf32
(cherry picked from commit 12c9e516a2a42d399f5d51f6ba1b162ba68f4894)
2025-06-18 10:55:15 +01:00
Daimona Eaytoy
8a21d033f8 Clean up resource type and phan suppression in postgres code
Replace `resource` with the new types in PHP 8, and drop all the
redundant phan suppressions.

Change-Id: Ie63253356c373da9f8f8db16823d1b7f41822528
2025-06-18 10:54:16 +01:00
James D. Forrester
65c90be7ea Drop a few phan PhanImpossibleTypeComparison suppressions now we've dropped PHP 7.4
Change-Id: I3426e8d65c38f4e4c6e6d2ab8ff380b9d12a47fd
2025-06-18 10:54:01 +01:00
James D. Forrester
ac8a5b0b59 Drop PHP 7.4/8.0 support from master (forward-port from MW 1.42)
This patch was applied to release branches for MW 1.42 in April 2024, and
since ported to MW 1.43 and then MW 1.44 as well. This one-of-a-kind hot
patch will finally discontinue once this lands in the master branch as
part of MW 1.45+ releases.

A small handful of phan fixes make this pass so it can land; the rest
(including fixes rather than suppressions of events here) will happen in
later patches.

Bug: T328921
Bug: T359868
Change-Id: Ica2c11a6243795437ec652923e42ef3bd74a5fd8
2025-06-18 10:53:22 +01:00
Lucas Werkmeister
bce2f8850d logger: Make log() methods return void
psr/log 3.0.0 adds this return type.

For this specific case the fix is very simple, fully
compatible with the older version of psr/log, and
something we’ll have to do sooner or later anyway.

Bug: T356451
Change-Id: I49562ac7f1a71e82cab79fe44296feea573e26d4
(cherry picked from commit 9244d4b2623b9d789e7dea28e65b5ca6f9651aaf)
2025-06-18 02:21:42 +00:00
Translation updater bot
5e27e3d4c9
Localisation updates from https://translatewiki.net.
Change-Id: Id506abba0a9655c6e4d23cf2f901db8e97312661
2025-06-17 07:32:55 +02:00
Reedy
a18e6ca5e6 ApiQueryRevisionsBase: Cast ctype_digit() param to string
Bug: T396766
Change-Id: I22f65e63269ad985f2442176387f2ca96f7609c5
(cherry picked from commit dddeb4e16fae4bae9cd5183548e6db7b3eff2b07)
2025-06-16 14:29:08 +00:00
Timo Tijhof
f34ea0830a widget: Remove outdated try/catch wrapper from SpinnerWidget
== What ==

This method was "Copied from OOUI\Tag", which no longer does this
since last year (I42c7a7b4d, 6e4e1a1796). Apply the same change here.

== Why now ==

Triggering E_USER_ERROR is deprecated in PHP 8.4+.

Bug: T381341
Bug: T379445
Change-Id: I1bac121caf746c30996dccd7fb95c4c240742951
(cherry picked from commit 751eca89fe473cc4a649e47dd54e9ab38f7c1957)
2025-06-14 10:42:05 +00:00
Timo Tijhof
78d252789c Setup: Update error message for composer dependencies check
== Why ==

While psr/log represents our original an first use of Composer,
this is nowadays "just" another dependency among many. It does not
justify or help understand what to do next.

== What ==

Use the same "external libraries" terminology, as on mediawiki.org.

== History ==

* 2014 (Ie66794441): Add first ever Composer dependency (psr/log)
* 2015 (Ie47467657): Add LoggerFactory with check for missing Composer
                     dependency, to address a then-common issue.
* 2015 (Ib60261237): Move check earlier, to WebStart.
* 2017 (I633a6ff23): Move check earlier, to Setup.
* 2021 (Ia81903fb2): Remove redundant exit(1).
* 2025 (I6050ec4ca): Replace deprecated E_USER_ERROR.

Change-Id: I890d1f285997ccbc04cdb378a69815982c2bf64f
(cherry picked from commit b538453cdc6438419d044854cc730706988cb908)
2025-06-13 20:54:40 +00:00
Timo Tijhof
8b7f9129c3 Setup: Switch vendor error from echo+E_USER_ERROR to echo+exit
== Background ==

E_USER_ERROR is a deprecated error code for "recoverable fatal error",
a confusing description no longer used upstream and replaced by the
Throwable/Error concept, i.e. something that is meant to be fatal,
but could in theory be caught if you know what you're doing, via a
risky catch for Throwable instead of Exception.

What trigger_error with E_USER_ERROR does:

* (If we haven't sent headers yet)
  Emit header "HTTP/1.1 500 Internal Server Error".
* (If display_errors is enabled)
  Print the message, again, along with a strack trace.
* Notify set_error_handler letting you "catch" a non-Exception error.
* Write it to error_log, e.g. STDERR for composer serve and CLI,
  or an Apache/php-fpm error.log file.
* End with exit(1).

Issues:

* When enabling display_errors, the message is printed twice.
* The HTTP 500 status didn't work because headers are already sent,
  ... by the "echo" statement, right above it.

== Option A: throw Error $message ==

`throw Error($message)` is the natural successor to E_USER_ERROR.
I would recommend this, if
1) we didn't already echo it, and
2) the message didn't contain HTML, and
3) we needed to keep compat with someone catching this, or
4) we wanted a stack trace.

We echo it because display_errors can be off, and the most likely
audience for this is someone new to PHP/MediaWiki, installing in prod
or locally, when debugging is either intentionally off, or before
they're familiar with debugging modes. As such, we want to print it
ourselves either way, and printing it again as part of E_USER_ERROR
isn't needed.

The HTML part is important because one subtle difference between
trigger_error and throw Error is that the former allows raw HTML,
while the latter treats exception messages as plain text. Our message
intentionally uses HTML to link to docs in the browser, so this is
unhelpful.

The catchable-ness of this is not important to us, as no extension or
distro code (e.g. PlatformSettings.php) can run this early. There
are no runtime consumers of this error, only the end-user's browser.

== Option B: echo+exit ==

Given we already print the message, we just need to exit.

== History ==

* 2014 (Ie66794441): Add first ever Composer dependency (psr/log)
* 2015 (Ie47467657): Add LoggerFactory with check for missing Composer
                     dependency, to address a then-common issue.
* 2015 (Ib60261237): Move check earlier, to WebStart.
* 2017 (I633a6ff23): Move check earlier, to Setup.
* 2021 (Ia81903fb2): Remove redundant exit(1).

== Change ==

* Emit HTTP 500 before the echo.
* Keep echo (for browser) and error_log (for discovery via CLI or log
  file).
* Replace trigger_error with just exit(1), avoid duplicate message.

Bug: T379445
Change-Id: I6050ec4ca857d3c92c1c43f6a38e4154cd60e5d5
(cherry picked from commit 98c6d3c4c3511ecf60ffc693ff6c7164964270ca)
2025-06-13 16:57:53 +00:00
Timo Tijhof
83d4898319 debug: Migrate E_USER_ERROR to throw Error in DeprecationHelper
For a long time now, since PHP 7.0.0, access to non-public properties
has thrown Error, not emitted E_ERROR.

Example - https://3v4l.org/dHChU

Our simulation of this in DeprecationHelper is meant to do what PHP
does, so, given we no longer support PHP 5.6 and can thus construct
Error ourselves, we should do the same.

This is identical - https://3v4l.org/koUqu

== Why ==

Referencing the E_USER_ERROR constant causes a deprecation warning
in PHP 8.4+.

== Change ==

The source change is straight-forward.

One of the tests (testSet, dataset 4 "fallbackGetterOnly") was
previously passing by accident. The source called trigger_error twice,
first with E_USER_DEPRECATED (via wfDeprecated) and then again with
E_USER_ERROR. Given that these are asserted via set_error_handler,
an event calback, the callback is run after the callback finished
(it does not interrupt), at which point only the last values are
reported to the event handler. Improve on this by explicitly hiding
the deprecation warning, and focus the case on testing the error.

Bug: T379445
Change-Id: Ia0aff9906102023370f3907e01962a5e1e369125
(cherry picked from commit d0920b8fb5be462a7aba5c21e47b02c2c2f5025f)
2025-06-13 07:40:14 +00:00
Translation updater bot
d5e97d42ac
Localisation updates from https://translatewiki.net.
Change-Id: Id5113b17063ac0d61bc9ab3638814ad4d6e13e8e
2025-06-10 07:33:07 +02:00
Bartosz Dziewoński
994f95f757 Treat File::getShortDesc() as possibly unsafe HTML
File::getShortDesc() is documented to return HTML, but some handlers
return unescaped plain text.

Bug: T395834
Change-Id: I150f0215339b4ac18254fce2be138b1cde2277d5
(cherry picked from commit b2a9cc1564397e27fd80e44e99e1905fcbd10684)
2025-06-04 21:18:13 +00:00
Pppery
9ac90f7816 Improve BrokenRedirects display
- Don't strike all entries in Miser Mode
  - This does a query for each entry, however other pages like
    Special:DoubleRedirects already do that so it shouldn't cause
    performance problems.
- If the redirect is no longer broken because its target now exists then
  strike the entire entry rather than displaying a red link to a page
  that actually exists

Bug: T351055
Change-Id: I9189b1ba537f0ca590b41a3db76621f11df2a224
2025-06-03 20:52:50 +00:00
Translation updater bot
834c1a5407
Localisation updates from https://translatewiki.net.
Change-Id: Ia44339c067661faed77d8b6b7670a62fc47589ba
2025-06-03 07:32:43 +02:00
Kosta Harlan
9d3de690e0 Use anonymous user when creating named account from temp account
Why:

- Using an anonymous user object at the start of account creation helps
  ensure that downstream code paths do not record the association
  between a temporary account and a named account

What:

- Use an anonymous user object during account creation initiated by
  temp account users
- Update the session to use the anonymous user and set the request
  context user based on the session user
- Ensure the temp account username is removed from the session, to avoid
  issues where account creation fails and code thinks that a temporary
  account username is already defined for the session
- Add a test to exercise this code path

Bug: T393628
Change-Id: I6d2df8c1d842c4fefa916ed395479f479a0051eb
(cherry picked from commit 3d80e63f109834b90a83597d6d924895b2c6ae71)
2025-05-29 12:06:33 +00:00
Mark A. Hershberger
3ac4f81c18 Remove the hyphen as a legal search character for MySQL
Bug: T221560
Change-Id: Ib38ab6334983eecea0981540d102ecde7fc94d42
(cherry picked from commit 693155fe2c653fbae781578fcb39d9888df5b2a3)
2025-05-28 10:21:06 +00:00
Máté Szabó
7d44a728b6 title: Reset cached Title objects between tests
Why:

- Title has several in-memory caches for Titles constructed via
  newFromText() and for the canonical mainpage instance that
  isMainPage() compares against.
- These caches are not reset between tests, which can cause cryptic
  integration test failures. It's not safe to persist either of these
  caches across tests, as neither the internal state of Title objects nor
  the identity of the canonical mainpage is valid across tests.

What:

- Clear the cached main page instance in Title::clearCaches().
- Call Title::clearCaches() from MediaWikiIntegrationTestCase::resetNonServiceCaches().

Bug: T395214
Depends-On: Ic35b45015ff5a53f6e728b69b59cc57efe0b390b
Change-Id: Ie6cac7e1282f794277dfc8ff3673f12e9969818c
(cherry picked from commit 3f7905bc9ff9006831f8573b7fe948dc7243107e)
2025-05-27 12:35:10 +00:00
Translation updater bot
cd0e100668
Localisation updates from https://translatewiki.net.
Change-Id: Id38b320980cd8e7d74dbb82b050ee2713bc26188
2025-05-27 07:32:17 +02:00
James D. Forrester
700a639140 FormatMetadata::formatFraction: Don't risk passing null to preg_match
We do this above for formatNum(), so this approach seems to be
idiomatic to this code.

Bug: T394989
Change-Id: I804cc180e5de8ddf22b70e9f532f0f2416713eb7
(cherry picked from commit a6a777ae853f0f989b1438bd5c1c3af5dbed135a)
2025-05-22 17:13:58 +00:00
Translation updater bot
f418b5f3bf
Localisation updates from https://translatewiki.net.
Change-Id: I8029829a52e7292222f61338bd41d6be924d52e5
2025-05-20 07:33:43 +02:00
Translation updater bot
b7432b90c0
Localisation updates from https://translatewiki.net.
Change-Id: I8263419b865039c2a45179ad5a48d3185b6c71e6
2025-05-13 07:34:39 +02:00