wikimedia /
mediawiki
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * Edit rollback user interface |
||
| 4 | * |
||
| 5 | * This program is free software; you can redistribute it and/or modify |
||
| 6 | * it under the terms of the GNU General Public License as published by |
||
| 7 | * the Free Software Foundation; either version 2 of the License, or |
||
| 8 | * (at your option) any later version. |
||
| 9 | * |
||
| 10 | * This program is distributed in the hope that it will be useful, |
||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 13 | * GNU General Public License for more details. |
||
| 14 | * |
||
| 15 | * You should have received a copy of the GNU General Public License |
||
| 16 | * along with this program; if not, write to the Free Software |
||
| 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||
| 18 | * |
||
| 19 | * @file |
||
| 20 | * @ingroup Actions |
||
| 21 | */ |
||
| 22 | |||
| 23 | /** |
||
| 24 | * User interface for the rollback action |
||
| 25 | * |
||
| 26 | * @ingroup Actions |
||
| 27 | */ |
||
| 28 | class RollbackAction extends FormlessAction { |
||
| 29 | |||
| 30 | public function getName() { |
||
| 31 | return 'rollback'; |
||
| 32 | } |
||
| 33 | |||
| 34 | public function getRestriction() { |
||
| 35 | return 'rollback'; |
||
| 36 | } |
||
| 37 | |||
| 38 | /** |
||
| 39 | * Temporarily unused message keys due to T88044/T136375: |
||
| 40 | * - confirm-rollback-top |
||
| 41 | * - confirm-rollback-button |
||
| 42 | * - rollbackfailed |
||
| 43 | * - rollback-missingparam |
||
| 44 | */ |
||
| 45 | |||
| 46 | /** |
||
| 47 | * @throws ErrorPageError |
||
| 48 | */ |
||
| 49 | public function onView() { |
||
| 50 | // TODO: use $this->useTransactionalTimeLimit(); when POST only |
||
| 51 | wfTransactionalTimeLimit(); |
||
| 52 | |||
| 53 | $request = $this->getRequest(); |
||
| 54 | $user = $this->getUser(); |
||
| 55 | $from = $request->getVal( 'from' ); |
||
| 56 | $rev = $this->page->getRevision(); |
||
|
0 ignored issues
–
show
|
|||
| 57 | if ( $from === null ) { |
||
| 58 | throw new ErrorPageError( 'rollbackfailed', 'rollback-missingparam' ); |
||
| 59 | } |
||
| 60 | if ( !$rev ) { |
||
| 61 | throw new ErrorPageError( 'rollbackfailed', 'rollback-missingrevision' ); |
||
| 62 | } |
||
| 63 | if ( $from !== $rev->getUserText() ) { |
||
| 64 | throw new ErrorPageError( 'rollbackfailed', 'alreadyrolled', [ |
||
| 65 | $this->getTitle()->getPrefixedText(), |
||
| 66 | $from, |
||
| 67 | $rev->getUserText() |
||
| 68 | ] ); |
||
| 69 | } |
||
| 70 | |||
| 71 | $data = null; |
||
| 72 | $errors = $this->page->doRollback( |
||
|
0 ignored issues
–
show
The method
doRollback does only exist in Article and CategoryPage... ImagePage and WikiPage, but not in Page.
It seems like the method you are trying to call exists only in some of the possible types. Let’s take a look at an example: class A
{
public function foo() { }
}
class B extends A
{
public function bar() { }
}
/**
* @param A|B $x
*/
function someFunction($x)
{
$x->foo(); // This call is fine as the method exists in A and B.
$x->bar(); // This method only exists in B and might cause an error.
}
Available Fixes
Loading history...
|
|||
| 73 | $from, |
||
| 74 | $request->getText( 'summary' ), |
||
| 75 | $request->getVal( 'token' ), |
||
| 76 | $request->getBool( 'bot' ), |
||
| 77 | $data, |
||
| 78 | $this->getUser() |
||
| 79 | ); |
||
| 80 | |||
| 81 | if ( in_array( [ 'actionthrottledtext' ], $errors ) ) { |
||
| 82 | throw new ThrottledError; |
||
| 83 | } |
||
| 84 | |||
| 85 | if ( isset( $errors[0][0] ) && |
||
| 86 | ( $errors[0][0] == 'alreadyrolled' || $errors[0][0] == 'cantrollback' ) |
||
| 87 | ) { |
||
| 88 | $this->getOutput()->setPageTitle( $this->msg( 'rollbackfailed' ) ); |
||
| 89 | $errArray = $errors[0]; |
||
| 90 | $errMsg = array_shift( $errArray ); |
||
| 91 | $this->getOutput()->addWikiMsgArray( $errMsg, $errArray ); |
||
| 92 | |||
| 93 | if ( isset( $data['current'] ) ) { |
||
| 94 | /** @var Revision $current */ |
||
| 95 | $current = $data['current']; |
||
| 96 | |||
| 97 | if ( $current->getComment() != '' ) { |
||
| 98 | $this->getOutput()->addHTML( $this->msg( 'editcomment' )->rawParams( |
||
| 99 | Linker::formatComment( $current->getComment() ) )->parse() ); |
||
| 100 | } |
||
| 101 | } |
||
| 102 | |||
| 103 | return; |
||
| 104 | } |
||
| 105 | |||
| 106 | # NOTE: Permission errors already handled by Action::checkExecute. |
||
| 107 | if ( $errors == [ [ 'readonlytext' ] ] ) { |
||
| 108 | throw new ReadOnlyError; |
||
| 109 | } |
||
| 110 | |||
| 111 | # XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object. |
||
| 112 | # Right now, we only show the first error |
||
| 113 | foreach ( $errors as $error ) { |
||
| 114 | throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) ); |
||
| 115 | } |
||
| 116 | |||
| 117 | /** @var Revision $current */ |
||
| 118 | $current = $data['current']; |
||
| 119 | $target = $data['target']; |
||
| 120 | $newId = $data['newid']; |
||
| 121 | $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) ); |
||
| 122 | $this->getOutput()->setRobotPolicy( 'noindex,nofollow' ); |
||
| 123 | |||
| 124 | $old = Linker::revUserTools( $current ); |
||
| 125 | $new = Linker::revUserTools( $target ); |
||
| 126 | $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new ) |
||
| 127 | ->parseAsBlock() ); |
||
| 128 | |||
| 129 | if ( $user->getBoolOption( 'watchrollback' ) ) { |
||
| 130 | $user->addWatch( $this->page->getTitle(), User::IGNORE_USER_RIGHTS ); |
||
|
0 ignored issues
–
show
The method
getTitle does only exist in Article and CategoryPage... ImagePage and WikiPage, but not in Page.
It seems like the method you are trying to call exists only in some of the possible types. Let’s take a look at an example: class A
{
public function foo() { }
}
class B extends A
{
public function bar() { }
}
/**
* @param A|B $x
*/
function someFunction($x)
{
$x->foo(); // This call is fine as the method exists in A and B.
$x->bar(); // This method only exists in B and might cause an error.
}
Available Fixes
Loading history...
|
|||
| 131 | } |
||
| 132 | |||
| 133 | $this->getOutput()->returnToMain( false, $this->getTitle() ); |
||
| 134 | |||
| 135 | if ( !$request->getBool( 'hidediff', false ) && |
||
| 136 | !$this->getUser()->getBoolOption( 'norollbackdiff' ) |
||
| 137 | ) { |
||
| 138 | $contentHandler = $current->getContentHandler(); |
||
| 139 | $de = $contentHandler->createDifferenceEngine( |
||
| 140 | $this->getContext(), |
||
| 141 | $current->getId(), |
||
| 142 | $newId, |
||
| 143 | false, |
||
| 144 | true |
||
| 145 | ); |
||
| 146 | $de->showDiff( '', '' ); |
||
| 147 | } |
||
| 148 | return; |
||
| 149 | } |
||
| 150 | |||
| 151 | protected function getDescription() { |
||
| 152 | return ''; |
||
| 153 | } |
||
| 154 | |||
| 155 | public function doesWrites() { |
||
| 156 | return true; |
||
| 157 | } |
||
| 158 | } |
||
| 159 |
It seems like the method you are trying to call exists only in some of the possible types.
Let’s take a look at an example:
Available Fixes
Add an additional type-check:
Only allow a single type to be passed if the variable comes from a parameter: