[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Created on Jun 25, 2013 4 * 5 * Copyright © 2013 Brad Jorsch <[email protected]> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * http://www.gnu.org/copyleft/gpl.html 21 * 22 * @file 23 * @since 1.23 24 */ 25 26 /** 27 * API interface to RevDel. The API equivalent of Special:RevisionDelete. 28 * Requires API write mode to be enabled. 29 * 30 * @ingroup API 31 */ 32 class ApiRevisionDelete extends ApiBase { 33 34 public function execute() { 35 $params = $this->extractRequestParams(); 36 $user = $this->getUser(); 37 38 if ( !$user->isAllowed( RevisionDeleter::getRestriction( $params['type'] ) ) ) { 39 $this->dieUsageMsg( 'badaccess-group0' ); 40 } 41 42 if ( !$params['ids'] ) { 43 $this->dieUsage( "At least one value is required for 'ids'", 'badparams' ); 44 } 45 46 $hide = $params['hide'] ?: array(); 47 $show = $params['show'] ?: array(); 48 if ( array_intersect( $hide, $show ) ) { 49 $this->dieUsage( "Mutually exclusive values for 'hide' and 'show'", 'badparams' ); 50 } elseif ( !$hide && !$show ) { 51 $this->dieUsage( "At least one value is required for 'hide' or 'show'", 'badparams' ); 52 } 53 $bits = array( 54 'content' => RevisionDeleter::getRevdelConstant( $params['type'] ), 55 'comment' => Revision::DELETED_COMMENT, 56 'user' => Revision::DELETED_USER, 57 ); 58 $bitfield = array(); 59 foreach ( $bits as $key => $bit ) { 60 if ( in_array( $key, $hide ) ) { 61 $bitfield[$bit] = 1; 62 } elseif ( in_array( $key, $show ) ) { 63 $bitfield[$bit] = 0; 64 } else { 65 $bitfield[$bit] = -1; 66 } 67 } 68 69 if ( $params['suppress'] === 'yes' ) { 70 if ( !$user->isAllowed( 'suppressrevision' ) ) { 71 $this->dieUsageMsg( 'badaccess-group0' ); 72 } 73 $bitfield[Revision::DELETED_RESTRICTED] = 1; 74 } elseif ( $params['suppress'] === 'no' ) { 75 $bitfield[Revision::DELETED_RESTRICTED] = 0; 76 } else { 77 $bitfield[Revision::DELETED_RESTRICTED] = -1; 78 } 79 80 $targetObj = null; 81 if ( $params['target'] ) { 82 $targetObj = Title::newFromText( $params['target'] ); 83 } 84 $targetObj = RevisionDeleter::suggestTarget( $params['type'], $targetObj, $params['ids'] ); 85 if ( $targetObj === null ) { 86 $this->dieUsage( 'A target title is required for this RevDel type', 'needtarget' ); 87 } 88 89 $list = RevisionDeleter::createList( 90 $params['type'], $this->getContext(), $targetObj, $params['ids'] 91 ); 92 $status = $list->setVisibility( 93 array( 'value' => $bitfield, 'comment' => $params['reason'], 'perItemStatus' => true ) 94 ); 95 96 $result = $this->getResult(); 97 $data = $this->extractStatusInfo( $status ); 98 $data['target'] = $targetObj->getFullText(); 99 $data['items'] = array(); 100 101 foreach ( $status->itemStatuses as $id => $s ) { 102 $data['items'][$id] = $this->extractStatusInfo( $s ); 103 $data['items'][$id]['id'] = $id; 104 } 105 106 $list->reloadFromMaster(); 107 // @codingStandardsIgnoreStart Avoid function calls in a FOR loop test part 108 for ( $item = $list->reset(); $list->current(); $item = $list->next() ) { 109 $data['items'][$item->getId()] += $item->getApiData( $this->getResult() ); 110 } 111 // @codingStandardsIgnoreEnd 112 113 $data['items'] = array_values( $data['items'] ); 114 $result->setIndexedTagName( $data['items'], 'i' ); 115 $result->addValue( null, $this->getModuleName(), $data ); 116 } 117 118 private function extractStatusInfo( $status ) { 119 $ret = array( 120 'status' => $status->isOK() ? 'Success' : 'Fail', 121 ); 122 $errors = $this->formatStatusMessages( $status->getErrorsByType( 'error' ) ); 123 if ( $errors ) { 124 $this->getResult()->setIndexedTagName( $errors, 'e' ); 125 $ret['errors'] = $errors; 126 } 127 $warnings = $this->formatStatusMessages( $status->getErrorsByType( 'warning' ) ); 128 if ( $warnings ) { 129 $this->getResult()->setIndexedTagName( $warnings, 'w' ); 130 $ret['warnings'] = $warnings; 131 } 132 133 return $ret; 134 } 135 136 private function formatStatusMessages( $messages ) { 137 if ( !$messages ) { 138 return array(); 139 } 140 $result = $this->getResult(); 141 $ret = array(); 142 foreach ( $messages as $m ) { 143 $message = array(); 144 if ( $m['message'] instanceof Message ) { 145 $msg = $m['message']; 146 $message = array( 'message' => $msg->getKey() ); 147 if ( $msg->getParams() ) { 148 $message['params'] = $msg->getParams(); 149 $result->setIndexedTagName( $message['params'], 'p' ); 150 } 151 } else { 152 $message = array( 'message' => $m['message'] ); 153 $msg = wfMessage( $m['message'] ); 154 if ( isset( $m['params'] ) ) { 155 $message['params'] = $m['params']; 156 $result->setIndexedTagName( $message['params'], 'p' ); 157 $msg->params( $m['params'] ); 158 } 159 } 160 $message['rendered'] = $msg->useDatabase( false )->inLanguage( 'en' )->plain(); 161 $ret[] = $message; 162 } 163 164 return $ret; 165 } 166 167 public function mustBePosted() { 168 return true; 169 } 170 171 public function isWriteMode() { 172 return true; 173 } 174 175 public function getAllowedParams() { 176 return array( 177 'type' => array( 178 ApiBase::PARAM_TYPE => RevisionDeleter::getTypes(), 179 ApiBase::PARAM_REQUIRED => true 180 ), 181 'target' => null, 182 'ids' => array( 183 ApiBase::PARAM_ISMULTI => true, 184 ApiBase::PARAM_REQUIRED => true 185 ), 186 'hide' => array( 187 ApiBase::PARAM_TYPE => array( 'content', 'comment', 'user' ), 188 ApiBase::PARAM_ISMULTI => true, 189 ), 190 'show' => array( 191 ApiBase::PARAM_TYPE => array( 'content', 'comment', 'user' ), 192 ApiBase::PARAM_ISMULTI => true, 193 ), 194 'suppress' => array( 195 ApiBase::PARAM_TYPE => array( 'yes', 'no', 'nochange' ), 196 ApiBase::PARAM_DFLT => 'nochange', 197 ), 198 'reason' => null, 199 ); 200 } 201 202 public function getParamDescription() { 203 return array( 204 'type' => 'Type of revision deletion being performed', 205 'target' => 'Page title for the revision deletion, if required for the type', 206 'ids' => 'Identifiers for the revisions to be deleted', 207 'hide' => 'What to hide for each revision', 208 'show' => 'What to unhide for each revision', 209 'suppress' => 'Whether to suppress data from administrators as well as others', 210 'reason' => 'Reason for the deletion/undeletion', 211 ); 212 } 213 214 public function getDescription() { 215 return 'Delete/undelete revisions.'; 216 } 217 218 public function needsToken() { 219 return 'csrf'; 220 } 221 222 public function getExamples() { 223 return array( 224 'api.php?action=revisiondelete&target=Main%20Page&type=revision&ids=12345&' . 225 'hide=content&token=123ABC' 226 => 'Hide content for revision 12345 on the Main Page', 227 'api.php?action=revisiondelete&type=logging&ids=67890&hide=content|comment|user&' . 228 'reason=BLP%20violation&token=123ABC' 229 => 'Hide all data on log entry 67890 with the reason "BLP violation"', 230 ); 231 } 232 233 public function getHelpUrls() { 234 return 'https://www.mediawiki.org/wiki/API:Revisiondelete'; 235 } 236 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |