diff options
Diffstat (limited to 'includes/Rest/Validator/ParamValidatorCallbacks.php')
-rw-r--r-- | includes/Rest/Validator/ParamValidatorCallbacks.php | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/includes/Rest/Validator/ParamValidatorCallbacks.php b/includes/Rest/Validator/ParamValidatorCallbacks.php new file mode 100644 index 000000000000..6c54a504d796 --- /dev/null +++ b/includes/Rest/Validator/ParamValidatorCallbacks.php @@ -0,0 +1,82 @@ +<?php + +namespace MediaWiki\Rest\Validator; + +use InvalidArgumentException; +use MediaWiki\Rest\RequestInterface; +use Psr\Http\Message\UploadedFileInterface; +use User; +use Wikimedia\ParamValidator\Callbacks; +use Wikimedia\ParamValidator\ValidationException; + +class ParamValidatorCallbacks implements Callbacks { + + /** @var RequestInterface */ + private $request; + + /** @var User */ + private $user; + + public function __construct( RequestInterface $request, User $user ) { + $this->request = $request; + $this->user = $user; + } + + /** + * Get the raw parameters from a source in the request + * @param string $source 'path', 'query', or 'post' + * @return array + */ + private function getParamsFromSource( $source ) { + switch ( $source ) { + case 'path': + return $this->request->getPathParams(); + + case 'query': + return $this->request->getQueryParams(); + + case 'post': + return $this->request->getPostParams(); + + default: + throw new InvalidArgumentException( __METHOD__ . ": Invalid source '$source'" ); + } + } + + public function hasParam( $name, array $options ) { + $params = $this->getParamsFromSource( $options['source'] ); + return isset( $params[$name] ); + } + + public function getValue( $name, $default, array $options ) { + $params = $this->getParamsFromSource( $options['source'] ); + return $params[$name] ?? $default; + // @todo Should normalization to NFC UTF-8 be done here (much like in the + // action API and the rest of MW), or should it be left to handlers to + // do whatever normalization they need? + } + + public function hasUpload( $name, array $options ) { + if ( $options['source'] !== 'post' ) { + return false; + } + return $this->getUploadedFile( $name, $options ) !== null; + } + + public function getUploadedFile( $name, array $options ) { + if ( $options['source'] !== 'post' ) { + return null; + } + $upload = $this->request->getUploadedFiles()[$name] ?? null; + return $upload instanceof UploadedFileInterface ? $upload : null; + } + + public function recordCondition( ValidationException $condition, array $options ) { + // @todo Figure out how to handle warnings + } + + public function useHighLimits( array $options ) { + return $this->user->isAllowed( 'apihighlimits' ); + } + +} |