Commit graph

88 commits

Author SHA1 Message Date
Thalia
52e648f8a3 block: Log some details to debug DatabaseBlock::setBlocker
Bug: T192964
Change-Id: I309eb85e364366eeb2f2a383f1008b4b42d83481
2019-12-20 14:45:04 +00:00
jenkins-bot
32743b6d97 Merge "Throw deprecation warnings for block cookie methods" 2019-11-21 14:39:01 +00:00
jenkins-bot
1eef855e53 Merge "Throw deprecation warning for AbstractBlock::getBlockErrorParams" 2019-11-21 14:38:55 +00:00
Thalia
7299ffbb7b Throw deprecation warnings for block cookie methods
DatabaseBlock methods for handling block cookies are deprecated, so
stop using these methods in tests and throw warnings.

Change-Id: I2b5cfd579aa14bbfc7a292587a288ee5032eb5ab
2019-11-18 19:22:37 +00:00
Thalia
5f1f9534df Throw deprecation warning for AbstractBlock::getBlockErrorParams
Also remove an unused reference to this method from a test. The method
is unused otherwise.

Change-Id: Iaf987fddb2845d870fe1b9154fbfd87c01188442
2019-11-18 17:00:10 +00:00
Thalia
af14ca02c4 Throw deprecation warning from deprecated Block::prevents
Change-Id: I1af2be100ae8deb7399ff9246a43128901f3a02f
2019-11-18 16:52:27 +00:00
Max Semenik
f1c9cf8879 Minor cleanups
* Identifier case
* Returning a void function result
* Unused variable
* Missing documentation

Change-Id: Ibfd2fc5ae1d91c7c9c6a34bcd4523384d3bca576
2019-11-03 17:10:23 -08:00
jenkins-bot
0283aca3e8 Merge "Remove blocker dependency for System and Composite blocks" 2019-10-31 14:12:48 +00:00
Dayllan Maza
e774df240a Remove blocker dependency for System and Composite blocks
The motivations behind this change is T227892 and that a blocker for a System or
Composite block provides no useful information for the end user.

Here is what's changing:
* Move the $blocker property to DatabaseBlock, since this is the only type of
  block that can be created by a user.
* Move handling of the 'by' and 'byName' constructor option from AbstractBlock to
  DatabaseBlock.
* getBy(), getByName(),  are now abstracts methods and each block type have to provide
  their own implementation
* getBlocker(), setBlocker() are being deprecated in AbstractBlock and moved as internal
   methods into DatabaseBlock

Bug: T227892
Depends-On: Ie2aa00cfec5e166460bcaeddba3c601fe0627c13
Change-Id: I1b17c652b12d98de3d996d309d4d3f22074be411
2019-10-31 07:45:07 -04:00
Thalia
b621de3978 Save autoblock reasons with unexpanded templates
Autoblock reasons are built as a Message which takes the original
block's reason as a parameter. If the autoblock's reason is set using
the Message, it will be stored in the database with templates
expanded due to how a CommentStoreComment is constructed. Instead,
set the autoblock reason using a string with the unexpanded template.

Follow-up to 6a8920d3, which fixes how the reason is displayed in the
UI, but still expands the templates on saving.

Bug: T236501
Change-Id: I67a9941a9c039331576cbfc2ab58d9f20a7213e2
2019-10-30 14:08:26 +00:00
Thalia
6a8920d30d Don't expand template for reason on saving an autoblock
Bug: T236501
Change-Id: Ibca6443eeaabf9e60d45989de803aacebc952d5e
2019-10-25 20:08:54 +01:00
Thalia
a652bb330a Pass the target as a string to the reason Message for autoblocks
Bug: T227007
Change-Id: Id56c7f41d96e378ff43d152ff7325de49be66df9
2019-10-22 16:51:10 +01:00
Tchanders
a6533885b8 Revert "Revert "Store block reasons as CommentStoreComments in block classes""
This reverts commit 5f06efb318, which
reverted 9335363789, which makes
the deprecated property AbstractBlock::mReason private.

