Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/aphront/handler/PhabricatorPolicyRequestExceptionHandler.php
12241 views
1
<?php
2
3
final class PhabricatorPolicyRequestExceptionHandler
4
extends PhabricatorRequestExceptionHandler {
5
6
public function getRequestExceptionHandlerPriority() {
7
return 320000;
8
}
9
10
public function getRequestExceptionHandlerDescription() {
11
return pht(
12
'Handles policy exceptions which occur when a user tries to '.
13
'do something they do not have permission to do.');
14
}
15
16
public function canHandleRequestThrowable(
17
AphrontRequest $request,
18
$throwable) {
19
20
if (!$this->isPhabricatorSite($request)) {
21
return false;
22
}
23
24
return ($throwable instanceof PhabricatorPolicyException);
25
}
26
27
public function handleRequestThrowable(
28
AphrontRequest $request,
29
$throwable) {
30
31
$viewer = $this->getViewer($request);
32
33
if (!$viewer->isLoggedIn()) {
34
// If the user isn't logged in, just give them a login form. This is
35
// probably a generally more useful response than a policy dialog that
36
// they have to click through to get a login form.
37
//
38
// Possibly we should add a header here like "you need to login to see
39
// the thing you are trying to look at".
40
$auth_app_class = 'PhabricatorAuthApplication';
41
$auth_app = PhabricatorApplication::getByClass($auth_app_class);
42
43
return id(new PhabricatorAuthStartController())
44
->setRequest($request)
45
->setCurrentApplication($auth_app)
46
->handleRequest($request);
47
}
48
49
$content = array(
50
phutil_tag(
51
'div',
52
array(
53
'class' => 'aphront-policy-rejection',
54
),
55
$throwable->getRejection()),
56
);
57
58
$list = null;
59
if ($throwable->getCapabilityName()) {
60
$list = $throwable->getMoreInfo();
61
foreach ($list as $key => $item) {
62
$list[$key] = $item;
63
}
64
65
$content[] = phutil_tag(
66
'div',
67
array(
68
'class' => 'aphront-capability-details',
69
),
70
pht(
71
'Users with the "%s" capability:',
72
$throwable->getCapabilityName()));
73
74
}
75
76
$dialog = id(new AphrontDialogView())
77
->setTitle($throwable->getTitle())
78
->setClass('aphront-access-dialog')
79
->setUser($viewer)
80
->appendChild($content);
81
82
if ($list) {
83
$dialog->appendList($list);
84
}
85
86
// If the install is in developer mode, include a stack trace for the
87
// exception. When debugging things, it isn't always obvious where a
88
// policy exception came from and this can make it easier to hunt down
89
// bugs or improve ambiguous/confusing messaging.
90
91
$is_developer = PhabricatorEnv::getEnvConfig('phabricator.developer-mode');
92
if ($is_developer) {
93
$dialog->appendChild(
94
id(new AphrontStackTraceView())
95
->setTrace($throwable->getTrace()));
96
}
97
98
if ($request->isAjax()) {
99
$dialog->addCancelButton('/', pht('Close'));
100
} else {
101
$dialog->addCancelButton('/', pht('OK'));
102
}
103
104
return $dialog;
105
}
106
107
}
108
109