This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | class DeploymentStrategy extends ViewableData { |
||
4 | |||
5 | const SUCCESS_CODE = 'success'; |
||
6 | |||
7 | const WARNING_CODE = 'warning'; |
||
8 | |||
9 | const ERROR_CODE = 'error'; |
||
10 | |||
11 | /** |
||
12 | * @var DNEnvironment |
||
13 | */ |
||
14 | protected $environment; |
||
15 | |||
16 | /** |
||
17 | * @var string |
||
18 | */ |
||
19 | protected $actionTitle = 'Deploy'; |
||
20 | |||
21 | /** |
||
22 | * @var string |
||
23 | */ |
||
24 | protected $actionCode = 'default'; |
||
25 | |||
26 | /** |
||
27 | * @var int |
||
28 | */ |
||
29 | protected $estimatedTime = 0; |
||
30 | |||
31 | /** |
||
32 | * @var array |
||
33 | */ |
||
34 | protected $changes = []; |
||
35 | |||
36 | /** |
||
37 | * @var array |
||
38 | */ |
||
39 | protected $options; |
||
40 | |||
41 | /** |
||
42 | * Validation code |
||
43 | * |
||
44 | * @var string |
||
45 | */ |
||
46 | protected $validationCode = DeploymentStrategy::SUCCESS_CODE; |
||
0 ignored issues
–
show
|
|||
47 | |||
48 | /** |
||
49 | * @var array |
||
50 | */ |
||
51 | protected $messages = []; |
||
52 | |||
53 | |||
54 | /** |
||
55 | * @param \DNEnvironment $environment |
||
56 | * @param array $options |
||
57 | */ |
||
58 | public function __construct(\DNEnvironment $environment, $options = array()) { |
||
59 | $this->environment = $environment; |
||
60 | $this->options = $options; |
||
61 | } |
||
62 | |||
63 | /** |
||
64 | * @param string $title |
||
65 | */ |
||
66 | public function setActionTitle($title) { |
||
67 | $this->actionTitle = $title; |
||
68 | } |
||
69 | |||
70 | /** |
||
71 | * @return string |
||
72 | */ |
||
73 | public function getActionTitle() { |
||
74 | return $this->actionTitle; |
||
75 | } |
||
76 | |||
77 | /** |
||
78 | */ |
||
79 | public function setActionCode($code) { |
||
80 | $this->actionCode = $code; |
||
81 | } |
||
82 | |||
83 | /** |
||
84 | * @return string |
||
85 | */ |
||
86 | public function getActionCode() { |
||
87 | return $this->actionCode; |
||
88 | } |
||
89 | |||
90 | /** |
||
91 | * @param int |
||
92 | */ |
||
93 | public function setEstimatedTime($seconds) { |
||
94 | $this->estimatedTime = $seconds; |
||
95 | } |
||
96 | |||
97 | /** |
||
98 | * @return int Time in minutes |
||
99 | */ |
||
100 | public function getEstimatedTime() { |
||
101 | return $this->estimatedTime; |
||
102 | } |
||
103 | |||
104 | /** |
||
105 | * @param string $title |
||
106 | * @param string $from |
||
107 | * @param string $to |
||
108 | */ |
||
109 | public function setChange($title, $from, $to) { |
||
110 | // Normalise "empty" values into dashes so comparisons are done properly. |
||
111 | // This means there is no diference between an empty string and a null |
||
112 | // but "0" is considered to be non-empty. |
||
113 | if(empty($from) && !strlen($from)) $from = '-'; |
||
114 | if(empty($to) && !strlen($to)) $to = '-'; |
||
115 | |||
116 | return $this->changes[$title] = array( |
||
117 | 'from' => $from, |
||
118 | 'to' => $to |
||
119 | ); |
||
120 | } |
||
121 | |||
122 | /** |
||
123 | * @param array $data |
||
124 | */ |
||
125 | public function setChanges($data) { |
||
126 | $this->changes = $data; |
||
127 | } |
||
128 | |||
129 | /** |
||
130 | * @param string $title |
||
131 | * @param string $desc |
||
132 | */ |
||
133 | public function setChangeDescriptionOnly($title, $desc) { |
||
134 | return $this->changes[$title] = array( |
||
135 | 'description' => $desc |
||
136 | ); |
||
137 | } |
||
138 | |||
139 | /** |
||
140 | * Filter the changeset where modification was not required. |
||
141 | * |
||
142 | * @return array |
||
143 | */ |
||
144 | public function getChangesModificationNeeded() { |
||
145 | $filtered = []; |
||
146 | foreach ($this->changes as $change => $details) { |
||
147 | if (!empty($details['description'])) { |
||
148 | $filtered[$change] = $details; |
||
149 | } else if ( |
||
150 | (array_key_exists('from', $details) || array_key_exists('to', $details)) |
||
151 | && $details['from'] !== $details['to'] |
||
152 | ) { |
||
153 | $filtered[$change] = $details; |
||
154 | } |
||
155 | } |
||
156 | |||
157 | return $filtered; |
||
158 | } |
||
159 | |||
160 | /** |
||
161 | * @return array Associative array of changes, e.g. |
||
162 | * array( |
||
163 | * 'SHA' => array( |
||
164 | * 'from' => 'abc', |
||
165 | * 'to' => 'def' |
||
166 | * ) |
||
167 | * ) |
||
168 | */ |
||
169 | public function getChanges() { |
||
170 | return $this->changes; |
||
171 | } |
||
172 | |||
173 | /** |
||
174 | * Returns a change or a given key. |
||
175 | * |
||
176 | * @return ArrayData|null |
||
177 | */ |
||
178 | public function getChange($key) { |
||
179 | $changes = $this->getChanges(); |
||
180 | if(array_key_exists($key, $changes)) { |
||
181 | return new ArrayData($changes[$key]); |
||
182 | } |
||
183 | return null; |
||
184 | } |
||
185 | |||
186 | /** |
||
187 | * @param string $option |
||
188 | * @param string $value |
||
189 | */ |
||
190 | public function setOption($option, $value) { |
||
191 | $this->options[$option] = $value; |
||
192 | } |
||
193 | |||
194 | /** |
||
195 | * @param string $option |
||
196 | * @return string|null |
||
197 | */ |
||
198 | public function getOption($option) { |
||
199 | if(!empty($this->options[$option])) { |
||
200 | return $this->options[$option]; |
||
201 | } |
||
202 | } |
||
203 | |||
204 | /** |
||
205 | * @return string |
||
206 | */ |
||
207 | public function getOptions() { |
||
208 | return $this->options; |
||
209 | } |
||
210 | |||
211 | /** |
||
212 | * @param string $code |
||
213 | */ |
||
214 | public function setValidationCode($code) { |
||
215 | $this->validationCode = $code; |
||
216 | } |
||
217 | |||
218 | /** |
||
219 | * @return string |
||
220 | */ |
||
221 | public function getValidationCode() { |
||
222 | return $this->validationCode; |
||
223 | } |
||
224 | |||
225 | /** |
||
226 | * @param string $msg |
||
227 | */ |
||
228 | public function setMessage($msg, $code = self::ERROR_CODE) { |
||
229 | $this->messages[] = [ |
||
230 | 'text' => $msg, |
||
231 | 'code' => $code |
||
232 | ]; |
||
233 | |||
234 | $current = $this->getValidationCode(); |
||
235 | $map = [ |
||
236 | DeploymentStrategy::SUCCESS_CODE => 0, |
||
0 ignored issues
–
show
As per coding style,
self should be used for accessing local static members.
This check looks for accesses to local static members using the fully qualified name instead
of <?php
class Certificate {
const TRIPLEDES_CBC = 'ASDFGHJKL';
private $key;
public function __construct()
{
$this->key = Certificate::TRIPLEDES_CBC;
}
}
While this is perfectly valid, the fully qualified name of ![]() |
|||
237 | DeploymentStrategy::WARNING_CODE => 1, |
||
0 ignored issues
–
show
As per coding style,
self should be used for accessing local static members.
This check looks for accesses to local static members using the fully qualified name instead
of <?php
class Certificate {
const TRIPLEDES_CBC = 'ASDFGHJKL';
private $key;
public function __construct()
{
$this->key = Certificate::TRIPLEDES_CBC;
}
}
While this is perfectly valid, the fully qualified name of ![]() |
|||
238 | DeploymentStrategy::ERROR_CODE => 2 |
||
0 ignored issues
–
show
As per coding style,
self should be used for accessing local static members.
This check looks for accesses to local static members using the fully qualified name instead
of <?php
class Certificate {
const TRIPLEDES_CBC = 'ASDFGHJKL';
private $key;
public function __construct()
{
$this->key = Certificate::TRIPLEDES_CBC;
}
}
While this is perfectly valid, the fully qualified name of ![]() |
|||
239 | ]; |
||
240 | if($map[$current] < $map[$code]) { |
||
241 | $this->setValidationCode($code); |
||
242 | } |
||
243 | } |
||
244 | |||
245 | /** |
||
246 | * @return array |
||
247 | */ |
||
248 | public function getMessages() { |
||
249 | return $this->messages; |
||
250 | } |
||
251 | |||
252 | /** |
||
253 | * Transform the deployment strategy to an array. |
||
254 | * |
||
255 | * @return array |
||
256 | */ |
||
257 | View Code Duplication | public function toArray() { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
258 | $fields = array( |
||
259 | 'actionTitle', |
||
260 | 'actionCode', |
||
261 | 'estimatedTime', |
||
262 | 'changes', |
||
263 | 'options', |
||
264 | 'validationCode', |
||
265 | 'messages' |
||
266 | ); |
||
267 | |||
268 | $output = array(); |
||
269 | foreach($fields as $field) { |
||
270 | $output[$field] = $this->$field; |
||
271 | } |
||
272 | return $output; |
||
273 | } |
||
274 | |||
275 | /** |
||
276 | * @return string |
||
277 | */ |
||
278 | public function toJSON() { |
||
279 | return json_encode($this->toArray(), JSON_PRETTY_PRINT); |
||
280 | } |
||
281 | |||
282 | /** |
||
283 | * Load from JSON associative array. |
||
284 | * Environment must be set by the callee when creating this object. |
||
285 | * |
||
286 | * @param string $json |
||
287 | */ |
||
288 | public function fromJSON($json) { |
||
289 | $decoded = json_decode($json, true); |
||
290 | return $this->fromArray($decoded); |
||
291 | } |
||
292 | |||
293 | /** |
||
294 | * Load from array. |
||
295 | * Environment must be set by the callee when creating this object. |
||
296 | * |
||
297 | * @param string $data |
||
298 | */ |
||
299 | View Code Duplication | public function fromArray($data) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
300 | $fields = array( |
||
301 | 'actionTitle', |
||
302 | 'actionCode', |
||
303 | 'estimatedTime', |
||
304 | 'changes', |
||
305 | 'options', |
||
306 | 'validationCode', |
||
307 | 'messages' |
||
308 | ); |
||
309 | |||
310 | foreach($fields as $field) { |
||
311 | if(!empty($data[$field])) { |
||
312 | $this->$field = $data[$field]; |
||
313 | } |
||
314 | } |
||
315 | } |
||
316 | |||
317 | /** |
||
318 | * @return DNDeployment |
||
319 | */ |
||
320 | View Code Duplication | public function createDeployment() { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
321 | $deployment = \DNDeployment::create(); |
||
322 | $deployment->EnvironmentID = $this->environment->ID; |
||
323 | $deployment->SHA = $this->getOption('sha'); |
||
324 | $deployment->RefType = $this->getOption('ref_type'); |
||
325 | $deployment->RefName = $this->getOption('ref_name'); |
||
326 | $deployment->Summary = $this->getOption('summary'); |
||
0 ignored issues
–
show
The property
Summary does not seem to exist. Did you mean summary_fields ?
An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name. If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading. ![]() |
|||
327 | $deployment->Title = $this->getOption('title'); |
||
0 ignored issues
–
show
The property
Title does not exist on object<DNDeployment> . Since you implemented __set , maybe consider adding a @property annotation.
Since your code implements the magic setter <?php
/**
* @property int $x
* @property int $y
* @property string $text
*/
class MyLabel
{
private $properties;
private $allowedProperties = array('x', 'y', 'text');
public function __get($name)
{
if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
return $properties[$name];
} else {
return null;
}
}
public function __set($name, $value)
{
if (in_array($name, $this->allowedProperties)) {
$properties[$name] = $value;
} else {
throw new \LogicException("Property $name is not defined.");
}
}
}
Since the property has write access only, you can use the @property-write annotation instead. Of course, you may also just have mistyped another name, in which case you should fix the error. See also the PhpDoc documentation for @property. ![]() |
|||
328 | $deployment->Strategy = $this->toJSON(); |
||
0 ignored issues
–
show
The property
Strategy does not exist on object<DNDeployment> . Since you implemented __set , maybe consider adding a @property annotation.
Since your code implements the magic setter <?php
/**
* @property int $x
* @property int $y
* @property string $text
*/
class MyLabel
{
private $properties;
private $allowedProperties = array('x', 'y', 'text');
public function __get($name)
{
if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
return $properties[$name];
} else {
return null;
}
}
public function __set($name, $value)
{
if (in_array($name, $this->allowedProperties)) {
$properties[$name] = $value;
} else {
throw new \LogicException("Property $name is not defined.");
}
}
}
Since the property has write access only, you can use the @property-write annotation instead. Of course, you may also just have mistyped another name, in which case you should fix the error. See also the PhpDoc documentation for @property. ![]() |
|||
329 | $deployment->DeployerID = \Member::currentUserID(); |
||
330 | $deployment->write(); |
||
331 | |||
332 | // re-get and return the deployment so we have the correct state |
||
333 | return \DNDeployment::get()->byId($deployment->ID); |
||
334 | } |
||
335 | |||
336 | /** |
||
337 | * @param int $deploymentID |
||
338 | * @return \DNDeployment |
||
339 | */ |
||
340 | View Code Duplication | public function updateDeployment($deploymentID) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
341 | $deployment = \DNDeployment::get()->byId($deploymentID); |
||
342 | $deployment->EnvironmentID = $this->environment->ID; |
||
343 | $deployment->SHA = $this->getOption('sha'); |
||
344 | $deployment->RefType = $this->getOption('ref_type'); |
||
345 | $deployment->RefName = $this->getOption('ref_name'); |
||
346 | $deployment->Summary = $this->getOption('summary'); |
||
0 ignored issues
–
show
The property
Summary does not seem to exist. Did you mean summary_fields ?
An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name. If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading. ![]() |
|||
347 | $deployment->Title = $this->getOption('title'); |
||
348 | $deployment->Strategy = $this->toJSON(); |
||
349 | $deployment->DeployerID = \Member::currentUserID(); |
||
350 | $deployment->write(); |
||
351 | |||
352 | // re-get and return the deployment so we have the correct state |
||
353 | return \DNDeployment::get()->byId($deployment->ID); |
||
354 | } |
||
355 | |||
356 | } |
||
357 | |||
358 |
This check looks for accesses to local static members using the fully qualified name instead of
self::
.While this is perfectly valid, the fully qualified name of
Certificate::TRIPLEDES_CBC
could just as well be replaced byself::TRIPLEDES_CBC
. Referencing local members withself::
assured the access will still work when the class is renamed, makes it perfectly clear that the member is in fact local and will usually be shorter.