After 9335363789, AbstractBlock::mReason is obsolete, since the block
reason is now stored as a CommentStoreComment, AbstractBlock::reason.

Change-Id: Ica0a74be90383689ca8e4cfe6d0fb25c9a5942c5
2019-10-20 10:41:17 +01:00
Daimona Eaytoy
5f06efb318 Revert "Store block reasons as CommentStoreComments in block classes"
This reverts commit 9335363789.

Reason for revert: It's full of code accessing AbstractBlock::mReason
out there, see [1]. Also, it was never hard deprecated. While that may
be acceptable under some circumstances, it's definitely not OK to remove
code when there are consumers around. I'd have fixed it right now without
reverting if it were a single repo, but there's just too many.

[1] - https://codesearch.wmflabs.org/search/?q=-%3EmReason&i=nope&files=&repos=

Change-Id: I8669f502b50cff89e28dada0f65fe2b130ae9b37
2019-10-19 18:55:45 +00:00
Thalia
9335363789
Store block reasons as CommentStoreComments in block classes
AbstractBlock::setReason now accepts a string, Message or
CommentStoreComment. The CommentStoreComment is accessed via
AbstractBlock::getReasonComment.

AbstractBlock::getReason returns the reason as a string, with
the language and format consistent with how block reasons were
built before this commit. This method is deprecated, since it
makes assumptions about the language and format needed. The
deprecated mReason property is no longer public.

Doing this (and T227005) will remove the implicit dependency of
BlockManager::getUserBlock on language, which causes a recursion
error if the block is checked before the user has loaded. It also
provides a mechanism for getting the block reason in a language
specified by the caller. (This does not apply to DatabaseBlock
reasons entered via the Special:Block form, which were not and
are still not translatable.)

This commit also updates authentication classes to return the
translated reason.

Bug: T227007
Change-Id: Iec36876e930dff96a256aebbdc39cbfb331c244e
2019-10-18 17:47:56 -04:00
Thalia
f8f458d921 Ensure block cookie is not removed early if blocked user logs out
Follow-up to 235cade5a3: if a block cookie already exists, do nothing
if shouldApplyCookieBlock determines that the block should apply to
the user.

Bug: T233595
Change-Id: I85b7e1153225770218e5ea1607b46fa7ed7d8101
2019-10-15 13:38:04 +01:00
Thalia
235cade5a3 Clear block cookie when tracking block, not when checking block
Before this commit, clearing a block cookie happens as a
side-effect of checking for a block cookie. After, a block cookie
is cleared if trackBlockWithCookie finds that there should be no
block cookie, but there is one.

Bug: T233595
Change-Id: Id5777361f95c60d2849cacba82f2ed9add647abf
2019-10-09 14:09:34 +01:00
jenkins-bot
8db7eb1139 Merge "Introduce a formatter service for block errors" 2019-10-08 19:42:53 +00:00
James D. Forrester
40c35286cb Services: Convert BlockManager's static to a const now HHVM is gone
Change-Id: I01d6e18fc30bd61ba7ea5ce1c7c646524579c4ba
2019-10-08 11:24:22 -07:00
Thalia
df20197250 Introduce a formatter service for block errors
The main reasons for adding this service layer are:
* It allows error messages to be more consistent, by defining
  a set of reportable information that can describe any block
  type and is consistently formatted.
* It decouples formatting from the block classes, removing
  their dependency on language, for the most part.

The service provides one public method, getMessage, which
returns a Message object whose key and parameters are
determined by the type of block. This should be used instead
of the deprecated AbstractBlock::getPermissionsError and
AbstractBlock::getBlockErrorParams.

Calls to AbstractBlock::getPermissionsError are replaced in
this patch.

Bug: T227174
Change-Id: I8caae7e30a46ef7120a86a4e5e6f30ae00855063
2019-10-08 12:29:23 +01:00
jenkins-bot
8e80dd9d45 Merge "Document that block target and type properties can be null" 2019-10-03 21:35:06 +00:00
Thalia
847fb514eb Document that block target and type properties can be null
The target and type of a block can theoretically be set to null via
AbstractBlock::setTarget, which calls AbstractBlock::parseTarget,
which can return null for the target and type.

