GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (187)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/Services/AbstractQueuedJob.php (4 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Symbiote\QueuedJobs\Services;
4
5
use SilverStripe\Core\Config\Config;
6
use SilverStripe\ORM\DataObject;
7
use SilverStripe\ORM\FieldType\DBDatetime;
8
use SilverStripe\Subsites\State\SubsiteState;
9
use stdClass;
10
use Symbiote\QueuedJobs\Interfaces\UserContextInterface;
11
12
/**
13
 * A base implementation of a queued job that provides some convenience for implementations
14
 *
15
 * This implementation assumes that when you created your job class, you initialised the
16
 * jobData with relevant variables needed to process() your job later on in execution. If you do not,
17
 * please ensure you do before you queueJob() the job, to ensure the signature that is generated is 'correct'.
18
 *
19
 * @author Marcus Nyeholt <[email protected]>
20
 * @license BSD http://silverstripe.org/bsd-license/
21
 * @skipUpgrade
22
 */
23
abstract class AbstractQueuedJob implements QueuedJob, UserContextInterface
24
{
25
    /**
26
     * @var stdClass
27
     */
28
    protected $jobData;
29
30
    /**
31
     * @var array
32
     */
33
    protected $messages = array();
34
35
    /**
36
     * @var int
37
     */
38
    protected $totalSteps = 0;
39
40
    /**
41
     * @var int
42
     */
43
    protected $currentStep = 0;
44
45
    /**
46
     * @var boolean
47
     */
48
    protected $isComplete = false;
49
50
    /**
51
     * Extensions can have a construct but don't have too.
52
     * Without a construct, it's impossible to create a job in the CMS
53
     * @var array params
54
     */
55
    public function __construct($params = array())
56
    {
57
    }
58
59
    /**
60
     * @return string
61
     */
62
    abstract public function getTitle();
63
64
    /**
65
     * Sets a data object for persisting by adding its id and type to the serialised vars
66
     *
67
     * @param DataObject $object
68
     * @param string $name A name to give it, if you want to store more than one
69
     */
70
    protected function setObject(DataObject $object, $name = 'Object')
71
    {
72
        $this->{$name . 'ID'} = $object->ID;
73
        $this->{$name . 'Type'} = $object->ClassName;
74
    }
75
76
    /**
77
     * @param string $name
78
     * @return DataObject|null
79
     */
80
    protected function getObject($name = 'Object')
81
    {
82
        $id = $this->{$name . 'ID'};
83
        $type = $this->{$name . 'Type'};
84
        if ($id) {
85
            return DataObject::get_by_id($type, $id);
86
        }
87
    }
88
89
    /**
90
     * Return a signature for this queued job
91
     *
92
     * @return string
93
     */
94
    public function getSignature()
95
    {
96
        return md5(get_class($this) . serialize($this->jobData));
97
    }
98
99
    /**
100
     * Generate a somewhat random signature
101
     *
102
     * useful if you're want to make sure something is always added
103
     *
104
     * @return string
105
     */
106
    protected function randomSignature()
107
    {
108
        return md5(get_class($this) . DBDatetime::now()->getTimestamp() . mt_rand(0, 100000));
109
    }
110
111
    /**
112
     * By default jobs should just go into the default processing queue
113
     *
114
     * @return string
115
     */
116
    public function getJobType()
117
    {
118
        return QueuedJob::QUEUED;
119
    }
120
121
    public function getRunAsMemberID()
122
    {
123
        return null;
124
    }
125
126
    /**
127
     * Performs setup tasks the first time this job is run.
128
     *
129
     * This is only executed once for every job. If you want to run something on every job restart, use the
130
     * {@link prepareForRestart} method.
131
     */
132
    public function setup()
133
    {
134
        $this->loadCustomConfig();
135
    }
136
137
    /**
138
     * Run when an already setup job is being restarted.
139
     */
140
    public function prepareForRestart()
141
    {
142
        $this->loadCustomConfig();
143
    }
144
145
    /**
146
     * Do some processing yourself!
147
     */
148
    abstract public function process();
149
150
    /**
151
     * Method for determining whether the job is finished - you may override it if there's
152
     * more to it than just this
153
     */
154
    public function jobFinished()
155
    {
156
        return $this->isComplete;
157
    }
158
159
    /**
160
     * Called when the job is determined to be 'complete'
161
     */
162
    public function afterComplete()
163
    {
164
    }
165
166
    /**
167
     * @return stdClass
168
     */
169
    public function getJobData()
170
    {
171
        // okay, we NEED to store the subsite ID if there's one available
172
        if (!$this->SubsiteID && class_exists(SubsiteState::class)) {
0 ignored issues
show
The property SubsiteID does not exist on object<Symbiote\QueuedJo...ices\AbstractQueuedJob>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?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.");
        }
    }

}

If the property has read access only, you can use the @property-read 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.

Loading history...
173
            $this->SubsiteID = SubsiteState::singleton()->getSubsiteId();
0 ignored issues
show
The property SubsiteID does not exist on object<Symbiote\QueuedJo...ices\AbstractQueuedJob>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?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.

Loading history...
174
        }
