Commit graph

367 commits

Author SHA1 Message Date
jenkins-bot
ad83e01f61 Merge "Update an old comment that predated IPv6" 2019-05-01 18:25:10 +00:00
Thalia
3f9cbd6adb Update an old comment that predated IPv6
Change-Id: Ia9968eab3793f275cd7ca6a35cfd5b0bcc9604c5
2019-05-01 18:28:55 +01:00
Derick Alangi
cf52798063 Block: Type hint Block constructor, follow-up on I37ab858494a173c6982bb
Since 1.26, both options array and individual arguments were accepted but
was later removed in I37ab858494a173c6982bb (support for multiple args was
dropped) and **only** array of options is accepted from 1.33 since the use
of individual arguments all disappeared, see usage below;

Usage
=====

https://codesearch.wmflabs.org/search/?q=new%20Block%5C(&i=nope&files=&repos=

Bug: T220656
Change-Id: Id5266400def9fafbc89d5bdcdb63aed2a63da34d
2019-04-30 17:59:36 +01:00
Thalia
7e8e41ba92 Rename $isIpUser to $isAnon, in line with convention elsewhere
Change-Id: I66721f4af5e844c3e18ba35558390563b8424863
2019-04-26 18:10:59 +00:00
Dayllan Maza
de67ee1972 Rename BlockRestriction -> BlockRestrictionStore and wire it up as a service
BlockRestriction was initially created as a static class and there is no reason
why this shouldn't be available in the service container.

Also renaming as BlockRestrictionStore to keep up with the new emerging naming patterns.

Bug: T219684
Change-Id: If0b954f286d4759de2e3e41a0eb788e74bd72996
2019-04-16 21:55:15 -04:00
Thalia
846d84fa18 Set default for Block::appliesToPasswordReset to true
Follow-up to Ia3f46aba. Before that patch, the default case for
whether a block blocks password reset was true.

Bug: T218905
Change-Id: I86cb381762890abddcf32f4f7199799391cc6dfb
2019-04-02 14:43:09 +01:00
Max Semenik
4004d3d868 Fix function/class case
Change-Id: I18c205736be9d76d2c09a6dc4d7377740a742ccc
2019-03-29 16:20:50 -07:00
jenkins-bot
4fde90cf97 Merge "Deprecate Block::isValid method" 2019-03-28 03:56:20 +00:00
Thalia
cce24b4078 Deprecate Block::isValid method
Block::isValid checks whether the block target equals null. It seems to
have been unused since commit 40a926ab2c.
It was called from Block::newFromDB, which was removed in favour of
Block::newFromTarget, which has its own logic for checking the target.

Since the method is public, it should be deprecated before removal.

Change-Id: Ibcfb377a382f55e80933836960be7e3589908390
2019-03-27 22:56:05 +00:00
Thalia
79706a8c93 Move logic for checking block behaviour to Block class
User::trackBlockWithCookie and PasswordReset::isBlocked make decisions
about block behaviour based on the block parameters. This should be
done in the Block class.

Bug: T218905
Change-Id: Ia3f46abacdaf70e720b715b39dc60aed53be2d0a
2019-03-27 12:54:55 +00:00
jenkins-bot
3ebb169139 Merge "Simplify Block::getBy and Block::getByName" 2019-03-25 22:21:05 +00:00
Thalia
c397762920 Use Block::setTimestamp to set the timestamp on a block
Follow-up to I767ed44ce4c2e, where the setter was added.

Change-Id: I888e758aef44a101068bd52e89636e2656899f62
2019-03-25 15:16:19 +00:00
Thalia
1b9ca741a7 Remove reliance on Block properties being public
Use getters and setters for $mReason, $mTimestamp, $mExpiry and
$mHideName; use Block::getType to check if a block is an autoblock
instead of checking $mAuto; no change needed for $mParentBlockId,
which is not accessed externally.

Change-Id: I767ed44ce4c2e21f53962d75fb86891add2282f6
2019-03-22 21:17:22 +00:00
Thalia
8b77749599 Simplify Block::getBy and Block::getByName
Block::getBlocker always returns a User, so there is no need for
these methods to check.

Change-Id: I0319f0aee8d3fb3c89e8f63ee2f4ba05c8d36482
2019-03-22 19:19:41 +00:00
Thalia
b53095fc36 Remove deprecated handling of multiple arguments by the Block constructor
Also remove test for the deprecated functionality.

