MediaWiki REL1_30
AjaxDispatcher.php
Go to the documentation of this file.
1<?php
25
39 private $mode;
40
45 private $func_name;
46
50 private $args;
51
55 private $config;
56
61 function __construct( Config $config ) {
62 $this->config = $config;
63
64 $this->mode = "";
65
66 if ( !empty( $_GET["rs"] ) ) {
67 $this->mode = "get";
68 }
69
70 if ( !empty( $_POST["rs"] ) ) {
71 $this->mode = "post";
72 }
73
74 switch ( $this->mode ) {
75 case 'get':
76 $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
77 if ( !empty( $_GET["rsargs"] ) ) {
78 $this->args = $_GET["rsargs"];
79 } else {
80 $this->args = [];
81 }
82 break;
83 case 'post':
84 $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
85 if ( !empty( $_POST["rsargs"] ) ) {
86 $this->args = $_POST["rsargs"];
87 } else {
88 $this->args = [];
89 }
90 break;
91 default:
92 return;
93 # Or we could throw an exception:
94 # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
95 }
96 }
97
106 function performAction( User $user ) {
107 if ( empty( $this->mode ) ) {
108 return;
109 }
110
111 if ( !in_array( $this->func_name, $this->config->get( 'AjaxExportList' ) ) ) {
112 wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
114 400,
115 'Bad Request',
116 "unknown function " . $this->func_name
117 );
118 } elseif ( !User::isEveryoneAllowed( 'read' ) && !$user->isAllowed( 'read' ) ) {
120 403,
121 'Forbidden',
122 'You are not allowed to view pages.' );
123 } else {
124 wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
125 try {
126 $result = call_user_func_array( $this->func_name, $this->args );
127
128 if ( $result === false || $result === null ) {
129 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
130 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
131 "no data returned\n" );
132
133 wfHttpError( 500, 'Internal Error',
134 "{$this->func_name} returned no data" );
135 } else {
136 if ( is_string( $result ) ) {
137 $result = new AjaxResponse( $result );
138 }
139
140 // Make sure DB commit succeeds before sending a response
141 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
142 $lbFactory->commitMasterChanges( __METHOD__ );
143
144 $result->sendHeaders();
145 $result->printText();
146
147 wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" );
148 }
149 } catch ( Exception $e ) {
150 wfDebug( __METHOD__ . ' ERROR while dispatching ' .
151 $this->func_name . "(" . var_export( $this->args, true ) . "): " .
152 get_class( $e ) . ": " . $e->getMessage() . "\n" );
153
154 if ( !headers_sent() ) {
155 wfHttpError( 500, 'Internal Error',
156 $e->getMessage() );
157 } else {
158 print $e->getMessage();
159 }
160 }
161 }
162 }
163}
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
print
Definition cleanup.php:99
returning false will NOT prevent logging $e
Definition hooks.txt:2146