Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108<?php
final class PhabricatorPolicyRequestExceptionHandler extends PhabricatorRequestExceptionHandler {
public function getRequestExceptionHandlerPriority() { return 320000; }
public function getRequestExceptionHandlerDescription() { return pht( 'Handles policy exceptions which occur when a user tries to '. 'do something they do not have permission to do.'); }
public function canHandleRequestThrowable( AphrontRequest $request, $throwable) {
if (!$this->isPhabricatorSite($request)) { return false; }
return ($throwable instanceof PhabricatorPolicyException); }
public function handleRequestThrowable( AphrontRequest $request, $throwable) {
$viewer = $this->getViewer($request);
if (!$viewer->isLoggedIn()) { // If the user isn't logged in, just give them a login form. This is // probably a generally more useful response than a policy dialog that // they have to click through to get a login form. // // Possibly we should add a header here like "you need to login to see // the thing you are trying to look at". $auth_app_class = PhabricatorAuthApplication::class; $auth_app = PhabricatorApplication::getByClass($auth_app_class);
return id(new PhabricatorAuthStartController()) ->setRequest($request) ->setCurrentApplication($auth_app) ->handleRequest($request); }
$content = array( phutil_tag( 'div', array( 'class' => 'aphront-policy-rejection', ), $throwable->getRejection()), );
$list = null; if ($throwable->getCapabilityName()) { $list = $throwable->getMoreInfo(); foreach ($list as $key => $item) { $list[$key] = $item; }
$content[] = phutil_tag( 'div', array( 'class' => 'aphront-capability-details', ), pht( 'Users with the "%s" capability:', $throwable->getCapabilityName()));
}
$dialog = id(new AphrontDialogView()) ->setTitle($throwable->getTitle()) ->setClass('aphront-access-dialog') ->setViewer($viewer) ->appendChild($content);
if ($list) { $dialog->appendList($list); }
// If the install is in developer mode, include a stack trace for the // exception. When debugging things, it isn't always obvious where a // policy exception came from and this can make it easier to hunt down // bugs or improve ambiguous/confusing messaging.
$is_developer = PhabricatorEnv::getEnvConfig('phabricator.developer-mode'); if ($is_developer) { $dialog->appendChild( id(new AphrontStackTraceView()) ->setTrace($throwable->getTrace())); }
if ($request->isAjax()) { $dialog->addCancelButton('/', pht('Close')); } else { $dialog->addCancelButton('/', pht('OK')); }
return $dialog; }
}