Bug: T218892
Change-Id: I37ab858494a173c6982bb16bf1c362d5dd790e23
2019-03-21 14:34:48 +00:00
jenkins-bot
b972c452b5 Merge "Block: Explicit convert Message to string" 2019-03-09 20:08:22 +00:00
Fomafix
a6a05adba1 Block: Explicit convert Message to string
Without a converting method like ->parse(), ->escaped() or ->text() the
method __toString() is used which is a equivalent to ->parse().

This change switches from ->parse() to ->text() and let Html::element do
the HTML escaping, because the message 'autoblockid' is not needed to
parse.

Change-Id: I653906bdca0864989ffed5960505b96053456066
2019-03-08 19:34:28 +01:00
Thalia
fa98878370 Document the 'sitewide' option for the Block class
Change-Id: Ie2bebc6e9b42e21159cba35315b86c2d1971bf33
2019-02-28 11:43:01 +00:00
David Barratt
680565ed3f
Remove Target/User validation from Block::appliesToUsertalk()
This fixes a regression in I0e131696419211319082cb454f4f05297e55d22e where
an IP block that also blocks logged in users from editing, throws an exception.

The target/user validation in Block::appliesToUsertalk() does not work well
when an IP block prevents logged in users from editing. This case throws a
validation error, when in reality it should make a judgement.

This change means that the method will now trust whatever is passed into it as
the current user's talk page.

Bug: T211578
Change-Id: I3bb27cf7bec8421d31aa4de28a0e658365bb5bf2
2019-02-25 15:22:21 -05:00
Thalia
1f95fe2e70 Block: Remove unnecessary lines related to old use of Block::prevents
Block::prevents simply returns true for 'edit'. In Block::newLoad,
prevents was called as a setter with 'edit', but there was nothing
to set - this call was removed in I0e1316964192113. This patch
removes some more lines related to that call.

Originally added in r84475 (6dbcdc1be0) for T15611.

Change-Id: I8778229d7adfcdee9e21cf560462ef7e7d1c67b3
2019-02-21 20:16:54 +00:00
Thalia
02cb7aefef Separate out different functionalities of Block::prevents
Block::prevents plays several different roles:
* acts as get/setter for Boolean properties that correspond to
ipb_create_account, ipb_block_email and ipb_allow_usertalk
* calculates whether a block blocks a given right, based on Block
properties, global configs, white/blacklists and anonymous user
rights
* decides whether a block prevents editing of the target's own
user talk page (listed separately because 'editownusertalk' is
not a right)

This patch:
* renames mDisableUsertalk to allowEditUsertalk (and reverses the
value), to match the field ipb_allow_usertalk and make this logic
easier to follow
* renames mCreateAccount to blockCreateAccount, to make it clear
that the flag blocks account creation when true, and make this
logic easier to follow
* decouples the block that is stored in the database (which now
reflects the form that the admin submitted) and the behaviour of
the block on enforcement (since the properties set by the admin
can be overridden by global configs) - so if the global configs
change, the block behaviour could too
* creates get/setters for blockCreateAccount, mBlockEmail and
allowEditUsertalk properties
* creates appliesToRight, exclusively for checking whether the
block blocks a given right, taking into account the block
properties, global configs and anonymous user rights
* creates appliesToUsertalk, for checking whether the block
blocks a user from editing their own talk page. The block is
unaware of the user trying to make the edit, and this user is not
always the same as the block target, e.g. if the block target is
an IP range. Therefore the user's talk page is passed in to this
method. appliesToUsertalk can be called from anywhere where the
user is known
* uses the get/setters wherever Block::prevents was being used as
such
* uses appliesToRight whenever Block::prevents was being used to
determine if the block blocks a given right
* uses appliesToUsertalk in User::isBlockedFrom

Bug: T211578
Bug: T214508
Change-Id: I0e131696419211319082cb454f4f05297e55d22e
2019-02-21 18:21:28 +00:00
Thalia
dd5aa60524 Improve documentation for different block types
Clarify the purposes of Block::type and Block::getType

Change-Id: I64a2695f430c7718c504edb1fa6531a529c115cf
2019-02-15 19:52:45 +00:00
David Barratt
c3ee8fa1f8 Ensure action object matches passed in right in Title::checkUserBlock()
There is a possibility that the retrieved action (by name) will not match the
passed in right, we should ensure that the retrieved action matches.