Change-Id: Id8ec4ad6ff8f73b475793bb47ca95227ac2085e1
2019-10-02 00:19:51 +01:00
Timo Tijhof
0e1e4ee5de
block: Allow cookie-block tracking from any uncached web request
This was previously hardcoded from three places: 1) Upon viewing EditPage,
2) Upon viewing SpecialCreateAccount, 3) For any url if the user is
logged-in (User::loadFromSession/isLoggedIn).

== User::loadFromSession

Performing cookie blocks from here created a circular dependency because
Block may need the user language for localisation, which is determined by
asking the User object. This was previously worked around by using a
DeferredUpdate (T180050, T226777). Moving this logic explicitly to the
end of the pre-send cycle in MediaWiki::preOutputCommit breaks the cycle.
This is also where other request-specific handling resides already.

== Limited effect on unregistered users

When an unregistered user performs an edit, and gets blocked,
the cookie block is not applied until they open built-in editor
or CreateAccount page. This makes it more likely for a user's
IP to change meanwhile. Either intentionally, or simply due to
IPs varying naturally (e.g. between mobile locations, or when
going on/off WiFi). By applying it throughout sessioned page
views for unregistered users, it is more likely to get set.
Similar to what was already done for logged-in users.

This commit also makes the intent of not caching EditPage and
SpecialCreateAccount explicit. This was previously implicit
through nothing having called setCdnMaxage() and/or due to
Session::persist being checked for by OutputPage::sendCacheControl.

Bug: T233594
Change-Id: Icf5a00f9b41d31bb6d4742c049feca0039d0c9d9
2019-10-01 13:52:58 -04:00
Umherirrender
268346e562 phan: Enable PhanTypeMismatchArgument issue
Bug: T231636
Depends-On: I5de4f8f32a47c3f41c990ffe2ebd091fc23d1a58
Change-Id: I34d65fe3ff1916f2af675f0b1f19641b0cdfadc0
2019-09-19 20:11:42 +02:00
jenkins-bot
e2f0ee49d0 Merge "Log DNS blacklist matches with info level, non-matches with debug level" 2019-09-14 20:16:10 +00:00
Martin Urbanec
c64d6c4379 Log DNS blacklist matches with info level, non-matches with debug level
Bug: T230822
Change-Id: I036b38ac322181fdba4e9e6c1ff539f79b5bb79c
2019-09-14 18:49:30 +02:00
Daimona Eaytoy
290ab29617 Declare dynamic properties
This is for classes with a single undeclared property - aside from
BlockManager: I3f51fd3579514b83b567dfe20926df2f0930dc85 removed the
declaration of $permissionManager without actually removing all uses.

Change-Id: Ic2a95f77071312041be6e0633ea9b5325e98de42
2019-09-14 15:21:26 +02:00
jenkins-bot
f9242d74f8 Merge "Pass the user and request into BlockManager::getUserBlock" 2019-09-11 18:58:32 +00:00
Thalia
5fffa5c07a Pass the user and request into BlockManager::getUserBlock
Blocks are checked from the User object. Specifically,
User::getBlockedStatus instantiates a BlockManager and calls
BlockManager::getUserBlock. However, checking the block often depends
on knowing more about the state than the User should know. As a result,
the global user and request objects were passed into the block manager
on construction.

Whether the global request object should be passed into a service
constructor is still up for debate, so this moves the check for the
global state back to User::getBlockedStatus for now. (Note that it
reintroduces the problem of the User knowing more about state than it
should.)

This change also makes clearer the cases in which
BlockManager::getUserBlock is called from the User.

Different blocks may be sought, depending on the user and their
permissions. The user may be:
(1) The global user (and can be affected by IP blocks). The global
    request object is needed for checking the IP address, the XFF
    header and the cookies.
(2) The global user (and exempt from IP blocks). The global request
    object is needed for checking the cookies.
(3) Another user (not the global user). No request object is available
    or needed; just look for a block against the user account.

