From 63601400e476c6cf43d985f3e7b9864681695ed4 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 18 Jan 2013 16:46:04 +0100 Subject: Update to MediaWiki 1.20.2 this update includes: * adjusted Arch Linux skin * updated FluxBBAuthPlugin * patch for https://bugzilla.wikimedia.org/show_bug.cgi?id=44024 --- includes/api/ApiOptions.php | 183 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 includes/api/ApiOptions.php (limited to 'includes/api/ApiOptions.php') diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php new file mode 100644 index 00000000..265c2ccb --- /dev/null +++ b/includes/api/ApiOptions.php @@ -0,0 +1,183 @@ +getUser(); + + if ( $user->isAnon() ) { + $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' ); + } + + $params = $this->extractRequestParams(); + $changed = false; + + if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) { + $this->dieUsageMsg( array( 'missingparam', 'optionname' ) ); + } + + if ( $params['reset'] ) { + $user->resetOptions(); + $changed = true; + } + + $changes = array(); + if ( count( $params['change'] ) ) { + foreach ( $params['change'] as $entry ) { + $array = explode( '=', $entry, 2 ); + $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null; + } + } + if ( isset( $params['optionname'] ) ) { + $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null; + $changes[$params['optionname']] = $newValue; + } + if ( !$changed && !count( $changes ) ) { + $this->dieUsage( 'No changes were requested', 'nochanges' ); + } + + $prefs = Preferences::getPreferences( $user, $this->getContext() ); + foreach ( $changes as $key => $value ) { + if ( !isset( $prefs[$key] ) ) { + $this->setWarning( "Not a valid preference: $key" ); + continue; + } + $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] ); + $validation = $field->validate( $value, $user->getOptions() ); + if ( $validation === true ) { + $user->setOption( $key, $value ); + $changed = true; + } else { + $this->setWarning( "Validation error for '$key': $validation" ); + } + } + + if ( $changed ) { + // Commit changes + $user->saveSettings(); + } + + $this->getResult()->addValue( null, $this->getModuleName(), 'success' ); + } + + public function mustBePosted() { + return true; + } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + return array( + 'token' => array( + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_REQUIRED => true + ), + 'reset' => false, + 'change' => array( + ApiBase::PARAM_ISMULTI => true, + ), + 'optionname' => array( + ApiBase::PARAM_TYPE => 'string', + ), + 'optionvalue' => array( + ApiBase::PARAM_TYPE => 'string', + ), + ); + } + + public function getResultProperties() { + return array( + '' => array( + '*' => array( + ApiBase::PROP_TYPE => array( + 'success' + ) + ) + ) + ); + } + + public function getParamDescription() { + return array( + 'token' => 'An options token previously obtained through the action=tokens', + 'reset' => 'Resets all preferences to the site defaults', + 'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters', + 'optionname' => 'A name of a option which should have an optionvalue set', + 'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters', + ); + } + + public function getDescription() { + return 'Change preferences of the current user'; + } + + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ), + array( 'code' => 'nochanges', 'info' => 'No changes were requested' ), + ) ); + } + + public function needsToken() { + return true; + } + + public function getTokenSalt() { + return ''; + } + + public function getHelpUrls() { + return 'https://www.mediawiki.org/wiki/API:Options'; + } + + public function getExamples() { + return array( + 'api.php?action=options&reset=&token=123ABC', + 'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC', + 'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC', + ); + } + + public function getVersion() { + return __CLASS__ . ': $Id$'; + } +} -- cgit v1.2.3-54-g00ecf