Also adds 'purge' to the whitelist of actions that are not prevented by a
block.

Bug: T213220
Change-Id: I5671dcd6f004b1663c8a5c5aec200abbf742ec1d
2019-02-07 19:11:42 +00:00
Dayllan Maza
e77fdb8999 Fix 'ipb_sitewide' not matching parent block after update
Autoblocks ipb_sitewide was not being updated when changing the parent
block from sitewide to partial and vice-versa

Bug: T215205
Change-Id: Ied5a8361a733c47f0afea78cc955732261ede446
2019-02-04 17:31:55 -05:00
David Barratt
be27181956 Add NamespaceRestriction class so that BlockRestriction can handle namespaces.
This begins work on making namespaces a valid restriction type. The CRUD
operations of BlockRestriction can now handle namespaces. Since
NamespaceRestriction implements Restriction, enforcement should start working
immediately, but testing enforcement will come in a subsequent patch since it's
impossible to create them.

Bug: T204991
Change-Id: I7264b452d9ad788c146d6ea25d01d4d7cb5ac4f6
2019-01-21 14:19:39 +00:00
Thiemo Kreuz
734a969d55 Safe replacement of a lot of !count() with === []
This was originally a global search and replace. I manually checked all
replacements and reverted them if (due to the lack of type hints) either
null (that would be 0 when counted) or a Countable object can end in the
variable or property in question.

Now this patch only touches places where I'm sure nothing can break.

For the sanity of the honorable reviewers this patch is exclusively touching
negated counts. You should not find a single `!== []` in this patch, that
would be a mistake.

Change-Id: I5eafd4d8fccdb53a668be8e6f25a566f9c3a0a95
2019-01-15 17:28:49 +01:00
Thalia
d11e342ed6 Add @since tags to new public methods related to partial blocks
Bug: T210369
Change-Id: I20197ceee8e5e43fac20addc494b841519b915c8
2019-01-08 12:44:33 +00:00
Dayllan Maza
05a5b8e749 Add new rules when user is blocked for UTP
No changes for sitewide blocks when "Prevent user... edit own talk page"
is checked. On partial blocks, this option will be disabled and ignored. All users
will be allowed to edit their own talk page unless a page restriction
for their page is in place.

New rules will be implemented for Namespace restrictions in a different
patch when Namespace blocking is ready.

Bug: T210475
Change-Id: I096edf2887441bccd59f09bf0eceb3988b36db1e
2018-12-11 00:01:29 -05:00
Brad Jorsch
74ff87d291 Block: Clean up handling of non-User targets
The fix applied in d67121f6d took care of the immediate issue in
T208398, but after further analysis it was not a correct fix.

* Near line 770, the method shouldn't even be called unless the target
  is TYPE_USER.
* Near line 1598, it isn't dealing with a target at all.
* Near line 1813, you're not going to get a sensible result trying to
  call `$user->getTalkPage()` for a range or auto-block ID. What you
  would really need there to handle range and auto-blocks correctly is
  to pass in the User actually making the edit.

But after some pushback in code review about passing the User into
Block::preventsEdit() to make line 1813 work, we'll instead replace the
method with Block::appliesToTitle() and put the check for user talk
pages back into User::isBlockedFrom().

Bug: T208398
Bug: T208472
Change-Id: I23d3a3a1925e97f0cabe328c1cc74e978cb4d24a
2018-11-02 12:33:57 -04:00
James D. Forrester
eab725e3f1 Follow-up d67121f6d: Blocks can apply to non-User objects too
Bug: T208398
Change-Id: I1d39f4ff709f37e7047f49964101e83c97cda0e9
2018-10-31 08:50:46 -07:00
Dayllan Maza
d67121f6d3 Enforce partial blocks
Enforce partial blocks and display a slightly different block
notice depending on if the block is sitewide or not

Bug: T197117
Depends-On: I675316dddf272fd0d6172ecad3882160752bf780
Change-Id: I8a3635a4a04a33912eb139b7b13c4bd874183d31
2018-10-24 00:57:48 +00:00
Dayllan Maza
a562611e5b Add block restriction classes
Partial blocks logic will be used in multiple places. This
classes will group block restriction functionality to avoid
code duplication