Cases #1 and #2 check whether the global user is blocked in practice;
the block may due to their user account being blocked or to an IP
address block or cookie block (or multiple of these). Case #3 simply
checks whether a user's account is blocked, and does not determine
whether the person using that account is affected in practice by any
IP address or cookie blocks.

Bug: T231919
Change-Id: I3f51fd3579514b83b567dfe20926df2f0930dc85
2019-09-11 08:23:54 +01:00
Brad Jorsch
c29909e59f Mostly drop old pre-actor user schemas
This removes most of the pre-actor user and user_text columns, and the
$wgActorTableSchemaMigrationStage setting that used to determine
whether the columns were used.

rev_user and rev_user_text remain in the code, as on Wikimedia wikis the
revision table is too large to alter at this time. A future change will
combine that with the removal of rev_comment, rev_content_model, and
rev_content_format (and the addition of rev_comment_id and rev_actor).

ActorMigration's constructor continues to take a $stage parameter, and
continues to have the logic for handling it, for the benefit of
extensions that might need their own migration process. Code using
ActorMigration for accessing the core fields should be updated to use
the new actor fields directly. That will be done for in a followup.

Bug: T188327
Change-Id: Id35544b879af1cd708f3efd303fce8d9a1b9eb02
2019-09-09 11:38:36 -04:00
Daimona Eaytoy
b5cbb5ab3f Upgrade phan config to 0.7.1
This allows us to remove many suppressions for phan false positives.

Bug: T231636
Depends-On: I82a279e1f7b0fdefd3bb712e46c7d0665429d065
Change-Id: I5c251e9584a1ae9fb1577afcafb5001e0dcd41c7
2019-09-04 08:20:53 +00:00
Daimona Eaytoy
c659bc6308 Unsuppress another phan issue (part 7)
Bug: T231636
Depends-On: I2cd24e73726394e3200a570c45d5e86b6849bfa9
Depends-On: I4fa3e6aad872434ca397325ed7a83f94973661d0
Change-Id: Ie6233561de78457cae5e4e44e220feec2d1272d8
2019-09-03 17:19:21 +00:00
Thalia
136054d95e Allow CompositeBlock::appliesToRight to return null when unsure
CompositeBlock::appliesToRight checks $block->appliesToRight()
for each of the original blocks from which it is made.

AbstractBlock::appliesToRight returns:
* true if the block applies to the right
* false if the block does not apply to the right
* null if unsure

Before this, CompositeBlock::appliesToRight can only return true
or false. After this, it returns:
* false if false for all of the original blocks
* true if true for one or more original blocks
* null otherwise

Bug: T229417
Bug: T231145
Change-Id: Ie93b7691b57ac6a8f86b3641ad07a1d54babcd42
2019-09-01 21:41:18 +01:00
Thalia
4c4b61c126 Improve formatting of constructor documentation for block classes
Change-Id: Idced6ce907f63d2c041d1bb926b8224ece54c3de
2019-08-29 13:18:50 +01:00
Thalia
81f96bee1f Use UserIdentity::isRegistered instead of User::isAnon in BlockManager
BlockManager::getBlockFromCookieValue accepts a UserIdentity, so should
only call methods defined in that interface.

Change-Id: If30df15b800cceee0ad052a2e0524df8b28d9901
2019-08-27 07:23:58 +01:00
Thalia
fc0067d7d5 Disambiguate confusing $fromReplica variable in BlockManager
Change-Id: Ifd9bfbc40a52add5e8478c31a55a1c22e9d4693d
2019-08-23 13:32:41 +01:00
Thalia
7a5508573a Ensure block hooks keep user state consistent with realistic blocks
Several block-related hooks allow the user to be put into in a state
that is inconsistent with blocks that can actually be made:
* With UserIsHidden, User::mHideName can be set to true without there
  being a block
* With UserIsBlockedFrom, a user can be blocked from editing a page
  without there being a block
* With GetBlockedStatus, public block properties can be arbitrarily
  set on a user

