Issue summary
During Auth Begin, a session is created without any scope / accessToken etc.. set. So these fields are null. In this state if $session->isValid() is called, it results in a TypeError.
Because isValid calls Context::$SCOPES->equals($this->scope).
Here $this->scope is null.
SCOPES->equals calls $scopes = new self($scopes);.
And in the constructor of Scopes
|
public function __construct($scopes) |
|
{ |
|
if (is_string($scopes)) { |
|
$scopesArray = explode(self::SCOPE_DELIMITER, $scopes); |
|
} else { |
|
$scopesArray = $scopes; |
|
} |
|
|
|
$scopesArray = array_unique(array_filter(array_map('trim', $scopesArray))); |
is_string returns false for null type, but this code assumes that is not string, then must be array and continues. Resulting in array_map call throwing a TypeError because it expects array, but null given.
Expected behavior
What do you think should happen?
No PHP TypeError should happen.
Actual behavior
What actually happens?
TypeError
Details
php > require_once 'vendor/autoload_runtime.php';
php > $s = new \Shopify\Auth\Scopes(null);
PHP Warning: Uncaught TypeError: array_map(): Argument #2 ($array) must be of type array, null given in /home/******************************/vendor/shopify/shopify-api/src/Auth/Scopes.php:27
Stack trace:
#0 /home/******************************/vendor/shopify/shopify-api/src/Auth/Scopes.php(27): array_map()
#1 php shell code(1): Shopify\Auth\Scopes->__construct()
#2 {main}
thrown in /home/******************************/vendor/shopify/shopify-api/src/Auth/Scopes.php on line 27
Steps to reproduce the problem
php -a
require_once 'vendor/autoload_runtime.php';
$s = new \Shopify\Auth\Scopes(null);
Reduced test case
The best way to get your bug fixed is to provide a reduced test case.
Checklist
Possible Solution
public function __construct($scopes)
{
if (is_string($scopes)) {
$scopesArray = explode(self::SCOPE_DELIMITER, $scopes);
} else {
$scopesArray = $scopes ?? [];
}
Adding ?? [] should fix it.
Or Session->isValid shouldn't call Context::$SCOPES->equals if $this->scope is null.
Issue summary
During Auth Begin, a session is created without any scope / accessToken etc.. set. So these fields are null. In this state if $session->isValid() is called, it results in a TypeError.
Because isValid calls
Context::$SCOPES->equals($this->scope).Here
$this->scopeis null.SCOPES->equalscalls$scopes = new self($scopes);.And in the constructor of
Scopesshopify-api-php/src/Auth/Scopes.php
Lines 19 to 27 in d368eef
is_stringreturns false for null type, but this code assumes that is not string, then must be array and continues. Resulting inarray_mapcall throwing a TypeError because it expects array, but null given.Expected behavior
What do you think should happen?
No PHP TypeError should happen.
Actual behavior
What actually happens?
TypeError
Details
Steps to reproduce the problem
php -aReduced test case
The best way to get your bug fixed is to provide a reduced test case.
Checklist
Possible Solution
Adding
?? []should fix it.Or
Session->isValidshouldn't callContext::$SCOPES->equalsif$this->scopeis null.