Bug: T202036
Change-Id: I675316dddf272fd0d6172ecad3882160752bf780
2018-10-23 17:41:50 -07:00
Brad Jorsch
993baa3493 ActorMigration: Remove possibility of read-both
When this was originally written, the plan was to read both the old and
new fields during the transition period, while stopping writes to them
midway through. It turns out that the WHERE conditions to do read-both
correctly are generally not handled well by the database and working
around that would require a lot of complicated code (see what's being
removed from ApiQueryUserContribs here, for example).

We can simplify things greatly by instead having it write both fields
during the transition period, reading from the old for the first part
and the new for the second part, as is being done for MCR.

Bug: T204669
Change-Id: I4764c1c7883dc1003cb12729455c8107319f70b1
Depends-On: I845f6ae462f2539ebd35cbb5f2ca8b5714e2c1fb
Depends-On: I88b31b977543fdbdf69f8c1158e77e448df94e11
2018-10-11 12:12:00 +11:00
Fomafix
1472f02b36 Phabricator: Use Tddddd instead of Bug ddddd in comments
Change-Id: Ic9fe03cab270bd6be738af346164ad5d31a0d780
2018-10-04 09:15:02 +02:00
jenkins-bot
ef97002179 Merge "Simplify PHP by using ?? and ?:" 2018-07-11 09:09:18 +00:00
Fomafix
6866cfec37 Simplify PHP by using ?? and ?:
Also remove not necessary surrounding parentheses.

Change-Id: I0eb5c9c1bdfb09a800258379cdcefb5fd4d3d21c
2018-07-10 20:03:17 +00:00
Umherirrender
130ec2523d Fix PhanTypeMismatchDeclaredParam
Auto fix MediaWiki.Commenting.FunctionComment.DefaultNullTypeParam sniff

Change-Id: I865323fd0295aabd06f3e3c75e0e5043fb31069e
2018-07-07 00:34:30 +00:00
Brad Jorsch
377ce5a469 Fix error in various deprecated selectFields() methods
When aliasing a field to null, it has to be aliased to the string 'NULL'
rather than PHP null.

Bug: T198687
Change-Id: I6096f306b97022da781eaabeb15e502f391673a9
2018-07-03 11:59:18 -04:00
Bartosz Dziewoński
485f66f174 Use PHP 7 '??' operator instead of '?:' with 'isset()' where convenient
Find: /isset\(\s*([^()]+?)\s*\)\s*\?\s*\1\s*:\s*/
Replace with: '\1 ?? '

(Everywhere except includes/PHPVersionCheck.php)
(Then, manually fix some line length and indentation issues)

Then manually reviewed the replacements for cases where confusing
operator precedence would result in incorrect results
(fixing those in I478db046a1cc162c6767003ce45c9b56270f3372).

Change-Id: I33b421c8cb11cdd4ce896488c9ff5313f03a38cf
2018-05-30 18:06:13 -07:00
Kunal Mehta
230958d97c Autofix MediaWiki.Commenting.FunctionComment.SpacingDoc* errors
Change-Id: I63761ebce04c03b9b13237919c27cc10180f198f
2018-05-19 14:07:03 -07:00
Aaron Schulz
f6d1dae3f8 Switch Block::purgeExpired to use AutoCommitUpdate
This can slightly lower contention by reducing transaction time.

Change-Id: I8963d89ae8a28dee50c40ff411cd562331c9c316
2018-02-28 15:54:57 -08:00
jenkins-bot
4d9dbc7d8d Merge "Do not run ipblocks cleanup randomly, just do it all the time" 2018-02-28 03:53:48 +00:00
Amir Sarabadani
e284588df6 Do not run ipblocks cleanup randomly, just do it all the time
It's a deferred update and the number of blocks are small

Change-Id: I75e0b7dc38b22f8aa7453582d535a8ab8121fd1a
2018-02-28 03:45:03 +00:00
Brad Jorsch
27c61fb1e9 Add actor table and code to start using it
Storing the user name or IP in every row in large tables like revision
and logging takes up space and makes operations on these tables slower.
This patch begins the process of moving those into one "actor" table
which other tables can reference with a single integer field.

A subsequent patch will remove the old columns.

