3 namespace MediaWiki\Rest\Validator
;
5 use InvalidArgumentException
;
6 use MediaWiki\Permissions\PermissionManager
;
7 use MediaWiki\Rest\RequestInterface
;
8 use MediaWiki\User\UserIdentity
;
9 use Psr\Http\Message\UploadedFileInterface
;
10 use Wikimedia\ParamValidator\Callbacks
;
11 use Wikimedia\ParamValidator\ValidationException
;
13 class ParamValidatorCallbacks
implements Callbacks
{
15 /** @var PermissionManager */
16 private $permissionManager;
18 /** @var RequestInterface */
21 /** @var UserIdentity */
24 public function __construct(
25 PermissionManager
$permissionManager,
26 RequestInterface
$request,
29 $this->permissionManager
= $permissionManager;
30 $this->request
= $request;
35 * Get the raw parameters from a source in the request
36 * @param string $source 'path', 'query', or 'post'
39 private function getParamsFromSource( $source ) {
42 return $this->request
->getPathParams();
45 return $this->request
->getQueryParams();
48 return $this->request
->getPostParams();
51 throw new InvalidArgumentException( __METHOD__
. ": Invalid source '$source'" );
55 public function hasParam( $name, array $options ) {
56 $params = $this->getParamsFromSource( $options['source'] );
57 return isset( $params[$name] );
60 public function getValue( $name, $default, array $options ) {
61 $params = $this->getParamsFromSource( $options['source'] );
62 return $params[$name] ??
$default;
63 // @todo Should normalization to NFC UTF-8 be done here (much like in the
64 // action API and the rest of MW), or should it be left to handlers to
65 // do whatever normalization they need?
68 public function hasUpload( $name, array $options ) {
69 if ( $options['source'] !== 'post' ) {
72 return $this->getUploadedFile( $name, $options ) !== null;
75 public function getUploadedFile( $name, array $options ) {
76 if ( $options['source'] !== 'post' ) {
79 $upload = $this->request
->getUploadedFiles()[$name] ??
null;
80 return $upload instanceof UploadedFileInterface ?
$upload : null;
83 public function recordCondition( ValidationException
$condition, array $options ) {
84 // @todo Figure out how to handle warnings
87 public function useHighLimits( array $options ) {
88 return $this->permissionManager
->userHasRight( $this->user
, 'apihighlimits' );