Why:
* In 19238b429f, the
ContributionsSpecialPage class was modified to not perform
queries if the submitted form data was not determined to
be valid.
* This was necessary to allow IPContributions in CheckUser to
not run the query if the form was invalid.
* However, this broke looking up contributions from IPs that have
the UseMod wiki format (i.e. "xxx" instead of the last octet of
an IPv4 address) because the HTMLUserTextField class does not
consider these as valid IP addresses.
* Fixing this is necessary to allow looking up contributions from
these IPs in the contribution pagers.
What:
* Update HTMLUserTextField to have a 'usemodwiki-ipallowed' option
that when specified as true will allow IP addresses in with the
UseMod wiki format.
** This is done via the regex used by UserDef::processUser which
determines if an IP is a UseMod wiki IP
** This option is only used if the 'ipallowed' option is also set
to true.
* Update ContributionsSpecialPage::getTargetField to specify that
the 'target' field should allow UseMod wiki IP addresses.
* Add tests for the changes to HTMLUserTextField and also a
regression test via SpecialContributionsTest.
Bug: T370413
Change-Id: I2b1d981a21c7b85c22a371708776c7ca127dec4c
134 lines
3.5 KiB
PHP
134 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Tests\Integration\HTMLForm\Field;
|
|
|
|
use MediaWiki\HTMLForm\Field\HTMLUserTextField;
|
|
use MediaWiki\HTMLForm\HTMLForm;
|
|
use MediaWiki\Message\Message;
|
|
use MediaWiki\User\UserFactory;
|
|
use MediaWikiIntegrationTestCase;
|
|
|
|
/**
|
|
* @covers \MediaWiki\HTMLForm\Field\HTMLUserTextField
|
|
*/
|
|
class HTMLUserTextFieldTest extends MediaWikiIntegrationTestCase {
|
|
|
|
/**
|
|
* @dataProvider provideInputs
|
|
*/
|
|
public function testInputs( array $config, string $value, $expected ) {
|
|
$origUserFactory = $this->getServiceContainer()->getUserFactory();
|
|
$userFactory = $this->createMock( UserFactory::class );
|
|
$userFactory->method( 'newFromName' )->willReturnCallback( static function ( ...$params ) use ( $origUserFactory ) {
|
|
$user = $origUserFactory->newFromName( ...$params );
|
|
if ( $user ) {
|
|
$user->mId = 0;
|
|
$user->setItemLoaded( 'id' );
|
|
}
|
|
return $user;
|
|
} );
|
|
$this->setService( 'UserFactory', $userFactory );
|
|
$htmlForm = $this->createMock( HTMLForm::class );
|
|
$htmlForm->method( 'msg' )->willReturnCallback( 'wfMessage' );
|
|
|
|
$field = new HTMLUserTextField( $config + [ 'fieldname' => 'foo', 'parent' => $htmlForm ] );
|
|
$result = $field->validate( $value, [ 'foo' => $value ] );
|
|
if ( $result instanceof Message ) {
|
|
$this->assertSame( $expected, $result->getKey() );
|
|
} else {
|
|
$this->assertSame( $expected, $result );
|
|
}
|
|
}
|
|
|
|
public static function provideInputs() {
|
|
return [
|
|
'valid username' => [
|
|
[],
|
|
'SomeUser',
|
|
true
|
|
],
|
|
'external username when not allowed' => [
|
|
[],
|
|
'imported>SomeUser',
|
|
'htmlform-user-not-valid'
|
|
],
|
|
'external username when allowed' => [
|
|
[ 'external' => true ],
|
|
'imported>SomeUser',
|
|
true
|
|
],
|
|
'valid IP' => [
|
|
[ 'ipallowed' => true ],
|
|
'1.2.3.4',
|
|
true
|
|
],
|
|
'valid IP, but not allowed' => [
|
|
[ 'ipallowed' => false ],
|
|
'1.2.3.4',
|
|
'htmlform-user-not-valid'
|
|
],
|
|
'invalid IP' => [
|
|
[ 'ipallowed' => true ],
|
|
'1.2.3.456',
|
|
'htmlform-user-not-valid'
|
|
],
|
|
'valid usemod IP' => [
|
|
[ 'usemodwiki-ipallowed' => true, 'ipallowed' => true, 'exists' => true ],
|
|
'1.2.3.xxx',
|
|
true,
|
|
],
|
|
'valid usemod IP, but not allowed' => [
|
|
[ 'usemodwiki-ipallowed' => false, 'ipallowed' => true, 'exists' => true ],
|
|
'1.2.3.xxx',
|
|
'htmlform-user-not-valid',
|
|
],
|
|
'invalid usemod IP because not enough "x"' => [
|
|
[ 'usemodwiki-ipallowed' => true, 'ipallowed' => true, 'exists' => true ],
|
|
'1.2.3.x',
|
|
'htmlform-user-not-exists',
|
|
],
|
|
'invalid usemod IP because capital "x"' => [
|
|
[ 'usemodwiki-ipallowed' => true, 'ipallowed' => true, 'exists' => true ],
|
|
'1.2.3.XXX',
|
|
'htmlform-user-not-exists',
|
|
],
|
|
'invalid usemod IP because first part not valid IPv4' => [
|
|
[ 'usemodwiki-ipallowed' => true, 'ipallowed' => true, 'exists' => true ],
|
|
'1.2.456.xxx',
|
|
'htmlform-user-not-valid',
|
|
],
|
|
'valid IP range' => [
|
|
[ 'iprange' => true ],
|
|
'1.2.3.4/30',
|
|
true
|
|
],
|
|
'valid IP range, but not allowed' => [
|
|
[ 'iprange' => false ],
|
|
'1.2.3.4/30',
|
|
'htmlform-user-not-valid'
|
|
],
|
|
'invalid IP range (bad syntax)' => [
|
|
[ 'iprange' => true ],
|
|
'1.2.3.4/x',
|
|
'htmlform-user-not-valid'
|
|
],
|
|
'invalid IP range (exceeds limits)' => [
|
|
[
|
|
'iprange' => true,
|
|
'iprangelimits' => [
|
|
'IPv4' => 11,
|
|
'IPv6' => 11,
|
|
],
|
|
],
|
|
'1.2.3.4/10',
|
|
'ip_range_exceeded'
|
|
],
|
|
'valid username, but does not exist' => [
|
|
[ 'exists' => true ],
|
|
'SomeUser',
|
|
'htmlform-user-not-exists'
|
|
],
|
|
];
|
|
}
|
|
|
|
}
|