2019-06-26 02:33:35 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace MediaWiki\Tests\Rest\BasicAccess;
|
|
|
|
|
|
|
|
|
|
use GuzzleHttp\Psr7\Uri;
|
2019-09-13 21:07:59 +00:00
|
|
|
use MediaWiki\Permissions\PermissionManager;
|
2019-06-26 02:33:35 +00:00
|
|
|
use MediaWiki\Rest\BasicAccess\MWBasicAuthorizer;
|
2019-07-09 02:39:06 +00:00
|
|
|
use MediaWiki\Rest\Handler;
|
2019-06-26 02:33:35 +00:00
|
|
|
use MediaWiki\Rest\RequestData;
|
|
|
|
|
use MediaWiki\Rest\ResponseFactory;
|
|
|
|
|
use MediaWiki\Rest\Router;
|
2019-06-12 19:51:59 +00:00
|
|
|
use MediaWiki\Rest\Validator\Validator;
|
2019-06-26 02:33:35 +00:00
|
|
|
use MediaWikiTestCase;
|
2019-06-12 19:51:59 +00:00
|
|
|
use Psr\Container\ContainerInterface;
|
2019-06-26 02:33:35 +00:00
|
|
|
use User;
|
2019-06-12 19:51:59 +00:00
|
|
|
use Wikimedia\ObjectFactory;
|
2019-06-26 02:33:35 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @group Database
|
|
|
|
|
*
|
|
|
|
|
* @covers \MediaWiki\Rest\BasicAccess\BasicAuthorizerBase
|
|
|
|
|
* @covers \MediaWiki\Rest\BasicAccess\MWBasicAuthorizer
|
|
|
|
|
* @covers \MediaWiki\Rest\BasicAccess\BasicRequestAuthorizer
|
|
|
|
|
* @covers \MediaWiki\Rest\BasicAccess\MWBasicRequestAuthorizer
|
|
|
|
|
*/
|
|
|
|
|
class MWBasicRequestAuthorizerTest extends MediaWikiTestCase {
|
2019-06-12 19:51:59 +00:00
|
|
|
private function createRouter( $userRights, $request ) {
|
2019-06-26 02:33:35 +00:00
|
|
|
$user = User::newFromName( 'Test user' );
|
2019-06-12 19:51:59 +00:00
|
|
|
$objectFactory = new ObjectFactory(
|
|
|
|
|
$this->getMockForAbstractClass( ContainerInterface::class )
|
|
|
|
|
);
|
2019-09-13 21:07:59 +00:00
|
|
|
$permissionManager = $this->createMock( PermissionManager::class );
|
|
|
|
|
// Don't allow the rights to everybody so that user rights kick in.
|
|
|
|
|
$permissionManager->method( 'isEveryoneAllowed' )->willReturn( false );
|
|
|
|
|
$permissionManager->method( 'userHasRight' )
|
|
|
|
|
->will( $this->returnCallback( function ( $user, $action ) use ( $userRights ) {
|
|
|
|
|
return isset( $userRights[$action] ) && $userRights[$action];
|
|
|
|
|
} ) );
|
|
|
|
|
|
|
|
|
|
global $IP;
|
2019-06-12 19:51:59 +00:00
|
|
|
|
2019-06-26 02:33:35 +00:00
|
|
|
return new Router(
|
|
|
|
|
[ "$IP/tests/phpunit/unit/includes/Rest/testRoutes.json" ],
|
|
|
|
|
[],
|
|
|
|
|
'/rest',
|
|
|
|
|
new \EmptyBagOStuff(),
|
2019-07-16 22:43:43 +00:00
|
|
|
new ResponseFactory( [] ),
|
2019-09-13 21:07:59 +00:00
|
|
|
new MWBasicAuthorizer( $user, $permissionManager ),
|
2019-06-12 19:51:59 +00:00
|
|
|
$objectFactory,
|
2019-09-13 21:07:59 +00:00
|
|
|
new Validator( $objectFactory, $permissionManager, $request, $user )
|
2019-06-12 19:51:59 +00:00
|
|
|
);
|
2019-06-26 02:33:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testReadDenied() {
|
|
|
|
|
$request = new RequestData( [ 'uri' => new Uri( '/rest/user/joe/hello' ) ] );
|
2019-06-12 19:51:59 +00:00
|
|
|
$router = $this->createRouter( [ 'read' => false ], $request );
|
2019-06-26 02:33:35 +00:00
|
|
|
$response = $router->execute( $request );
|
|
|
|
|
$this->assertSame( 403, $response->getStatusCode() );
|
|
|
|
|
|
|
|
|
|
$body = $response->getBody();
|
|
|
|
|
$body->rewind();
|
|
|
|
|
$data = json_decode( $body->getContents(), true );
|
|
|
|
|
$this->assertSame( 'rest-read-denied', $data['error'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testReadAllowed() {
|
|
|
|
|
$request = new RequestData( [ 'uri' => new Uri( '/rest/user/joe/hello' ) ] );
|
2019-06-12 19:51:59 +00:00
|
|
|
$router = $this->createRouter( [ 'read' => true ], $request );
|
2019-06-26 02:33:35 +00:00
|
|
|
$response = $router->execute( $request );
|
|
|
|
|
$this->assertSame( 200, $response->getStatusCode() );
|
|
|
|
|
}
|
2019-07-09 02:39:06 +00:00
|
|
|
|
|
|
|
|
public static function writeHandlerFactory() {
|
|
|
|
|
return new class extends Handler {
|
|
|
|
|
public function needsWriteAccess() {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function execute() {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testWriteDenied() {
|
|
|
|
|
$request = new RequestData( [
|
|
|
|
|
'uri' => new Uri( '/rest/mock/MWBasicRequestAuthorizerTest/write' )
|
|
|
|
|
] );
|
2019-06-12 19:51:59 +00:00
|
|
|
$router = $this->createRouter( [ 'read' => true, 'writeapi' => false ], $request );
|
2019-07-09 02:39:06 +00:00
|
|
|
$response = $router->execute( $request );
|
|
|
|
|
$this->assertSame( 403, $response->getStatusCode() );
|
|
|
|
|
|
|
|
|
|
$body = $response->getBody();
|
|
|
|
|
$body->rewind();
|
|
|
|
|
$data = json_decode( $body->getContents(), true );
|
|
|
|
|
$this->assertSame( 'rest-write-denied', $data['error'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testWriteAllowed() {
|
|
|
|
|
$request = new RequestData( [
|
|
|
|
|
'uri' => new Uri( '/rest/mock/MWBasicRequestAuthorizerTest/write' )
|
|
|
|
|
] );
|
2019-06-12 19:51:59 +00:00
|
|
|
$router = $this->createRouter( [ 'read' => true, 'writeapi' => true ], $request );
|
2019-07-09 02:39:06 +00:00
|
|
|
$response = $router->execute( $request );
|
|
|
|
|
|
|
|
|
|
$this->assertSame( 200, $response->getStatusCode() );
|
|
|
|
|
}
|
2019-06-26 02:33:35 +00:00
|
|
|
}
|