Issues (93)

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.

src/Model/Invoice/Invoice.php (3 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
declare(strict_types=1);
4
5
/*
6
 * This software may be modified and distributed under the terms
7
 * of the MIT license. See the LICENSE file for details.
8
 */
9
10
namespace Shapin\Stripe\Model\Invoice;
11
12
use Money\Currency;
13
use Money\Money;
14
use Shapin\Stripe\Model\ContainsMetadata;
15
use Shapin\Stripe\Model\CreatableFromArray;
16
use Shapin\Stripe\Model\Customer\CustomField;
17
use Shapin\Stripe\Model\Discount\Discount;
18
use Shapin\Stripe\Model\LivemodeTrait;
19
use Shapin\Stripe\Model\MetadataCollection;
20
use Shapin\Stripe\Model\MetadataTrait;
21
22
final class Invoice implements CreatableFromArray, ContainsMetadata
23
{
24
    use LivemodeTrait;
25
    use MetadataTrait;
26
27
    const BILLING_CHARGE_AUTOMATICALLY = 'charge_automatically';
28
    const BILLING_SEND_INVOICE = 'send_invoice';
29
30
    const BILLING_REASON_SUBSCRIPTION_CYCLE = 'subscription_cycle';
31
    const BILLING_REASON_SUBSCRIPTION_CREATE = 'subscription_create';
32
    const BILLING_REASON_SUBSCRIPTION_UPDATE = 'subscription_update';
33
    const BILLING_REASON_SUBSCRIPTION = 'subscription';
34
    const BILLING_REASON_MANUAL = 'manual';
35
    const BILLING_REASON_UPCOMING = 'upcoming';
36
    const BILLING_REASON_SUBSCRIPTION_THRESHOLD = 'subscription_threshold';
37
38
    const STATUS_DRAFT = 'draft';
39
    const STATUS_OPEN = 'open';
40
    const STATUS_PAID = 'paid';
41
    const STATUS_UNCOLLECTIBLE = 'uncollectible';
42
    const STATUS_VOID = 'void';
43
44
    /**
45
     * @var ?string
46
     */
47
    private $id;
48
49
    /**
50
     * @var Money
51
     */
52
    private $amountDue;
53
54
    /**
55
     * @var Money
56
     */
57
    private $amountPaid;
58
59
    /**
60
     * @var Money
61
     */
62
    private $amountRemaining;
63
64
    /**
65
     * @var ?Money
66
     */
67
    private $applicationFeeAmount;
68
69
    /**
70
     * @var int
71
     */
72
    private $attemptCount;
73
74
    /**
75
     * @var bool
76
     */
77
    private $attempted;
78
79
    /**
80
     * @var bool
81
     */
82
    private $autoAdvance;
83
84
    /**
85
     * @var string
86
     */
87
    private $collectionMethod;
88
89
    /**
90
     * @var string
91
     */
92
    private $billingReason;
93
94
    /**
95
     * @var ?string
96
     */
97
    private $charge;
98
99
    /**
100
     * @var \DateTimeImmutable
101
     */
102
    private $createdAt;
103
104
    /**
105
     * @var Currency
106
     */
107
    private $currency;
108
109
    /**
110
     * @var array
111
     */
112
    private $customFields;
113
114
    /**
115
     * @var string
116
     */
117
    private $customer;
118
119
    /**
120
     * @var ?string
121
     */
122
    private $defaultSource;
123
124
    /**
125
     * @var string
126
     */
127
    private $description;
128
129
    /**
130
     * @var ?Discount
131
     */
132
    private $discount;
133
134
    /**
135
     * @var ?\DateTimeImmutable
136
     */
137
    private $dueAt;
138
139
    /**
140
     * @var ?Money
141
     */
142
    private $endingBalance;
143
144
    /**
145
     * @var ?string
146
     */
147
    private $footer;
148
149
    /**
150
     * @var ?string
151
     */
152
    private $hostedInvoiceUrl;
153
154
    /**
155
     * @var ?string
156
     */
157
    private $invoicePdf;
158
159
    /**
160
     * @var LineItemCollection
161
     */
162
    private $lines;
163
164
    /**
165
     * @var ?\DateTimeImmutable
166
     */
167
    private $nextPaymentAttempt;
168
169
    /**
170
     * @var string
171
     */
172
    private $number;
173
174
    /**
175
     * @var bool
176
     */
177
    private $paid;
178
179
    /**
180
     * @var ?string
181
     */
182
    private $paymentIntentId;
183
184
    /**
185
     * @var \DateTimeImmutable
186
     */
187
    private $periodEndAt;
188
189
    /**
190
     * @var \DateTimeImmutable
191
     */
192
    private $periodStartAt;
193
194
    /**
195
     * @var ?string
196
     */
197
    private $receiptNumber;
198
199
    /**
200
     * @var Money
201
     */
202
    private $startingBalance;
203
204
    /**
205
     * @var ?string
206
     */
207
    private $statementDescriptor;
208
209
    /**
210
     * @var string
211
     */
212
    private $status;
213
214
    /**
215
     * @var string
216
     */
217
    private $subscription;
218
219
    /**
220
     * @var ?\DateTimeImmutable
221
     */
222
    private $subscriptionProrationAt;
223
224
    /**
225
     * @var Money
226
     */
227
    private $subtotal;
228
229
    /**
230
     * @var Money
231
     */
232
    private $tax;
233
234
    /**
235
     * @var float
236
     */
237
    private $taxPercent;
238
239
    /**
240
     * @var ?ThresholdReason
241
     */
242
    private $thresholdReason;
243
244
    /**
245
     * @var Money
246
     */
247
    private $total;
248
249
    /**
250
     * @var ?\DateTimeImmutable
251
     */
252
    private $webhooksDeliveredAt;
253
254 11
    public static function createFromArray(array $data): self
255
    {
256 11
        $currency = new Currency(strtoupper($data['currency']));
257
258 11
        $customFields = [];
259 11
        if (isset($data['custom_fields'])) {
260
            foreach ($data['custom_fields'] as $customField) {
261
                $customFields[] = new CustomField($customField['name'], $customField['value']);
262
            }
263
        }
264
265 11
        $model = new self();
266 11
        $model->id = $data['id'];
267 11
        $model->amountDue = new Money($data['amount_due'], $currency);
268 11
        $model->amountPaid = new Money($data['amount_paid'], $currency);
269 11
        $model->amountRemaining = new Money($data['amount_remaining'], $currency);
270 11
        $model->applicationFeeAmount = isset($data['application_fee_amount']) ? new Money($data['application_fee_amount'], $currency) : null;
271 11
        $model->attemptCount = (int) $data['attempt_count'];
272 11
        $model->attempted = (bool) $data['attempted'];
273 11
        $model->autoAdvance = (bool) $data['auto_advance'];
274 11
        $model->collectionMethod = $data['collection_method'];
275 11
        $model->billingReason = $data['billing_reason'];
276 11
        $model->charge = $data['charge'];
277 11
        $model->createdAt = new \DateTimeImmutable('@'.$data['created']);
278 11
        $model->currency = $currency;
279 11
        $model->customFields = $customFields;
280 11
        $model->customer = $data['customer'];
281 11
        $model->defaultSource = $data['default_source'] ?? null;
282 11
        $model->description = $data['description'];
283 11
        $model->discount = isset($data['discount']) ? Discount::createFromArray($data['discount']) : null;
284 11
        $model->dueAt = isset($data['due_at']) ? new \DateTimeImmutable('@'.$data['due_at']) : null;
285 11
        $model->endingBalance = isset($data['ending_balance']) ? new Money($data['ending_balance'], $currency) : null;
286 11
        $model->footer = $data['footer'] ?? null;
287 11
        $model->hostedInvoiceUrl = $data['hosted_invoice_url'];
288 11
        $model->invoicePdf = $data['invoice_pdf'];
289 11
        $model->lines = LineItemCollection::createFromArray($data['lines']);
0 ignored issues
show
Documentation Bug introduced by
It seems like \Shapin\Stripe\Model\Inv...omArray($data['lines']) of type object<self> is incompatible with the declared type object<Shapin\Stripe\Mod...ice\LineItemCollection> of property $lines.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
290 11
        $model->live = $data['livemode'];
291 11
        $model->metadata = MetadataCollection::createFromArray($data['metadata']);
0 ignored issues
show
Documentation Bug introduced by
It seems like \Shapin\Stripe\Model\Met...rray($data['metadata']) of type object<self> is incompatible with the declared type object<Shapin\Stripe\Model\MetadataCollection> of property $metadata.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
292 11
        $model->nextPaymentAttempt = isset($data['next_payment_attempt']) ? new \DateTimeImmutable('@'.$data['next_payment_attempt']) : null;
293 11
        $model->number = $data['number'];
294 11
        $model->paid = (bool) $data['paid'];
295 11
        $model->paymentIntentId = $data['payment_intent'];
296 11
        $model->periodEndAt = new \DateTimeImmutable('@'.$data['period_end']);
297 11
        $model->periodStartAt = new \DateTimeImmutable('@'.$data['period_start']);
298 11
        $model->receiptNumber = $data['receipt_number'];
299 11
        $model->startingBalance = new Money($data['starting_balance'], $currency);
300 11
        $model->statementDescriptor = $data['statement_descriptor'];
301 11
        $model->status = $data['status'];
302 11
        $model->subscription = $data['subscription'];
303 11
        $model->subscriptionProrationAt = isset($data['subscription_proration_at']) ? new \DateTimeImmutable('@'.$data['subscription_proration_at']) : null;
304 11
        $model->subtotal = new Money($data['subtotal'], $currency);
305 11
        $model->tax = new Money($data['tax'], $currency);
306 11
        $model->taxPercent = (float) $data['tax_percent'];
307 11
        $model->thresholdReason = isset($data['threshold_reason']) ? ThresholdReason::createFromArray($data['threshold_reason']) : null;
308 11
        $model->total = new Money($data['total'], $currency);
309 11
        $model->webhooksDeliveredAt = isset($data['webhooks_delivered_at']) ? new \DateTimeImmutable('@'.$data['webhooks_delivered_at']) : null;
310
311 11
        return $model;
312
    }
313
314 1
    public function getId(): ?string
315
    {
316 1
        return $this->id;
317
    }
318
319 1
    public function getAmountDue(): Money
320
    {
321 1
        return $this->amountDue;
322
    }
323
324 1
    public function getAmountPaid(): Money
325
    {
326 1
        return $this->amountPaid;
327
    }
328
329 1
    public function getAmountRemaining(): Money
330
    {
331 1
        return $this->amountRemaining;
332
    }
333
334 1
    public function getApplicationFeeAmount(): ?Money
335
    {
336 1
        return $this->applicationFeeAmount;
337
    }
338
339 1
    public function getAttemptCount(): int
340
    {
341 1
        return $this->attemptCount;
342
    }
343
344 1
    public function isAttempted(): bool
345
    {
346 1
        return $this->attempted;
347
    }
348
349 1
    public function isAutoAdvance(): bool
350
    {
351 1
        return $this->autoAdvance;
352
    }
353
354
    public function getBilling(): string
355
    {
356
        @trigger_error('Calling the method getBilling is deprecated since Stripe API 2019-10-17. Use getCollectionMethod instead.', E_USER_DEPRECATED);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
357
358
        return $this->collectionMethod;
359
    }
360
361 1
    public function getCollectionMethod(): string
362
    {
363 1
        return $this->collectionMethod;
364
    }
365
366 1
    public function getBillingReason(): string
367
    {
368 1
        return $this->billingReason;
369
    }
370
371 1
    public function getCharge(): ?string
372
    {
373 1
        return $this->charge;
374
    }
375
376 1
    public function getCreatedAt(): \DateTimeImmutable
377
    {
378 1
        return $this->createdAt;
379
    }
380
381 1
    public function getCurrency(): Currency
382
    {
383 1
        return $this->currency;
384
    }
385
386 1
    public function getCustomFields(): array
387
    {
388 1
        return $this->customFields;
389
    }
390
391 1
    public function getCustomer(): string
392
    {
393 1
        return $this->customer;
394
    }
395
396 1
    public function getDefaultSource(): ?string
397
    {
398 1
        return $this->defaultSource;
399
    }
400
401 1
    public function getDescription(): ?string
402
    {
403 1
        return $this->description;
404
    }
405
406 1
    public function getDiscount(): ?Discount
407
    {
408 1
        return $this->discount;
409
    }
410
411 1
    public function getDueAt(): ?\DateTimeImmutable
412
    {
413 1
        return $this->dueAt;
414
    }
415
416 1
    public function getEndingBalance(): ?Money
417
    {
418 1
        return $this->endingBalance;
419
    }
420
421 1
    public function getFooter(): ?string
422
    {
423 1
        return $this->footer;
424
    }
425
426 1
    public function getHostedInvoiceUrl(): ?string
427
    {
428 1
        return $this->hostedInvoiceUrl;
429
    }
430
431 1
    public function getInvoicePdf(): ?string
432
    {
433 1
        return $this->invoicePdf;
434
    }
435
436 1
    public function getLines(): LineItemCollection
437
    {
438 1
        return $this->lines;
439
    }
440
441 1
    public function getNextPaymentAttempt(): ?\DateTimeImmutable
442
    {
443 1
        return $this->nextPaymentAttempt;
444
    }
445
446 1
    public function getNumber(): string
447
    {
448 1
        return $this->number;
449
    }
450
451 1
    public function isPaid(): bool
452
    {
453 1
        return $this->paid;
454
    }
455
456 1
    public function getPaymentIntentId(): ?string
457
    {
458 1
        return $this->paymentIntentId;
459
    }
460
461 1
    public function getPeriodEndAt(): \DateTimeImmutable
462
    {
463 1
        return $this->periodEndAt;
464
    }
465
466 1
    public function getPeriodStartAt(): \DateTimeImmutable
467
    {
468 1
        return $this->periodStartAt;
469
    }
470
471 1
    public function getReceiptNumber(): ?string
472
    {
473 1
        return $this->receiptNumber;
474
    }
475
476 1
    public function getStartingBalance(): Money
477
    {
478 1
        return $this->startingBalance;
479
    }
480
481 1
    public function getStatementDescriptor(): ?string
482
    {
483 1
        return $this->statementDescriptor;
484
    }
485
486 1
    public function getStatus(): string
487
    {
488 1
        return $this->status;
489
    }
490
491 1
    public function getSubscription(): ?string
492
    {
493 1
        return $this->subscription;
494
    }
495
496 1
    public function getSubscriptionProrationAt(): ?\DateTimeImmutable
497
    {
498 1
        return $this->subscriptionProrationAt;
499
    }
500
501 1
    public function getSubtotal(): Money
502
    {
503 1
        return $this->subtotal;
504
    }
505
506 1
    public function getTax(): Money
507
    {
508 1
        return $this->tax;
509
    }
510
511 1
    public function getTaxPercent(): float
512
    {
513 1
        return $this->taxPercent;
514
    }
515
516 1
    public function getThresholdReason(): ?ThresholdReason
517
    {
518 1
        return $this->thresholdReason;
519
    }
520
521 1
    public function getTotal(): Money
522
    {
523 1
        return $this->total;
524
    }
525
526 1
    public function getWebhooksDeliveredAt(): ?\DateTimeImmutable
527
    {
528 1
        return $this->webhooksDeliveredAt;
529
    }
530
}
531