Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/harbormaster/xaction/build/HarbormasterBuildMessageTransaction.php
12264 views
1
<?php
2
3
abstract class HarbormasterBuildMessageTransaction
4
extends HarbormasterBuildTransactionType {
5
6
final public function getHarbormasterBuildMessageType() {
7
return $this->getPhobjectClassConstant('MESSAGETYPE');
8
}
9
10
abstract public function getHarbormasterBuildMessageName();
11
abstract public function getHarbormasterBuildMessageDescription();
12
abstract public function getHarbormasterBuildableMessageName();
13
abstract public function getHarbormasterBuildableMessageEffect();
14
15
abstract public function newConfirmPromptTitle();
16
abstract public function newConfirmPromptBody();
17
18
abstract public function newBuildableConfirmPromptTitle(
19
array $builds,
20
array $sendable);
21
22
abstract public function newBuildableConfirmPromptBody(
23
array $builds,
24
array $sendable);
25
26
public function newBuildableConfirmPromptWarnings(
27
array $builds,
28
array $sendable) {
29
return array();
30
}
31
32
final public function generateOldValue($object) {
33
return null;
34
}
35
36
final public function getTransactionTypeForConduit($xaction) {
37
return 'message';
38
}
39
40
final public function getFieldValuesForConduit($xaction, $data) {
41
return array(
42
'type' => $xaction->getNewValue(),
43
);
44
}
45
46
final public static function getAllMessages() {
47
$message_xactions = id(new PhutilClassMapQuery())
48
->setAncestorClass(__CLASS__)
49
->execute();
50
51
return $message_xactions;
52
}
53
54
final public static function getTransactionObjectForMessageType(
55
$message_type) {
56
$message_xactions = self::getAllMessages();
57
58
foreach ($message_xactions as $message_xaction) {
59
$xaction_type = $message_xaction->getHarbormasterBuildMessageType();
60
if ($xaction_type === $message_type) {
61
return $message_xaction;
62
}
63
}
64
65
return null;
66
}
67
68
final public static function getTransactionTypeForMessageType($message_type) {
69
$message_xaction = self::getTransactionObjectForMessageType($message_type);
70
71
if ($message_xaction) {
72
return $message_xaction->getTransactionTypeConstant();
73
}
74
75
return null;
76
}
77
78
final public function getTransactionHasEffect($object, $old, $new) {
79
return $this->canApplyMessage($this->getActor(), $object);
80
}
81
82
final public function canApplyMessage(
83
PhabricatorUser $viewer,
84
HarbormasterBuild $build) {
85
86
try {
87
$this->assertCanApplyMessage($viewer, $build);
88
return true;
89
} catch (HarbormasterMessageException $ex) {
90
return false;
91
}
92
}
93
94
final public function canSendMessage(
95
PhabricatorUser $viewer,
96
HarbormasterBuild $build) {
97
98
try {
99
$this->assertCanSendMessage($viewer, $build);
100
return true;
101
} catch (HarbormasterMessageException $ex) {
102
return false;
103
}
104
}
105
106
final public function assertCanApplyMessage(
107
PhabricatorUser $viewer,
108
HarbormasterBuild $build) {
109
$this->newCanApplyMessageAssertion($viewer, $build);
110
}
111
112
final public function assertCanSendMessage(
113
PhabricatorUser $viewer,
114
HarbormasterBuild $build) {
115
$plan = $build->getBuildPlan();
116
117
// See T13526. Users without permission to access the build plan can
118
// currently end up here with no "BuildPlan" object.
119
if (!$plan) {
120
throw new HarbormasterMessageException(
121
pht('No Build Plan Permission'),
122
pht(
123
'You can not issue this command because you do not have '.
124
'permission to access the build plan for this build.'));
125
}
126
127
// Issuing these commands requires that you be able to edit the build, to
128
// prevent enemy engineers from sabotaging your builds. See T9614.
129
if (!$plan->canRunWithoutEditCapability()) {
130
try {
131
PhabricatorPolicyFilter::requireCapability(
132
$viewer,
133
$plan,
134
PhabricatorPolicyCapability::CAN_EDIT);
135
} catch (PhabricatorPolicyException $ex) {
136
throw new HarbormasterMessageException(
137
pht('Insufficent Build Plan Permission'),
138
pht(
139
'The build plan for this build is configured to prevent '.
140
'users who can not edit it from issuing commands to the '.
141
'build, and you do not have permission to edit the build '.
142
'plan.'));
143
}
144
}
145
146
$this->newCanSendMessageAssertion($viewer, $build);
147
$this->assertCanApplyMessage($viewer, $build);
148
}
149
150
abstract protected function newCanSendMessageAssertion(
151
PhabricatorUser $viewer,
152
HarbormasterBuild $build);
153
154
abstract protected function newCanApplyMessageAssertion(
155
PhabricatorUser $viewer,
156
HarbormasterBuild $build);
157
158
}
159
160