Issues (142)

Security Analysis    no request data  

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.

lib/ConfigToken/TokenCollection.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 ConfigToken;
4
5
use ConfigToken\TokenFilter\Exception\UnknownFilterException;
6
use ConfigToken\TokenResolver\Exception\OutOfScopeException;
7
use ConfigToken\TokenResolver\Exception\ScopeTokenValueSerializationException;
8
use ConfigToken\TokenResolver\Exception\TokenFormatException;
9
use ConfigToken\TokenResolver\Exception\UnknownTokenException;
10
use ConfigToken\TokenResolver\TokenResolverInterface;
11
12
/**
13
 * Generic token collection class used in conjunction with a given token resolver instance to resolve
14
 * tokens to values and apply the given filters.
15
 */
16
class TokenCollection implements \IteratorAggregate
17
{
18
    /** @var Token[] */
19
    protected $tokens =array ();
20
21
    /** @var string */
22
    protected $sourceHash;
23
24
    /** @var boolean */
25
    protected $ignoreUnknownFilters = True;
26
27
    /**
28
     * @param Token[] $tokens Array of Token with tokenString as keys.
29
     */
30 15
    public function __construct(array $tokens = null)
31
    {
32 15
        if (isset($tokens)) {
33 1
            $this->tokens = $tokens;
34 1
        }
35 15
    }
36
37
    /**
38
     * Get the ignore unknown filters flag.
39
     *
40
     * @return boolean
41
     */
42
    public function getIgnoreUnknownFilters()
43
    {
44
        return $this->ignoreUnknownFilters;
45
    }
46
47
    /**
48
     * Set the ignore unknown filters flag.
49
     *
50
     * @param boolean $ignoreUnknownFilters The new value for the ignore unknown filters flag.
51
     * @return $this
52
     */
53
    public function setIgnoreUnknownFilters($ignoreUnknownFilters)
54
    {
55
        $this->ignoreUnknownFilters = $ignoreUnknownFilters;
56
        return $this;
57
    }
58
59
    /**
60
     * (PHP 5 &gt;= 5.0.0)<br/>
61
     * Retrieve an external iterator
62
     * @link http://php.net/manual/en/iteratoraggregate.getiterator.php
63
     * @return \Traversable An instance of an object implementing <b>Iterator</b> or <b>Traversable</b>
64
     */
65
    public function getIterator()
66
    {
67
        return new \ArrayIterator($this->tokens);
68
    }
69
70
71
    /**
72
     * Check if the source hash was set.
73
     *
74
     * @return boolean
75
     */
76 1
    public function hasSourceHash()
77
    {
78 1
        return isset($this->sourceHash);
79
    }
80
81
    /**
82
     * Get the source hash.
83
     *
84
     * @return string|null
85
     */
86 1
    public function getSourceHash()
87
    {
88 1
        if (!$this->hasSourceHash()) {
89
            return null;
90
        }
91 1
        return $this->sourceHash;
92
    }
93
94
    /**
95
     * Set the source hash.
96
     *
97
     * @param string $value The new value.
98
     * @return $this
99
     */
100 14
    public function setSourceHash($value)
101
    {
102 14
        $this->sourceHash = $value;
103 14
        return $this;
104
    }
105
106
    /**
107
     * Check if the list of tokens is empty.
108
     *
109
     * @return boolean
110
     */
111 6
    public function isEmpty()
112
    {
113 6
        return count($this->tokens) == 0;
114
    }
115
116
    /**
117
     * Get the number of tokens in the list
118
     *
119
     * @return integer
120
     */
121 1
    public function getCount()
122
    {
123 1
        return count($this->tokens);
124
    }
125
126
    /**
127
     * Add a new token to the list.
128
     * If another token already exists with the same tokenString then it will be overwritten.
129
     *
130
     * @param Token $token
131
     * @return $this
132
     */
133 14
    public function add(Token $token)
134
    {
135 14
        $this->tokens[$token->getTokenString()] = $token;
136
137 14
        return $this;
138
    }
139
140
    /**
141
     * Import add all tokens from another list.
142
     * Existing tokens will be overwritten. The hash will be unset.
143
     *
144
     * @param TokenCollection $tokens
145
     * @return $this
146
     */
147 1
    public function import(TokenCollection $tokens)
148
    {
149 1
        foreach ($tokens->tokens as $tokenString => $token) {
150 1
            $this->tokens[$tokenString] = $token;
151 1
        }
152 1
        $this->sourceHash = null;
153
154 1
        return $this;
155
    }
156
157
    /**
158
     * Remove the given token from the list.
159
     *
160
     * @param Token $token
161
     * @return $this
162
     */
163 1
    public function remove(Token $token)
164
    {
165 1
        unset($this->tokens[$token->getTokenString()]);
166 1
        return $this;
167
    }
168
169
    /**
170
     * Clear the list of tokens.
171
     *
172
     * @return $this
173
     */
174 1
    public function clear()
175
    {
176 1
        $this->tokens = array();
177 1
        return $this;
178
    }
179
180
    /**
181
     * Check if a token with the given token string is in this list.
182
     *
183
     * @param string $tokenString
184
     * @return boolean
185
     */
186 14
    public function has($tokenString)
187
    {
188 14
        return isset($this->tokens[$tokenString]);
189
    }
190
191
    /**
192
     * Get a token from this list having the given token string.
193
     *
194
     * @param string $tokenString
195
     * @return Token
196
     */
197 2
    public function get($tokenString)
198
    {
199 2
        return $this->tokens[$tokenString];
200
    }
201
202
    /**
203
     * Get the list of tokens as an associative array of Token with tokenString as keys.
204
     *
205
     * @return Token[]
206
     */
207 7
    public function getArray()
208
    {
209 7
        return $this->tokens;
210
    }
211
212
    /**
213
     * Get all token names.
214
     *
215
     * @return string[]
216
     */
217
    public function getNames()
218
    {
219
        $result = array();
220
        foreach ($this->tokens as $token) {
221
            $tokenName = $token->getTokenName();
222
            $result[$tokenName] = $tokenName;
223
        }
224
        return $result;
225
    }
226
227
    /**
228
     * Find tokens having the given token name.
229
     *
230
     * @param string|string[]|null $tokenNameToFind Null to find all. String to find a certain token. Array of strings
231
     *                                              To find multiple tokens.
232
     * @return Token[]|array Array of Token if $tokenNameToFind is string, Array of arrays of Token with token names
233
     *                       as keys if $tokenNameToFind is string[] or null.
234
     */
235 1
    public function findByName($tokenNameToFind = null)
236
    {
237 1
        $result = array();
238 1
        foreach ($this->tokens as $tokenString => $token)
239
        {
240 1
            $tokenName = $token->getTokenName();
241 1
            if ((!isset($tokenNameToFind)) || (is_array($tokenNameToFind) && in_array($tokenName, $tokenNameToFind)) ||
242 1
                ($tokenName == $tokenNameToFind)) {
243 1
                if (!isset($result[$tokenName])) {
244 1
                    $result[$tokenName] = array();
245 1
                }
246 1
                $result[$tokenName][$tokenString] = $token;
247 1
            }
248 1
        }
249 1
        if (isset($tokenNameToFind) && isset($result[$tokenNameToFind])) {
250 1
            return $result[$tokenNameToFind];
251
        }
252 1
        return $result;
253
    }
254
255
    /**
256
     * Find all resolved tokens.
257
     *
258
     * @return Token[]
259
     */
260 1 View Code Duplication
    public function findResolved()
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.

Loading history...
261
    {
262 1
        $result = array();
263 1
        foreach ($this->tokens as $tokenString => $token)
264
        {
265 1
            if ($token->getIsResolved()) {
266 1
                $result[$tokenString] = $token;
267 1
            }
268 1
        }
269 1
        return $result;
270
    }
271
272
    /**
273
     * Find all tokens resolved but not yet injected.
274
     *
275
     * @return Token[]
276
     */
277 1 View Code Duplication
    public function findResolvedAndNotInjected()
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.

Loading history...
278
    {
279 1
        $result = array();
280 1
        foreach ($this->tokens as $tokenString => $token)
281
        {
282 1
            if ($token->getIsResolved() && (!$token->getIsInjected())) {
283 1
                $result[$tokenString] = $token;
284 1
            }
285 1
        }
286 1
        return $result;
287
    }
288
289
    /**
290
     * Find all unresolved tokens.
291
     *
292
     * @return Token[]
293
     */
294 1 View Code Duplication
    public function findUnresolved()
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.

Loading history...
295
    {
296 1
        $result = array();
297 1
        foreach ($this->tokens as $tokenString => $token)
298
        {
299 1
            if (!$token->getIsResolved()) {
300 1
                $result[$tokenString] = $token;
301 1
            }
302 1
        }
303 1
        return $result;
304
    }
305
306
    /**
307
     * Check if at least one unresolved token exists in the list.
308
     *
309
     * @return boolean
310
     */
311 1
    public function hasUnresolved()
312
    {
313 1
        foreach ($this->tokens as $tokenString => $token)
314
        {
315 1
            if (!$token->getIsResolved()) {
316 1
                return True;
317
            }
318 1
        }
319
        return False;
320
    }
321
322
    /**
323
     * Find all tokens with unresolved filters.
324
     *
325
     * @return Token[]
326
     */
327 1 View Code Duplication
    public function findWithUnresolvedFilters()
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.

Loading history...
328
    {
329 1
        $result = array();
330 1
        foreach ($this->tokens as $tokenString => $token)
331
        {
332 1
            if ($token->hasUnresolvedFilters()) {
333 1
                $result[$tokenString] = $token;
334 1
            }
335 1
        }
336 1
        return $result;
337
    }
338
339
    /**
340
     * Attempt to resolve the values for all tokens in the list.
341
     *
342
     * @param TokenResolverInterface $tokenResolver
343
     * @param boolean|null $ignoreUnknownTokens Null to use token resolver option.
344
     * @param boolean|null $ignoreUnknownFilters Null to use collection option.
345
     * @throws UnknownFilterException
346
     *
347
     * If using RegisteredTokenResolver:
348
     * @throws UnknownTokenException If the token name was not registered and set not to ignore unknown tokens.
349
     *
350
     * If using ScopeTokenResolver:
351
     * @throws UnknownTokenException
352
     * @throws OutOfScopeException
353
     * @throws ScopeTokenValueSerializationException
354
     * @throws TokenFormatException
355
     * @return $this
356
     */
357 14
    public function resolve(TokenResolverInterface $tokenResolver,
358
                            $ignoreUnknownTokens = null, $ignoreUnknownFilters = null)
359
    {
360 14
        if (is_null($ignoreUnknownTokens)) {
361 10
            $ignoreUnknownTokens = $tokenResolver->getIgnoreUnknownTokens();
362 10
        }
363 14
        if (is_null($ignoreUnknownFilters)) {
364 14
            $ignoreUnknownFilters = $this->ignoreUnknownFilters;
365 14
        }
366 14
        foreach ($this->tokens as $tokenString => $token) {
367 14
            if ($token->getIsResolved() && (!$token->hasUnresolvedFilters())) {
368
                continue;
369
            }
370 14
            if (!$token->getIsResolved()) {
371 14
                $token->resolveUnfilteredValue($tokenResolver, $ignoreUnknownTokens);
372 10
            }
373 10
            if ($token->hasFilters() && $token->hasUnfilteredTokenValue()) {
374 3
                $token->applyFilters($ignoreUnknownFilters);
375 3
            }
376 10
        }
377 8
        return $this;
378
    }
379
380
}