175
176
        $data = new stdClass();
177
        $data->totalSteps = $this->totalSteps;
178
        $data->currentStep = $this->currentStep;
179
        $data->isComplete = $this->isComplete;
180
        $data->jobData = $this->jobData;
181
        $data->messages = $this->messages;
182
183
        return $data;
184
    }
185
186
    /**
187
     * @param int $totalSteps
188
     * @param int $currentStep
189
     * @param boolean $isComplete
190
     * @param stdClass $jobData
191
     * @param array $messages
192
     */
193
    public function setJobData($totalSteps, $currentStep, $isComplete, $jobData, $messages)
194
    {
195
        $this->totalSteps = $totalSteps;
196
        $this->currentStep = $currentStep;
197
        $this->isComplete = $isComplete;
198
        $this->jobData = $jobData;
199
        $this->messages = $messages;
200
    }
201
202
    /**
203
     * Gets custom config settings to use when running the job.
204
     *
205
     * @return array|null
206
     */
207
    public function getCustomConfig()
208
    {
209
        return $this->CustomConfig;
0 ignored issues
show
The property CustomConfig does not exist on object<Symbiote\QueuedJo...ices\AbstractQueuedJob>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?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.");
        }
    }

}

If the property has read access only, you can use the @property-read 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.

Loading history...
210
    }
211
212
    /**
213
     * Sets custom config settings to use when the job is run.
214
     *
215
     * @param array $config
216
     */
217
    public function setCustomConfig(array $config)
218
    {
219
        $this->CustomConfig = $config;
0 ignored issues
show
The property CustomConfig does not exist on object<Symbiote\QueuedJo...ices\AbstractQueuedJob>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?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.

Loading history...
220
    }
221
222
    /**
223
     * Sets custom configuration settings from the job data.
224
     */
225
    private function loadCustomConfig()
226
    {
227
        $custom = $this->getCustomConfig();
228
229
        if (!is_array($custom)) {
230
            return;
231
        }
232
233
        foreach ($custom as $class => $settings) {
234
            foreach ($settings as $setting => $value) {
235
                Config::modify()->set($class, $setting, $value);
236
            }
237
        }
238
    }
239
240
    /**
241
     * @param string $message
242
     * @param string $severity
243
     */
244
    public function addMessage($message, $severity = 'INFO')
245
    {
246
        $severity = strtoupper($severity);
247
        $this->messages[] = '[' . DBDatetime::now()->Rfc2822() . "][$severity] $message";
248
    }
249
250
    /**
251
     * Convenience methods for setting and getting job data
252
     *
253
     * @param mixed $name
254
     * @param mixed $value
255
     */
256
    public function __set($name, $value)
257
    {
258
        if (!$this->jobData) {
259
            $this->jobData = new stdClass();
260
        }
261
        $this->jobData->$name = $value;
262
    }
263
264
    /**
265
     * Retrieve some job data
266
     *
267
     * @param mixed $name
268
     * @return mixed
269
     */
270
    public function __get($name)
271
    {
272
        return isset($this->jobData->$name) ? $this->jobData->$name : null;
273
    }
274
}
275