MediaWiki REL1_34
AjaxDispatcher.php
Go to the documentation of this file.
1<?php
25
26// Use superglobals, but since it's deprecated, it's not worth fixing
27// phpcs:disable MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
28
42 private $mode;
43
48 private $func_name;
49
53 private $args;
54
58 private $config;
59
65 $this->config = $config;
66
67 $this->mode = "";
68
69 if ( !empty( $_GET["rs"] ) ) {
70 $this->mode = "get";
71 }
72
73 if ( !empty( $_POST["rs"] ) ) {
74 $this->mode = "post";
75 }
76
77 switch ( $this->mode ) {
78 case 'get':
79 $this->func_name = $_GET["rs"] ?? '';
80 if ( !empty( $_GET["rsargs"] ) ) {
81 $this->args = $_GET["rsargs"];
82 } else {
83 $this->args = [];
84 }
85 break;
86 case 'post':
87 $this->func_name = $_POST["rs"] ?? '';
88 if ( !empty( $_POST["rsargs"] ) ) {
89 $this->args = $_POST["rsargs"];
90 } else {
91 $this->args = [];
92 }
93 break;
94 default:
95 return;
96 # Or we could throw an exception:
97 # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
98 }
99 }
100
112 function performAction( User $user ) {
113 if ( empty( $this->mode ) ) {
114 return;
115 }
116
117 $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
118 if ( !in_array( $this->func_name, $this->config->get( 'AjaxExportList' ) ) ) {
119 wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
121 400,
122 'Bad Request',
123 "unknown function " . $this->func_name
124 );
125 } elseif ( !$permissionManager->isEveryoneAllowed( 'read' ) &&
126 !$permissionManager->userHasRight( $user, 'read' ) ) {
128 403,
129 'Forbidden',
130 'You are not allowed to view pages.' );
131 } else {
132 wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
133 try {
134 $result = call_user_func_array( $this->func_name, $this->args );
135
136 if ( $result === false || $result === null ) {
137 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
138 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
139 "no data returned\n" );
140
141 wfHttpError( 500, 'Internal Error',
142 "{$this->func_name} returned no data" );
143 } else {
144 if ( is_string( $result ) ) {
145 $result = new AjaxResponse( $result );
146 }
147
148 // Make sure DB commit succeeds before sending a response
149 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
150 $lbFactory->commitMasterChanges( __METHOD__ );
151
152 $result->sendHeaders();
153 $result->printText();
154
155 wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" );
156 }
157 } catch ( Exception $e ) {
158 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
159 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
160 get_class( $e ) . ": " . $e->getMessage() . "\n" );
161
162 if ( !headers_sent() ) {
163 wfHttpError( 500, 'Internal Error',
164 $e->getMessage() );
165 } else {
166 print $e->getMessage();
167 }
168 }
169 }
170 }
171}
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
Object-Oriented Ajax functions.
$args
Arguments passed.
$mode
The way the request was made, either a 'get' or a 'post'.
__construct(Config $config)
Load up our object with user supplied data.
$func_name
Name of the requested handler.
performAction(User $user)
Pass the request to our internal function.
Handle responses for Ajax requests (send headers, print content, that sort of thing)
MediaWikiServices is the service locator for the application scope of MediaWiki.
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:51
while(( $__line=Maintenance::readconsole()) !==false) print
Definition eval.php:64
Interface for configuration instances.
Definition Config.php:28