Fixed spacing in db/debug/diff/externalstore/objectcache folder
[mediawiki.git] / includes / api / ApiOptions.php
blob8c996a267e4b88b25309ced4002b05490249c073
1 <?php
2 /**
5 * Created on Apr 15, 2012
7 * Copyright © 2012 Szymon Świerkosz beau@adres.pl
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 * http://www.gnu.org/copyleft/gpl.html
24 * @file
27 /**
28 * API module that facilitates the changing of user's preferences.
29 * Requires API write mode to be enabled.
31 * @ingroup API
33 class ApiOptions extends ApiBase {
35 /**
36 * Changes preferences of the current user.
38 public function execute() {
39 $user = $this->getUser();
41 if ( $user->isAnon() ) {
42 $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
45 $params = $this->extractRequestParams();
46 $changed = false;
48 if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
49 $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
52 if ( $params['reset'] ) {
53 $user->resetOptions( $params['resetkinds'] );
54 $changed = true;
57 $changes = array();
58 if ( count( $params['change'] ) ) {
59 foreach ( $params['change'] as $entry ) {
60 $array = explode( '=', $entry, 2 );
61 $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null;
64 if ( isset( $params['optionname'] ) ) {
65 $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
66 $changes[$params['optionname']] = $newValue;
68 if ( !$changed && !count( $changes ) ) {
69 $this->dieUsage( 'No changes were requested', 'nochanges' );
72 $prefs = Preferences::getPreferences( $user, $this->getContext() );
73 $prefsKinds = $user->getOptionKinds( $this->getContext(), $changes );
75 foreach ( $changes as $key => $value ) {
76 switch ( $prefsKinds[$key] ) {
77 case 'registered':
78 // Regular option.
79 $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
80 $validation = $field->validate( $value, $user->getOptions() );
81 break;
82 case 'registered-multiselect':
83 case 'registered-checkmatrix':
84 // A key for a multiselect or checkmatrix option.
85 $validation = true;
86 $value = $value !== null ? (bool) $value : null;
87 break;
88 case 'userjs':
89 // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
90 if ( strlen( $key ) > 255 ) {
91 $validation = "key too long (no more than 255 bytes allowed)";
92 } elseif ( preg_match( "/[^a-zA-Z0-9_-]/", $key ) !== 0 ) {
93 $validation = "invalid key (only a-z, A-Z, 0-9, _, - allowed)";
94 } else {
95 $validation = true;
97 break;
98 case 'unused':
99 default:
100 $validation = "not a valid preference";
101 break;
103 if ( $validation === true ) {
104 $user->setOption( $key, $value );
105 $changed = true;
106 } else {
107 $this->setWarning( "Validation error for '$key': $validation" );
111 if ( $changed ) {
112 // Commit changes
113 $user->saveSettings();
116 $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
119 public function mustBePosted() {
120 return true;
123 public function isWriteMode() {
124 return true;
127 public function getAllowedParams() {
128 $optionKinds = User::listOptionKinds();
129 $optionKinds[] = 'all';
131 return array(
132 'token' => array(
133 ApiBase::PARAM_TYPE => 'string',
134 ApiBase::PARAM_REQUIRED => true
136 'reset' => false,
137 'resetkinds' => array(
138 ApiBase::PARAM_TYPE => $optionKinds,
139 ApiBase::PARAM_DFLT => 'all',
140 ApiBase::PARAM_ISMULTI => true
142 'change' => array(
143 ApiBase::PARAM_ISMULTI => true,
145 'optionname' => array(
146 ApiBase::PARAM_TYPE => 'string',
148 'optionvalue' => array(
149 ApiBase::PARAM_TYPE => 'string',
154 public function getResultProperties() {
155 return array(
156 '' => array(
157 '*' => array(
158 ApiBase::PROP_TYPE => array(
159 'success'
166 public function getParamDescription() {
167 return array(
168 'token' => 'An options token previously obtained through the action=tokens',
169 'reset' => 'Resets preferences to the site defaults',
170 'resetkinds' => 'List of types of options to reset when the "reset" option is set',
171 'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters. If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value',
172 'optionname' => 'A name of a option which should have an optionvalue set',
173 'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
177 public function getDescription() {
178 return array(
179 'Change preferences of the current user',
180 'Only options which are registered in core or in one of installed extensions,',
181 'or as options with keys prefixed with \'userjs-\' (intended to be used by user scripts), can be set.'
185 public function getPossibleErrors() {
186 return array_merge( parent::getPossibleErrors(), array(
187 array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ),
188 array( 'code' => 'nochanges', 'info' => 'No changes were requested' ),
189 ) );
192 public function needsToken() {
193 return true;
196 public function getTokenSalt() {
197 return '';
200 public function getHelpUrls() {
201 return 'https://www.mediawiki.org/wiki/API:Options';
204 public function getExamples() {
205 return array(
206 'api.php?action=options&reset=&token=123ABC',
207 'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC',
208 'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',