<?php
namespace XF\ControllerPlugin;
use XF\Mvc\ParameterBag;
class Error extends AbstractPlugin
{
public function actionDispatchError(ParameterBag $params)
{
$code = $params->get('code', null) ?: 'unknown';
$controller = $params->get('controller', null) ?: '-';
$action = $params->get('action', null) ?: '-';
if (\XF::$debugMode)
{
return $this->error(
\XF::phrase('requested_page_not_found')
. " (Code: $code, controller: $controller, action: $action)",
404
);
}
else
{
return $this->error(\XF::phrase('requested_page_not_found'), 404);
}
}
public function actionNotFound($message = null)
{
if (!$message)
{
$message = \XF::phrase('requested_page_not_found');
}
return $this->error($message, 404);
}
public function actionAddOnUpgrade()
{
return $this->error(\XF::phrase('area_temporarily_unavailable_addon_upgrade_try_again'), $this->app->config('serviceUnavailableCode'));
}
public function actionNoPermission($message)
{
if ($message instanceof \XF\Phrase
&& preg_match('/_not_found$/', $message->getName())
)
{
// phrase coming from an error that looks like a 404 error so trigger it as such
return $this->notFound($message);
}
if (!\XF::visitor()->user_id && $this->app instanceof \XF\Pub\App)
{
return $this->actionRegistrationRequired();
}
else
{
if (!$message)
{
$message = \XF::phrase('do_not_have_permission');
}
return $this->error($message, 403);
}
}
public function actionRegistrationRequired()
{
$view = $this->view('XF:Error\RegistrationRequired', 'login', [
'error' => \XF::phrase('login_required'),
'providers' => \XF::repository('XF:ConnectedAccount')->getUsableProviders(false)
]);
$view->setResponseCode(403);
return $view;
}
public function actionBannedIp()
{
$error = $this->error(\XF::phrase('your_ip_address_has_been_banned'), 403);
$error->setPageParam('skipSidebarWidgets', true);
return $error;
}
public function actionBanned()
{
$visitor = \XF::visitor();
if (!$visitor->Ban)
{
return $this->noPermission();
}
else
{
$banEndDate = $visitor->Ban['end_date'];
if ($visitor->Ban['triggered'] && !$banEndDate)
{
/** @var \XF\Repository\Warning $warningRepo */
$warningRepo = $this->repository('XF:Warning');
$minUnbanDate = $warningRepo->getMinimumUnbanDate($visitor->user_id);
if ($minUnbanDate)
{
$banEndDate = $minUnbanDate;
}
}
if ($visitor->Ban['user_reason'])
{
$message = \XF::phrase('you_have_been_banned_for_following_reason_x', ['reason' => $visitor->Ban['user_reason']]);
}
else
{
$message = \XF::phrase('you_have_been_banned');
}
if ($banEndDate > time())
{
$message .= ' ' . \XF::phrase('your_ban_will_be_lifted_on_x', ['date' => \XF::language()->dateTime($banEndDate)]);
}
$error = $this->error($message, 403);
$error->setPageParam('skipSidebarWidgets', true);
return $error;
}
}
public function actionRejected()
{
$visitor = \XF::visitor();
if (!$visitor->Reject)
{
return $this->noPermission();
}
else
{
if ($visitor->Reject['reject_reason'])
{
$message = \XF::phrase('your_account_has_been_rejected_for_following_reason_x', ['reason' => $visitor->Reject['reject_reason']]);
}
else
{
$message = \XF::phrase('your_account_has_been_rejected');
}
$error = $this->error($message, 403);
$error->setPageParam('skipSidebarWidgets', true);
return $error;
}
}
public function actionDisabled()
{
$visitor = \XF::visitor();
if ($visitor->user_state != 'disabled')
{
return $this->noPermission();
}
else
{
$message = \XF::phrase('your_account_has_been_disabled');
if ($visitor->canUseContactForm())
{
$link = null;
$contactUrl = $this->options()->contactUrl;
if ($contactUrl['type'] == 'default')
{
$link = $this->buildLink('misc/contact');
}
else if ($contactUrl['type'] == 'custom')
{
$link = $contactUrl['custom'];
}
if ($link)
{
$message = \XF::phrase('your_account_has_been_disabled_please_contact_us', [
'link' => $link
]);
}
}
$error = $this->error($message, 403);
$error->setPageParam('skipSidebarWidgets', true);
return $error;
}
}
public function actionException($exception, $showDetails = null)
{
if ($showDetails === null)
{
$showDetails = (\XF::$debugMode || \XF::visitor()->is_admin);
}
if ($showDetails)
{
$reply = $this->view('XF:Error\Server', '', [
'exception' => $exception
]);
}
else
{
$reply = $this->error(\XF::phrase('server_error_occurred'));
}
$reply->setResponseCode(500);
return $reply;
}
}