53 private $currentAction =
null;
58 private static $access_levels = [
'public',
'logged_in',
'admin'];
68 $this->config = $config;
70 $this->crypto = $crypto;
94 'admin/plugins/disable',
99 if (!in_array(
$action, $exceptions)) {
107 $forwarder = str_replace($this->config->getSiteUrl(),
"", $forwarder);
108 $forwarder = str_replace(
"http://",
"", $forwarder);
109 $forwarder = str_replace(
"@",
"", $forwarder);
110 if (substr($forwarder, 0, 1) ==
"/") {
111 $forwarder = substr($forwarder, 1);
130 $response = new \Elgg\Http\ErrorResponse($msg, $status_code);
133 $response = new \Elgg\Http\OkResponse(
$content, $status_code);
136 $forwarder = empty($forwarder) ?
REFERER : $forwarder;
137 $response->setForwardURL($forwarder);
141 if (!isset($this->actions[
$action])) {
145 $user = $this->session->getLoggedInUser();
148 switch ($this->actions[
$action][
'access']) {
195 $path = __DIR__ .
'/../../../actions';
196 $filename = realpath(
"$path/$action.php");
199 if (!in_array(
$access, self::$access_levels)) {
200 _elgg_services()->logger->error(
"Unrecognized value '$access' for \$access in " . __METHOD__);
204 $this->actions[
$action] = array(
216 if (isset($this->actions[
$action])) {
217 unset($this->actions[
$action]);
237 $session_id = $this->session->getId();
239 if ((
$token) && (
$ts) && ($session_id)) {
240 if ($this->validateTokenOwnership(
$token,
$ts)) {
241 if ($this->validateTokenTimestamp(
$ts)) {
244 $returnval =
_elgg_services()->hooks->trigger(
'action_gatekeeper:permissions:check',
'all', array(
251 }
else if ($visible_errors) {
254 }
else if ($visible_errors) {
258 'js:security:token_refresh_failed',
259 array($this->config->getSiteUrl()
265 }
else if ($visible_errors) {
275 $length = $req->server->get(
'CONTENT_LENGTH');
276 $post_count = count($req->request);
277 if (
$length && $post_count < 1) {
279 $error_msg =
_elgg_services()->hooks->trigger(
'action_gatekeeper:upload_exceeded_msg',
'all', array(
281 'visible_errors' => $visible_errors,
282 ),
_elgg_services()->translator->translate(
'actiongatekeeper:uploadexceeded'));
284 $error_msg =
_elgg_services()->translator->translate(
'actiongatekeeper:missingfields');
286 if ($visible_errors) {
302 $timeout = $this->getActionTokenTimeout();
304 return ($timeout == 0 || (
$ts > $now - $timeout) && (
$ts < $now + $timeout));
314 if (($timeout = $this->config->get(
'action_token_timeout')) ===
null) {
319 return (
int)((float)$timeout * $hour);
329 if ($this->validateActionToken(
false)) {
335 if (
$token && $this->validateTokenTimestamp(
$ts)) {
344 if ($this->validateActionToken()) {
363 $required_token = $this->generateActionToken(
$timestamp, $session_token);
380 if (!$session_token) {
382 if (!$session_token) {
396 return (isset($this->actions[
$action]) && file_exists($this->actions[
$action][
'file']));
412 if ($reason ==
'walled_garden' || $reason ==
'csrf') {
416 $status_code = (int) $reason;
417 if ($status_code < 100 || ($status_code > 299 && $status_code < 400) || $status_code > 599) {
426 $headers[
'Content-Type'] =
'application/json; charset=UTF-8';
466 $session_token =
get_input(
'session_token',
null,
false);
467 $pairs = (array)
get_input(
'pairs', array(),
false);
468 $valid_tokens = (object)array();
469 foreach ($pairs as $pair) {
470 list(
$ts,
$token) = explode(
',', $pair, 2);
471 if ($this->validateTokenOwnership(
$token,
$ts, $session_token)) {
472 $valid_tokens->{
$token} =
true;
477 $token = $this->generateActionToken(
$ts);
482 'logged_in' => $this->session->isLoggedIn(),
484 'valid_tokens' => $valid_tokens,
485 'session_token' => $this->session->get(
'__elgg_session'),
486 'user_guid' => $this->session->getLoggedInUserGuid(),
$content
Set robots.txt action.
elgg_is_xhr()
Checks whether the request was requested via ajax.
getAllActions()
Get all actions.
ajaxForwardHook($hook, $reason, $forward_url, $params)
handleTokenRefreshRequest()
Send an updated CSRF token, provided the page's current tokens were not fake.
validateTokenTimestamp($ts)
Is the token timestamp within acceptable range?
validateActionToken($visible_errors=true, $token=null, $ts=null)
validateTokenOwnership($token, $timestamp, $session_token='')
Was the given token generated for the session defined by session_token?
generateActionToken($timestamp, $session_token='')
Generate a token from a session token (specifying the user), the timestamp, and the site key.
__construct(Config $config, ElggSession $session, ElggCrypto $crypto)
Constructor.
execute($action, $forwarder="")
Executes an action If called from action() redirect will be issued by the response factory If called ...
Access to configuration values.
register_error($error)
Display an error on next page load.
elgg_set_http_header($header, $replace=true)
Set a response HTTP header.
const ELGG_HTTP_FORBIDDEN
const ELGG_HTTP_NOT_IMPLEMENTED
_elgg_services(\Elgg\Di\ServiceProvider $services=null)
Get the global service provider.
if(! $entity->delete()) $forward_url
HTTP response builder interface.
getCurrentTime($modifier='')
Get the (cloned) time.
trait TimeUsing
Adds methods for setting the current time (for testing)
gatekeeper()
Alias of elgg_gatekeeper()
elgg_ok_response($content='', $message='', $forward_url=null, $status_code=ELGG_HTTP_OK)
Prepares a successful response to be returned by a page or an action handler.
if(!array_key_exists($filename, $text_files)) $file
elgg_get_session()
Gets Elgg's session object.