MediaWiki REL1_37
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
64 public function __construct( Config $config ) {
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
109 public function performAction( User $user ) {
110 if ( empty( $this->mode ) ) {
111 return;
112 }
113
114 $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
115 if ( !in_array( $this->func_name, $this->config->get( 'AjaxExportList' ) ) ) {
116 wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name );
118 400,
119 'Bad Request',
120 "unknown function " . $this->func_name
121 );
122 } elseif ( !$permissionManager->isEveryoneAllowed( 'read' ) &&
123 !$permissionManager->userHasRight( $user, 'read' )
124 ) {
126 403,
127 'Forbidden',
128 'You are not allowed to view pages.' );
129 } else {
130 wfDebug( __METHOD__ . ' dispatching ' . $this->func_name );
131 try {
132 $result = call_user_func_array( $this->func_name, $this->args );
133
134 if ( $result === false || $result === null ) {
135 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
136 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
137 "no data returned" );
138
139 wfHttpError( 500, 'Internal Error',
140 "{$this->func_name} returned no data" );
141 } else {
142 if ( is_string( $result ) ) {
143 $result = new AjaxResponse( $result );
144 }
145
146 // Make sure DB commit succeeds before sending a response
147 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
148 $lbFactory->commitPrimaryChanges( __METHOD__ );
149
150 $result->sendHeaders();
151 $result->printText();
152
153 wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name );
154 }
155 } catch ( Exception $e ) {
156 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
157 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
158 get_class( $e ) . ": " . $e->getMessage() );
159
160 if ( !headers_sent() ) {
161 wfHttpError( 500, 'Internal Error',
162 $e->getMessage() );
163 } else {
164 print $e->getMessage();
165 }
166 }
167 }
168 }
169}
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.
array $args
Arguments passed.
string $mode
The way the request was made, either a 'get' or a 'post'.
__construct(Config $config)
Load up our object with user supplied data.
string $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:69
while(( $__line=Maintenance::readconsole()) !==false) print
Definition eval.php:69
Interface for configuration instances.
Definition Config.php:30