MediaWiki  master
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  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 
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" );
120  wfHttpError(
121  400,
122  'Bad Request',
123  "unknown function " . $this->func_name
124  );
125  } elseif ( !$permissionManager->isEveryoneAllowed( 'read' ) &&
126  !$permissionManager->userHasRight( $user, 'read' ) ) {
127  wfHttpError(
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 }
$args
Arguments passed.
The User object encapsulates all of the user-specific settings (user_id, name, rights, email address, options, last login time).
Definition: User.php:51
Interface for configuration instances.
Definition: Config.php:28
Handle responses for Ajax requests (send headers, print content, that sort of thing) ...
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
$mode
The way the request was made, either a &#39;get&#39; or a &#39;post&#39;.
__construct(Config $config)
Load up our object with user supplied data.
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
performAction(User $user)
Pass the request to our internal function.
$func_name
Name of the requested handler.
Object-Oriented Ajax functions.