diff options
Diffstat (limited to 'www/wiki/includes/htmlform/fields/HTMLRestrictionsField.php')
-rw-r--r-- | www/wiki/includes/htmlform/fields/HTMLRestrictionsField.php | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/www/wiki/includes/htmlform/fields/HTMLRestrictionsField.php b/www/wiki/includes/htmlform/fields/HTMLRestrictionsField.php new file mode 100644 index 00000000..0310dd02 --- /dev/null +++ b/www/wiki/includes/htmlform/fields/HTMLRestrictionsField.php @@ -0,0 +1,121 @@ +<?php + +/** + * Class for updating an MWRestrictions value (which is, currently, basically just an IP address + * list). + * + * Will be represented as a textarea with one address per line, with intelligent defaults for + * label, help text and row count. + * + * The value returned will be an MWRestrictions or the input string if it was not a list of + * valid IP ranges. + */ +class HTMLRestrictionsField extends HTMLTextAreaField { + const DEFAULT_ROWS = 5; + + public function __construct( array $params ) { + parent::__construct( $params ); + if ( !$this->mLabel ) { + $this->mLabel = $this->msg( 'restrictionsfield-label' )->parse(); + } + } + + public function getHelpText() { + $helpText = parent::getHelpText(); + if ( $helpText === null ) { + $helpText = $this->msg( 'restrictionsfield-help' )->parse(); + } + return $helpText; + } + + /** + * @param WebRequest $request + * @return string|MWRestrictions Restrictions object or original string if invalid + */ + public function loadDataFromRequest( $request ) { + if ( !$request->getCheck( $this->mName ) ) { + return $this->getDefault(); + } + + $value = rtrim( $request->getText( $this->mName ), "\r\n" ); + $ips = $value === '' ? [] : explode( "\n", $value ); + try { + return MWRestrictions::newFromArray( [ 'IPAddresses' => $ips ] ); + } catch ( InvalidArgumentException $e ) { + return $value; + } + } + + /** + * @return MWRestrictions + */ + public function getDefault() { + $default = parent::getDefault(); + if ( $default === null ) { + $default = MWRestrictions::newDefault(); + } + return $default; + } + + /** + * @param string|MWRestrictions $value The value the field was submitted with + * @param array $alldata The data collected from the form + * + * @return bool|string|Message True on success, or String/Message error to display, or + * false to fail validation without displaying an error. + */ + public function validate( $value, $alldata ) { + if ( $this->isHidden( $alldata ) ) { + return true; + } + + if ( + isset( $this->mParams['required'] ) && $this->mParams['required'] !== false + && $value instanceof MWRestrictions && !$value->toArray()['IPAddresses'] + ) { + return $this->msg( 'htmlform-required' ); + } + + if ( is_string( $value ) ) { + // MWRestrictions::newFromArray failed; one of the IP ranges must be invalid + $status = Status::newGood(); + foreach ( explode( "\n", $value ) as $range ) { + if ( !\IP::isIPAddress( $range ) ) { + $status->fatal( 'restrictionsfield-badip', $range ); + } + } + if ( $status->isOK() ) { + $status->fatal( 'unknown-error' ); + } + return $status->getMessage(); + } + + if ( isset( $this->mValidationCallback ) ) { + return call_user_func( $this->mValidationCallback, $value, $alldata, $this->mParent ); + } + + return true; + } + + /** + * @param string|MWRestrictions $value + * @return string + */ + public function getInputHTML( $value ) { + if ( $value instanceof MWRestrictions ) { + $value = implode( "\n", $value->toArray()['IPAddresses'] ); + } + return parent::getInputHTML( $value ); + } + + /** + * @param MWRestrictions $value + * @return string + */ + public function getInputOOUI( $value ) { + if ( $value instanceof MWRestrictions ) { + $value = implode( "\n", $value->toArray()['IPAddresses'] ); + } + return parent::getInputOOUI( $value ); + } +} |