Bug: T167246
Depends-On: I9293fd6e0f958d87e52965de925046f1bb8f8a50
Change-Id: I8d825eb02c69cc66d90bd41325133fd3f99f0226
2018-02-23 10:06:20 -08:00
addshore
e5879da149 Pass $key into CommentStore methods and use MediawikiServices
This allows CommentStore to be added to MediaWikiServices
without the need of an aditional Factory.

This change includes a compatability layer to allow the behaviour
from 1.30 to continue to be used while deprecated.

CommentStore::newKey has been deprecated.
Keys are now passed into the public methods of CommentStore
where needed.
The following CommentStore methods have had their signatures changed
to introduced a $key parameter, but when used in conjunction with
CommentStore::newKey behaviour will remain unchanged:
  * CommentStore::getFields
  * CommentStore::getJoin
  * CommentStore::getComment
  * CommentStore::getCommentLegacy
  * CommentStore::insert
  * CommentStore::insertWithTemplate

Change-Id: I3abb62a5cfb0dcd456da9f4eb35583476ae41cfb
2018-02-05 15:34:12 +00:00
Brad Jorsch
96bd79b4a3 Avoid DB rows with usable names but ID = 0 by introducing "interwiki" usernames
Importing revisions in MediaWiki has long been weird: if the username on
the imported revision exists locally it's automatically attributed to
the local user, while if the name does not exist locally we wind up with
revision table rows with rev_user = 0 and rev_user_text being a valid
name that someone might later create. "Global" blocks too create rows
with ipb_by = 0 an ipb_by_text being a valid name.

The upcoming actor table change, as things currently stand, would
regularize that a bit by automatically attributing those imported
revisions to the newly-created user. But that's not necessarily what we
actually want to happen. And it would certainly confuse CentralAuth's
attempt to detect its own global blocks.

Thus, this patch introduces "interwiki" usernames that aren't valid for
local use, of the format "iw>Example".[1] Linker will interpret these
names and generate an appropriate interwiki link in history pages and
the like, as if from wikitext like `[[iw:User:Example]]`.

Imports for non-existant local users (and optionally for existing local
users too) will credit the edit to such an interwiki name. There is also
a new hook, 'ImportHandleUnknownUser', to allow extension such as
CentralAuth to create local users as their edits are imported.

Block will no longer accept usable-but-nonexistent names for 'byText' or
->setBlocker(). CentralAuth's global blocks will be submitted with an
interwiki username (see Ieae5d24f9).

Wikis that have imported edits or CentralAuth global blocks should run
the new maintenance/cleanupUsersWithNoId.php maintenance script. This
isn't done by update.php because (1) it needs an interwiki prefix to use
and (2) the updater can't know whether to pass the `--assign` flag.

[1]: '>' was used instead of the more usual ':' because WMF wikis have
many existing usernames containing colons.

Bug: T9240
Bug: T20209
Bug: T111605
Change-Id: I5401941c06102e8faa813910519d55482dff36cb
Depends-On: Ieae5d24f9098c1977447c50a8d4e2cab58a24d9f
2017-11-30 13:12:44 +11:00
Brad Jorsch
3488f49532 Replace selectFields() methods with getQueryInfo()
Several classes have a "selectFields()" static method to tell callers
which fields to select from the database. With the recent comment table
change and the upcoming actor table change, this pattern has become too
simplistic as a SELECT will need to join several tables to be able to
retrieve all the needed fields.

Thus, we deprecate the selectFields() methods in favor of getQueryInfo()
methods that return tables and join conditions in addition to the
fields.

Change-Id: Idcfd15568489d9f03a7ba4460e96610d33bc4089
2017-10-30 22:57:33 +00:00
Aaron Schulz
ab88fdd85e Rename some cache keys with odd virtual hierarchies
This makes automatic statsd metrics more useful.

Change-Id: I07d87dcb8ce9b42cc2f1c84ac4c06d177d463b1d
2017-10-24 18:42:43 -07:00
Umherirrender
f739a8f368 Improve some parameter docs
Add missing @return and @param to function docs and fixed some @param

Change-Id: I810727961057cfdcc274428b239af5975c57468d
2017-09-10 20:32:31 +02:00
Brad Jorsch
01a10dba5a Remove reference to deprecated IDatabase->nextSequenceValue()
The method was deprecated and made unnecessary in Ib308190c.

Change-Id: I1729ac0b3a88270a4c2f064187a2472112aaeb1e
2017-09-01 12:28:39 -04:00