These problems are mostly theoretical, but mean that it is impossible to
make some basic assumptions, e.g. that a user who is blocked from a page
must have a block. The hooks are not widely used, and with a few changes
we can make them more robust so such assumptions can be made.

This patch:
* Ensures UserIsBlockedFrom is only called if there is a block. This
  would be a breaking change if any extensions were using this to block
  an unblocked user; the intended use case is clearly for extensions to
  allow user talk page access to blocked users.
* Adds a new hook, GetUserBlockComplete, which passes the block for
  modification. This should be used instead GetBlockedStatus and
  UserIsHidden, which will be deprecated in the future.
* Allows the 'hideName' option to be passed into the AbstractBlock
  constructor so that suppressing system blocks can be made.

Bug: T228948
Bug: T229035
Change-Id: I6f145335abeb16775b08e8c7c751a01f113281e3
2019-08-21 17:38:52 +01:00
jenkins-bot
36fdf484e9 Merge "Replace User::isAllowed with PermissionManager." 2019-08-21 08:00:33 +00:00
Petr Pchelko
1d286560d2 Replace User::isAllowed with PermissionManager.
Covers root includes, actions, api, block, changes,
changetags, diff and PermissionManager itself.

Bug: T220191
Change-Id: Ic027d32f5dd8f4c74865df0c8a9fcf91123c889c
2019-08-20 14:43:51 -07:00
jenkins-bot
4304174a4c Merge "Clear block cookie if the value is invalid" 2019-08-20 19:21:15 +00:00
Thalia
07e5d6962f Put block cookie expiry into UTC for comparison with current time
Change-Id: Ia01a364a01ebacec8783ecdcfe4a129cfb746eb8
2019-08-20 16:22:14 +01:00
Dayllan Maza
dbc0d3c884 Clear block cookie if the value is invalid
When a block cookie is present and the block is invalid or doesn't exists
or the cookie value is invalid or malformed, the cookie is removed.

Bug: T227678
Change-Id: Icaff594686c16a0eb8551b2a4392a14a969b43b0
2019-08-19 14:59:25 -04:00
Umherirrender
2664eeb632 Clean up spacing of doc comments
Align the doc stars and normalize start and end tokens

Change-Id: Ib0d92e128e7b882bb5b838bd00c74fc16ef14303
2019-08-05 22:29:50 +00:00
Thalia
f45359a0a9 Deprecate several public properties on the block classes
Public methods for checking and setting these properties already
exist where needed. Also update the remaining direct uses of these
properties in core.

Change-Id: Icdef025c9700e625aeb2a07975e69f1b1cc2466c
2019-07-29 21:29:54 +01:00
Thalia
f7cddcf7c1 Remove deprecated handling of array keys for $wgProxyList
Change-Id: Ic9cc2a5585180ab57fd361342cbac8210b094a5c
2019-07-24 21:45:45 +01:00
jenkins-bot
45cf525887 Merge "Report more information about composite blocks in block error messages" 2019-07-17 15:53:28 +00:00
Thalia
0bb2e95974 Report more information about composite blocks in block error messages
For any messages that use CompositeBlock::getPermissionsError, include
details of the original blocks from which the composite block is made.

If there are any database blocks, give their IDs and also explain that
there may also be blocks due to IP blacklisting.

If there are no database blocks, then explain that the IP must be
blacklisted in multiple places.

Bug: T212326
Change-Id: Id6ad0019f8add4d5e000da5e872338e87cca485e
2019-07-17 16:15:30 +01:00
Aaron Schulz
f72ae0f6e6 Switch various LoadBalancer::getConnection() callers to getConnectionRef()
This is the preferred method as it enforces read-only mode for DB_REPLICA
and handles LoadBalancer::reuseConnection() calls automatically.

Change-Id: Iab9439ba8e0810fa14c302661ed7a3534f6bfc0d
2019-07-12 10:56:30 -07:00
jenkins-bot
d72f24589b Merge "Pass in ServiceOptions to BlockManager" 2019-07-10 18:02:43 +00:00
jenkins-bot
c9db907126 Merge "Tidy up conditions for applying a block from a cookie" 2019-07-10 18:02:36 +00:00