MediaWiki  master
HTMLUserTextField.php
Go to the documentation of this file.
1 <?php
2 
4 use Wikimedia\IPUtils;
5 
24  public function __construct( $params ) {
25  $params = wfArrayPlus2d( $params, [
26  'exists' => false,
27  'ipallowed' => false,
28  'iprange' => false,
29  'iprangelimits' => [
30  'IPv4' => 0,
31  'IPv6' => 0,
32  ],
33  ]
34  );
35 
36  parent::__construct( $params );
37  }
38 
39  public function validate( $value, $alldata ) {
40  // If the value is null, reset it to an empty string which is what is expected by the parent.
41  if ( $value === null ) {
42  $value = '';
43  }
44 
45  // If the value is empty, there are no additional checks that can be performed.
46  if ( $value === '' ) {
47  return parent::validate( $value, $alldata );
48  }
49 
50  // check if the input is a valid username
51  $user = User::newFromName( $value );
52  if ( $user ) {
53  // check if the user exists, if requested
54  if ( $this->mParams['exists'] && !(
55  $user->isRegistered() &&
56  // Treat hidden users as unregistered if current user can't view them (T309894)
57  !( $user->isHidden() && !( $this->mParent && $this->mParent->getUser()->isAllowed( 'hideuser' ) ) )
58  ) ) {
59  return $this->msg( 'htmlform-user-not-exists', $user->getName() );
60  }
61  } else {
62  // not a valid username
63  $valid = false;
64  // check if the input is a valid IP address
65  if ( $this->mParams['ipallowed'] && IPUtils::isValid( $value ) ) {
66  $valid = true;
67  }
68  // check if the input is a valid IP range
69  if ( $this->mParams['iprange'] ) {
70  $rangeError = $this->isValidIPRange( $value );
71  if ( $rangeError === true ) {
72  $valid = true;
73  } elseif ( $rangeError !== false ) {
74  return $rangeError;
75  }
76  }
77  if ( !$valid ) {
78  return $this->msg( 'htmlform-user-not-valid', $value );
79  }
80  }
81 
82  return parent::validate( $value, $alldata );
83  }
84 
85  protected function isValidIPRange( $value ) {
86  $cidrIPRanges = $this->mParams['iprangelimits'];
87 
88  if ( !IPUtils::isValidRange( $value ) ) {
89  return false;
90  }
91 
92  [ $ip, $range ] = explode( '/', $value, 2 );
93 
94  if (
95  ( IPUtils::isIPv4( $ip ) && $cidrIPRanges['IPv4'] == 32 ) ||
96  ( IPUtils::isIPv6( $ip ) && $cidrIPRanges['IPv6'] == 128 )
97  ) {
98  // Range block effectively disabled
99  return $this->msg( 'ip_range_toolow' );
100  }
101 
102  if (
103  ( IPUtils::isIPv4( $ip ) && $range > 32 ) ||
104  ( IPUtils::isIPv6( $ip ) && $range > 128 )
105  ) {
106  // Dodgy range
107  return $this->msg( 'ip_range_invalid' );
108  }
109 
110  if ( IPUtils::isIPv4( $ip ) && $range < $cidrIPRanges['IPv4'] ) {
111  return $this->msg( 'ip_range_exceeded', $cidrIPRanges['IPv4'] );
112  }
113 
114  if ( IPUtils::isIPv6( $ip ) && $range < $cidrIPRanges['IPv6'] ) {
115  return $this->msg( 'ip_range_exceeded', $cidrIPRanges['IPv6'] );
116  }
117 
118  return true;
119  }
120 
121  protected function getInputWidget( $params ) {
122  return new UserInputWidget( $params );
123  }
124 
125  protected function shouldInfuseOOUI() {
126  return true;
127  }
128 
129  protected function getOOUIModules() {
130  return [ 'mediawiki.widgets.UserInputWidget' ];
131  }
132 
133  public function getInputHtml( $value ) {
134  // add the required module and css class for user suggestions in non-OOUI mode
135  $this->mParent->getOutput()->addModules( 'mediawiki.userSuggest' );
136  $this->mClass .= ' mw-autocomplete-user';
137 
138  // return parent html
139  return parent::getInputHTML( $value );
140  }
141 }
wfArrayPlus2d(array $baseArray, array $newValues)
Merges two (possibly) 2 dimensional arrays into the target array ($baseArray).
msg( $key,... $params)
Get a translated interface message.
<input> field.
Implements a text input field for user names.
shouldInfuseOOUI()
Whether the field should be automatically infused.
getOOUIModules()
Get the list of extra ResourceLoader modules which must be loaded client-side before it's possible to...
validate( $value, $alldata)
Override this function to add specific validation checks on the field input.
static newFromName( $name, $validate='valid')
Definition: User.php:587