diff --git a/Makefile b/Makefile index add949a..7d9358f 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ fix-style: php-cs-fixer.phar cli: docker-compose run --rm php bash -install: +install: composer.json package.json $(DOCKER_PHP) composer install --prefer-dist --no-interaction --no-progress --ansi $(DOCKER_NODE) yarn install diff --git a/src/ReferenceContext.php b/src/ReferenceContext.php index bde0a96..6c3a4f1 100644 --- a/src/ReferenceContext.php +++ b/src/ReferenceContext.php @@ -121,10 +121,18 @@ private function reduceDots($path) unset($parts[$i]); continue; } - if ($i > 0 && $parts[$i] === '..' && $parts[$i - $parentOffset] !== '..') { - unset($parts[$i - $parentOffset]); + + if ($i > 0 && $parts[$i] === '..') { + $parent = $i - $parentOffset; + //Make sure parent exists, if not, check the next parent etc + while($parent >= 0 && empty($parts[$parent])){ + $parent--; + } + //Confirm parent is valid + if(!empty($parts[$parent]) && $parts[$parent] !== '..'){ + unset($parts[$parent]); + } unset($parts[$i]); - $parentOffset += 2; } } return '/'.implode('/', $parts); diff --git a/tests/ReferenceContextTest.php b/tests/ReferenceContextTest.php index b06eb5f..dad12c1 100644 --- a/tests/ReferenceContextTest.php +++ b/tests/ReferenceContextTest.php @@ -179,6 +179,22 @@ public function normalizeUriProvider() '/var/www/api/../definitions.yaml', 'file:///var/www/definitions.yaml', ], + [ + '/./definitions.yaml', + 'file:///definitions.yaml', + ], + [ + '/var/www/api/schema/../../definitions.yaml', + 'file:///var/www/definitions.yaml', + ], + [ + '/var/www/api/schema/./../data/./../definitions.yaml', + 'file:///var/www/api/definitions.yaml', + ], + [ + '/var/www/api/schema/./../definitions.yaml', + 'file:///var/www/api/definitions.yaml', + ], [ '/var/www/api/../definitions.yaml#/components/Pet', 'file:///var/www/definitions.yaml#/components/Pet',