From ca59ff4753f3532f58716e78b6ed23ef88b35b51 Mon Sep 17 00:00:00 2001 From: Bart Geesink Date: Thu, 7 Dec 2023 16:54:17 +0100 Subject: [PATCH 01/52] GHA: Add action to build a test image --- .../build-push-test-docker-image.yml | 58 +++++++++++++++++++ component_info | 1 + docker/Dockerfile.test | 20 +++++++ 3 files changed, 79 insertions(+) create mode 100644 .github/workflows/build-push-test-docker-image.yml create mode 100644 docker/Dockerfile.test diff --git a/.github/workflows/build-push-test-docker-image.yml b/.github/workflows/build-push-test-docker-image.yml new file mode 100644 index 00000000..3300f230 --- /dev/null +++ b/.github/workflows/build-push-test-docker-image.yml @@ -0,0 +1,58 @@ +name: build-push-test-docker-image + +on: + push: + branches: + - feature/create_docker_publish_action + workflow_dispatch: + +jobs: + build-push-test-docker-image: + runs-on: ubuntu-latest + permissions: + packages: write + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Build the app + uses: openconext/build-and-publish-test-container/php72-node14@main + with: + use_yarn: true + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set docker labels and tags + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/openconext/stepup-tiqr/stepup-tiqr + flavor: | + latest=false + suffix=-test + tags: | + type=ref,event=tag + type=semver,pattern={{version}} + type=sha + type=raw,suffix=,value=test + + - name: Build and push the TEST image + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile.test + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/component_info b/component_info index b63d8eb7..9bdcd9b4 100644 --- a/component_info +++ b/component_info @@ -4,3 +4,4 @@ ENCORE=yes ASSETIC=no NODE_VERSION=14 COMPOSER_VERSION=2 +TEST_EXTRA_DIRS="dev/ ci/" diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test new file mode 100644 index 00000000..944b78cc --- /dev/null +++ b/docker/Dockerfile.test @@ -0,0 +1,20 @@ +FROM ghcr.io/openconext/openconext-basecontainers/php72-apache2:latest AS php-build +# Set the default workdir +WORKDIR /var/www/html +ADD output.tar /var/www/html/ +# Add the application configuration files +COPY config/legacy/parameters.yaml.dist config/legacy/parameters.yaml +COPY config/packages/prod/monolog.yaml.docker config/packages/prod/monolog.yaml + +# TIQR needs some assests to be installed +RUN bin/console assets:install + +# Add the config files for Apache2 +RUN rm -rf /etc/apache2/sites-enabled/* +COPY ./docker/conf/tiqr-apache2.conf /etc/apache2/sites-enabled/tiqr.conf +RUN rm -rf /var/www/html/var/cache/prod && \ + mkdir -p /var/www/html/var/ && \ + chown -R www-data /var/www/html/var +EXPOSE 80 + +CMD ["apache2-foreground"] From 8f49c06921780686eee18060dec47a85702b272c Mon Sep 17 00:00:00 2001 From: Bart Geesink Date: Wed, 13 Dec 2023 16:30:44 +0100 Subject: [PATCH 02/52] Docker: Set SetEnv HTTPS on in Apache --- docker/conf/tiqr-apache2.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/conf/tiqr-apache2.conf b/docker/conf/tiqr-apache2.conf index c5e90392..9cbc2f91 100644 --- a/docker/conf/tiqr-apache2.conf +++ b/docker/conf/tiqr-apache2.conf @@ -3,7 +3,7 @@ ServerAdmin admin@surf.nl DocumentRoot /var/www/html/public - + SetEnv HTTPS on SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 From a4136d82f047dc9864f8b53abd2b14b0b53bebb2 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 19 Dec 2023 12:14:38 +0100 Subject: [PATCH 03/52] Rearange the ci/qa folder and its contents Before upgrading to SF6 and upgrading all dependencies, I opted to first upgrade the qa tooling. They will not pass by any means at this point. --- .docheader | 2 +- .github/workflows/test-acceptance.yml | 29 ++++ .github/workflows/test-integration.yml | 66 +++------ .gitignore | 8 +- ci/qa/behat | 2 +- ci/qa/{qa-config => }/behat.yml | 0 ci/qa/docheader | 6 + ci/qa/jscpd | 9 ++ ci/qa/lint | 4 +- ci/qa/phpcbf | 6 + ci/qa/phpcs | 7 + ci/qa/{qa-config => }/phpcs.xml | 2 +- ci/qa/phplint.yaml | 7 + ci/qa/phpmd | 5 + ci/qa/{qa-config => }/phpmd.xml | 2 +- ci/qa/phpstan | 5 + ci/qa/phpstan-baseline.neon | 2 + ci/qa/phpstan-update-baseline | 5 + ci/qa/phpunit | 2 +- ci/qa/{qa-config => }/phpunit.xml | 2 +- ci/qa/security-tests | 14 -- ci/qa/static-analysis | 25 ---- ci/qa/validate | 6 + composer.json | 38 +++-- composer.lock | 192 ++++++++++++++++++++++++- symfony.lock | 12 ++ 26 files changed, 347 insertions(+), 111 deletions(-) create mode 100644 .github/workflows/test-acceptance.yml rename ci/qa/{qa-config => }/behat.yml (100%) create mode 100755 ci/qa/docheader create mode 100755 ci/qa/jscpd create mode 100755 ci/qa/phpcbf create mode 100755 ci/qa/phpcs rename ci/qa/{qa-config => }/phpcs.xml (87%) create mode 100644 ci/qa/phplint.yaml create mode 100755 ci/qa/phpmd rename ci/qa/{qa-config => }/phpmd.xml (92%) create mode 100755 ci/qa/phpstan create mode 100644 ci/qa/phpstan-baseline.neon create mode 100755 ci/qa/phpstan-update-baseline rename ci/qa/{qa-config => }/phpunit.xml (96%) delete mode 100755 ci/qa/security-tests delete mode 100755 ci/qa/static-analysis create mode 100755 ci/qa/validate diff --git a/.docheader b/.docheader index 3201d103..a12ddf88 100644 --- a/.docheader +++ b/.docheader @@ -1,5 +1,5 @@ /** - * Copyright %regexp:\d\d\d\d% SURFnet B.V. + * Copyright %regexp:\d{4}% SURFnet %regexp:(B.V.|bv)% * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/.github/workflows/test-acceptance.yml b/.github/workflows/test-acceptance.yml new file mode 100644 index 00000000..f6afd317 --- /dev/null +++ b/.github/workflows/test-acceptance.yml @@ -0,0 +1,29 @@ +name: Run acceptance tests (Behat) +on: [pull_request] + +jobs: + run-qa-tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: /var/www/html/ + container: + image: ghcr.io/openconext/openconext-basecontainers/php82-apache2-node20-composer2:latest + volumes: + - .:/var/www/html + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Copy certificate material + run: mkdir /config && cp -r ./ci/config/* /config/ + + - name: Composer install + run: composer install + + - name: Yarn & Yarn Encore + run: yarn && yarn encore production + + - name: Run Behat tests + run: composer behat diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 6b161fd5..88596225 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -1,51 +1,23 @@ -name: test-integration -on: - pull_request: - push: - branches: [ master, develop ] +name: Run QA tests (static analysis, lint and unit tests) +on: [pull_request] + jobs: - build: + run-qa-tests: runs-on: ubuntu-latest - timeout-minutes: 5 + defaults: + run: + working-directory: /var/www/html/ + container: + image: ghcr.io/openconext/openconext-basecontainers/php82-apache2-node20-composer2:latest + volumes: + - .:/var/www/html + steps: - name: Checkout - uses: actions/checkout@v1 - - name: Get Composer Cache Directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Generate SSL key and certificate - run: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ci/files/tiqr.stepup.example.com.key -out ./ci/files/tiqr.stepup.example.com.crt -subj "/C=NL/ST=Netherlands/L=Amsterdam/O=TEST/CN=tiqr.example.com" - - name: Init environment - run: | - cd ci/docker - docker-compose up -d - - name: Install dependencies - run: | - cd ci/docker && docker-compose exec -T app.tiqr.stepup.example.com bash -lc ' - cp .env.ci .env - cp config/legacy/parameters.yaml.dist config/legacy/parameters.yaml - composer install - yarn - ' - - name: Build frontend assets - run: cd ci/docker && docker-compose exec -T app.tiqr.stepup.example.com bash -lc 'yarn encore production' - - name: Run test scripts - run: cd ci/docker && docker-compose exec -T app.tiqr.stepup.example.com bash -lc ' composer test ' - - name: Output log files on failure - if: failure() - run: tail -2000 /var/log/syslog + uses: actions/checkout@v2 + + - name: Composer install + run: composer install + + - name: Run QA tests + run: composer check diff --git a/.gitignore b/.gitignore index 08e211c0..894512a6 100644 --- a/.gitignore +++ b/.gitignore @@ -72,11 +72,15 @@ yarn-error.log ###> symfony/phpunit-bridge ### .phpunit -.phpunit.result.cache -/phpunit.xml +ci/qa/.phpunit.result.cache +ci/qa/phpunit.xml ###< symfony/phpunit-bridge ### local-php-security-checker tiqr.stepup.example.com.crt tiqr.stepup.example.com.key ci/qa/.phpcs-cache + +###> phpstan/phpstan ### +phpstan.neon +###< phpstan/phpstan ### diff --git a/ci/qa/behat b/ci/qa/behat index 4a318baf..bffb8662 100755 --- a/ci/qa/behat +++ b/ci/qa/behat @@ -3,4 +3,4 @@ cd $(dirname $0)/../../ printf "\nStart Behat tests\n" -vendor/bin/behat --stop-on-failure --config ./ci/qa/qa-config/behat.yml --tags=~skip +vendor/bin/behat --stop-on-failure --config ./ci/qa/behat.yml --tags=~skip diff --git a/ci/qa/qa-config/behat.yml b/ci/qa/behat.yml similarity index 100% rename from ci/qa/qa-config/behat.yml rename to ci/qa/behat.yml diff --git a/ci/qa/docheader b/ci/qa/docheader new file mode 100755 index 00000000..3f30bebc --- /dev/null +++ b/ci/qa/docheader @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +./vendor/bin/docheader check src/ dev/ tests/ + diff --git a/ci/qa/jscpd b/ci/qa/jscpd new file mode 100755 index 00000000..f33e552e --- /dev/null +++ b/ci/qa/jscpd @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +#jscpd static analysis +# Run the JS CPD tool: +# - ignoring the test files and public resources +# - allowing for 40 lines of duplicate code +# - and setting a total copy paste limit to 1% project wide +# More info about jscpd usage: https://github.com/kucherenko/jscpd/tree/master/packages/jscpd#usage +./node_modules/.bin/jscpd src public -l 40 -t 1 diff --git a/ci/qa/lint b/ci/qa/lint index 996e5fe5..0c1e4058 100755 --- a/ci/qa/lint +++ b/ci/qa/lint @@ -4,8 +4,8 @@ cd $(dirname $0)/../../ printf "\nStart application Linting\n" #Lints PHP,yml,ts,tsc and composer.json -vendor/bin/parallel-lint dev src +./vendor/bin/phplint --no-ansi -n --no-progress --configuration=ci/qa/phplint.yaml $1 + bin/console lint:yaml config yarn tslint --project tsconfig.json yarn tsc --noEmit -composer validate diff --git a/ci/qa/phpcbf b/ci/qa/phpcbf new file mode 100755 index 00000000..5fe25cb8 --- /dev/null +++ b/ci/qa/phpcbf @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +# https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically +./vendor/bin/phpcbf --standard=ci/qa/phpcs.xml ./src $1 diff --git a/ci/qa/phpcs b/ci/qa/phpcs new file mode 100755 index 00000000..33a2563a --- /dev/null +++ b/ci/qa/phpcs @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +# https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage +./vendor/bin/phpcs --standard=./ci/qa/phpcs.xml --report=full --warning-severity=0 ./src +./vendor/bin/phpcs --standard=./ci/qa/phpcs.xml --report=full --warning-severity=0 ./dev diff --git a/ci/qa/qa-config/phpcs.xml b/ci/qa/phpcs.xml similarity index 87% rename from ci/qa/qa-config/phpcs.xml rename to ci/qa/phpcs.xml index fa6361ee..603409b5 100644 --- a/ci/qa/qa-config/phpcs.xml +++ b/ci/qa/phpcs.xml @@ -1,7 +1,7 @@ + xsi:noNamespaceSchemaLocation="../../vendor/squizlabs/php_codesniffer/phpcs.xsd"> diff --git a/ci/qa/phplint.yaml b/ci/qa/phplint.yaml new file mode 100644 index 00000000..f07ad6c9 --- /dev/null +++ b/ci/qa/phplint.yaml @@ -0,0 +1,7 @@ +path: [./src, ./tests] +jobs: 10 +cache: /var/qa/phplint.cache +extensions: + - php +exclude: + - vendor diff --git a/ci/qa/phpmd b/ci/qa/phpmd new file mode 100755 index 00000000..777f280a --- /dev/null +++ b/ci/qa/phpmd @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +./vendor/bin/phpmd src text ci/qa/phpmd.xml --suffixes php diff --git a/ci/qa/qa-config/phpmd.xml b/ci/qa/phpmd.xml similarity index 92% rename from ci/qa/qa-config/phpmd.xml rename to ci/qa/phpmd.xml index ddd33be7..73a89e3a 100644 --- a/ci/qa/qa-config/phpmd.xml +++ b/ci/qa/phpmd.xml @@ -4,7 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> - PHPMD ruleset for SURFnet Service Provider Dashboard + PHPMD ruleset diff --git a/ci/qa/phpstan b/ci/qa/phpstan new file mode 100755 index 00000000..f60f8059 --- /dev/null +++ b/ci/qa/phpstan @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +vendor/bin/phpstan analyse --memory-limit=-1 --no-ansi -c ./ci/qa/phpstan.neon diff --git a/ci/qa/phpstan-baseline.neon b/ci/qa/phpstan-baseline.neon new file mode 100644 index 00000000..364905f7 --- /dev/null +++ b/ci/qa/phpstan-baseline.neon @@ -0,0 +1,2 @@ +parameters: + ignoreErrors: diff --git a/ci/qa/phpstan-update-baseline b/ci/qa/phpstan-update-baseline new file mode 100755 index 00000000..50441d85 --- /dev/null +++ b/ci/qa/phpstan-update-baseline @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +vendor/bin/phpstan analyse --memory-limit=-1 --no-ansi -c ./ci/qa/phpstan.neon --generate-baseline ./ci/qa/phpstan-baseline.neon diff --git a/ci/qa/phpunit b/ci/qa/phpunit index b19dbdba..8a85f031 100755 --- a/ci/qa/phpunit +++ b/ci/qa/phpunit @@ -3,4 +3,4 @@ cd $(dirname $0)/../../ printf "\nStart PHPUnit tests\n" -XDEBUG_MODE=coverage ./vendor/bin/phpunit --configuration=ci/qa/qa-config/phpunit.xml --coverage-text +XDEBUG_MODE=coverage ./vendor/bin/phpunit --configuration=ci/qa/phpunit.xml --coverage-text diff --git a/ci/qa/qa-config/phpunit.xml b/ci/qa/phpunit.xml similarity index 96% rename from ci/qa/qa-config/phpunit.xml rename to ci/qa/phpunit.xml index d7669c03..1802ac96 100644 --- a/ci/qa/qa-config/phpunit.xml +++ b/ci/qa/phpunit.xml @@ -5,7 +5,7 @@ xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/6.5/phpunit.xsd" backupGlobals="false" colors="true" - bootstrap="../../../vendor/autoload.php" + bootstrap="../../vendor/autoload.php" > diff --git a/ci/qa/security-tests b/ci/qa/security-tests deleted file mode 100755 index da04cfaf..00000000 --- a/ci/qa/security-tests +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -cd $(dirname $0)/../../ - -if curl -sL https://github.com/fabpot/local-php-security-checker/releases/download/v1.0.0/local-php-security-checker_1.0.0_linux_amd64 > local-php-security-checker; then - chmod +x ./local-php-security-checker - ./local-php-security-checker - rm ./local-php-security-checker -else - printf 'Curl failed downloading php-security-checker with error code "%d"\n' "$?" >&2 - exit 1 -fi - -yarn audit diff --git a/ci/qa/static-analysis b/ci/qa/static-analysis deleted file mode 100755 index 6f4f9f22..00000000 --- a/ci/qa/static-analysis +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -cd $(dirname $0)/../../ - -printf "\nRunning DocHeader\n" -#license-headers analysis -./vendor/bin/docheader check src/ dev/ tests/ - -printf "\nRunning PHP Mess Detector\n" -#phpmd static analysis -./vendor/bin/phpmd src text ci/qa/qa-config/phpmd.xml --suffixes php - -printf "\nRunning PHP Code Sniffer\n" -#phpcs static analysis -./vendor/bin/phpcs --standard=ci/qa/qa-config/phpcs.xml --report=full --warning-severity=0 ./src -./vendor/bin/phpcs --standard=ci/qa/qa-config/phpcs.xml --report=full --warning-severity=0 ./dev - -printf "\nRunning jscpd Copy/Paste Detector\n" -#jscpd static analysis -# Run the JS CPD tool: -# - ignoring the test files and public resources -# - allowing for 40 lines of duplicate code -# - and setting a total copy paste limit to 1% project wide -# More info about jscpd usage: https://github.com/kucherenko/jscpd/tree/master/packages/jscpd#usage -./node_modules/.bin/jscpd src public -l 40 -t 1 diff --git a/ci/qa/validate b/ci/qa/validate new file mode 100755 index 00000000..7420d117 --- /dev/null +++ b/ci/qa/validate @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +cd $(dirname $0)/../../ + +# For now only the composer lockfile is checked +composer validate diff --git a/composer.json b/composer.json index 976d0072..87f5be45 100644 --- a/composer.json +++ b/composer.json @@ -54,8 +54,11 @@ "malukenho/docheader": "^0", "mockery/mockery": "^1", "phpmd/phpmd": "~2", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-symfony": "^1.3", "phpunit/phpcov": "~6", "phpunit/phpunit": "^8.5", + "sebastian/phpcpd": "^4.1", "squizlabs/php_codesniffer": "~3", "symfony/browser-kit": "^4.3", "symfony/css-selector": "^3", @@ -65,21 +68,28 @@ "symfony/web-profiler-bundle": "^5.0" }, "scripts": { - "test": [ + "check": [ + "@composer-validate", + "@docheader", "@lint", - "@static-analysis", - "@phpunit", - "@behat", - "@jest", - "@security-tests" + "@jscpd", + "@phpcs", + "@phpmd", + "@phpstan", + "@unit-tests", + "@jest" ], - "lint": "./ci/qa/lint", - "static-analysis": "./ci/qa/static-analysis", - "phpunit": "./ci/qa/phpunit", - "behat": "./ci/qa/behat", - "jest": "./ci/qa/jest", - "security-tests": "./ci/qa/security-tests", - + "composer-validate": "./ci/qa/validate", + "docheader": "./ci/qa/docheader", + "lint": "./ci/qa/lint", + "phpcs": "./ci/qa/phpcs", + "phpcbf": "./ci/qa/phpcbf", + "phpmd": "./ci/qa/phpmd", + "phpstan": "./ci/qa/phpstan", + "phpstan-baseline": "./ci/qa/phpstan-update-baseline", + "unit-tests": "./ci/qa/phpunit", + "behat": "./ci/qa/behat", + "jest": "./ci/qa/jest", "coverage": [ "@phpunit-coverage", "mkdir -p coverage/reports", @@ -151,7 +161,7 @@ "/docs", ".gitignore", ".travis.*", - "ci/qa/qa-config/behat.yml" + "ci/qa/behat.yml" ] } } diff --git a/composer.lock b/composer.lock index 81e3b2d0..b3c2f75d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d055590ba2bbe0b48424ae427f00f56c", + "content-hash": "e54207a9031a5fe68151521acbf1e850", "packages": [ { "name": "beberlei/assert", @@ -8527,6 +8527,140 @@ }, "time": "2021-12-08T12:19:24+00:00" }, + { + "name": "phpstan/phpstan", + "version": "1.10.50", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2023-12-13T10:59:42+00:00" + }, + { + "name": "phpstan/phpstan-symfony", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/27ff6339f83796a7e0dd963cf445cd3c456fc620", + "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10.36" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^8.5.29 || ^9.5", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" + } + ], + "description": "Symfony Framework extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.5" + }, + "time": "2023-10-30T14:52:15+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "7.0.15", @@ -9533,6 +9667,62 @@ ], "time": "2020-11-30T07:37:18+00:00" }, + { + "name": "sebastian/phpcpd", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpcpd.git", + "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/0d9afa762f2400de077b2192f4a9d127de0bb78e", + "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^7.1", + "phpunit/php-timer": "^2.0", + "sebastian/finder-facade": "^1.1", + "sebastian/version": "^1.0|^2.0", + "symfony/console": "^2.7|^3.0|^4.0" + }, + "bin": [ + "phpcpd" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Copy/Paste Detector (CPD) for PHP code.", + "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/4.1.0" + }, + "abandoned": true, + "time": "2018-09-17T17:17:27+00:00" + }, { "name": "sebastian/recursion-context", "version": "3.0.1", diff --git a/symfony.lock b/symfony.lock index 6dcf831d..e3009064 100644 --- a/symfony.lock +++ b/symfony.lock @@ -141,6 +141,18 @@ "phpspec/prophecy": { "version": "1.8.1" }, + "phpstan/phpstan": { + "version": "1.10", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "1.0", + "ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767" + }, + "files": [ + "phpstan.dist.neon" + ] + }, "phpunit/php-code-coverage": { "version": "7.0.7" }, From 33c1808932e1500ea3c734b54b5355deb4284488 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 19 Dec 2023 12:21:57 +0100 Subject: [PATCH 04/52] Remove Homestead from the project We now use our own docker based devconf --- .gitignore | 5 - Vagrantfile | 50 ---- composer.json | 2 - docs/development.md | 46 +--- homestead/Homestead.yaml | 26 -- homestead/after.sh | 23 -- homestead/aliases | 264 ------------------- homestead/composer.json | 6 - homestead/composer.lock | 533 --------------------------------------- homestead/php.ini | 5 - 10 files changed, 7 insertions(+), 953 deletions(-) delete mode 100644 Vagrantfile delete mode 100644 homestead/Homestead.yaml delete mode 100644 homestead/after.sh delete mode 100644 homestead/aliases delete mode 100644 homestead/composer.json delete mode 100644 homestead/composer.lock delete mode 100644 homestead/php.ini diff --git a/.gitignore b/.gitignore index 894512a6..d5d80e3e 100644 --- a/.gitignore +++ b/.gitignore @@ -29,11 +29,6 @@ /web/build .env -# Vagrant files # -################# -.vagrant -homestead/vendor - # Code coverage reports # ################# /coverage/* diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index a9087941..00000000 --- a/Vagrantfile +++ /dev/null @@ -1,50 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -require 'json' -require 'yaml' - -VAGRANTFILE_API_VERSION ||= "2" -confDir = $confDir ||= File.expand_path("homestead/vendor/laravel/homestead", File.dirname(__FILE__)) - -homesteadYamlPath = File.expand_path("homestead/Homestead.yaml", File.dirname(__FILE__)) -homesteadJsonPath = File.expand_path("homestead/Homestead.json", File.dirname(__FILE__)) -afterScriptPath = "homestead/after.sh" -customizationScriptPath = "homestead/user-customizations.sh" -aliasesPath = "homestead/aliases" - -require File.expand_path(confDir + '/scripts/homestead.rb') - -Vagrant.require_version '>= 1.9.0' - -Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - config.vm.boot_timeout = 600 - if File.exist? aliasesPath then - config.vm.provision "file", source: aliasesPath, destination: "/tmp/bash_aliases" - config.vm.provision "shell" do |s| - s.inline = "awk '{ sub(\"\r$\", \"\"); print }' /tmp/bash_aliases > /home/vagrant/.bash_aliases" - end - end - - if File.exist? homesteadYamlPath then - settings = YAML::load(File.read(homesteadYamlPath)) - elsif File.exist? homesteadJsonPath then - settings = JSON.parse(File.read(homesteadJsonPath)) - else - abort "Homestead settings file not found in #{confDir}" - end - - Homestead.configure(config, settings) - - if File.exist? afterScriptPath then - config.vm.provision "shell", path: afterScriptPath, privileged: false, keep_color: true - end - - if File.exist? customizationScriptPath then - config.vm.provision "shell", path: customizationScriptPath, privileged: false, keep_color: true - end - - if defined? VagrantPlugins::HostsUpdater - config.hostsupdater.aliases = settings['sites'].map { |site| site['map'] } - end -end diff --git a/composer.json b/composer.json index 87f5be45..775fce0c 100644 --- a/composer.json +++ b/composer.json @@ -135,7 +135,6 @@ "/dev", "/translations/sp", "/coverage", - "/homestead", "tests", "/build", "/travis-ci-apache.conf", @@ -155,7 +154,6 @@ "/config/packages/test", "/node_modules", "/coverage", - "/homestead", "/build", "/.github", "/docs", diff --git a/docs/development.md b/docs/development.md index 8716cd87..3195b142 100644 --- a/docs/development.md +++ b/docs/development.md @@ -3,53 +3,21 @@ Development environment The purpose of the development environment is only for running the different test and metric tools. -To get started, first setup the development environment. The development 'env' is a virtual machine. Every task described is run -from that machine. +To get started, first setup the development environment. The development 'env' is a Docker container. +Every task described is run from that machine. Requirements ------------------- -- Vagrant 2.2.x - - vagrant-hostsupdater (1.1.1.160, global, optional) - - vagrant-vbguest (0.19.0, global) -- Virtualbox -- Composer +- Docker with Docker Compose Install ------------------- +The purpose of the development environment is only for running the different test and metric tools. -### 1. Create virtual machine - -``` cd homestead ``` - -``` composer install ``` - -Go back to root of the project (```cd ..```) - -``` vagrant up ``` - -If everything goes as planned you can develop inside the virtual machine - -``` vagrant ssh ``` - -### 2. Build frontend assets: - -``` yarn install ``` - -``` yarn encore dev ``` - -``` ./bin/console assets:install ``` - -### 3. Create configuration files - -Copy and configure: - -```cp .env.vm .env``` - -```cp config/packages/parameters.yml.dist config/packages/parameters.yml``` - -If everything goes as planned you can go to: +To get started, first setup the development environment. The development environment is a docker container. That is +controlled via the [OpenConext-devconf](https://github.com/OpenConext/OpenConext-devconf/) project. -[https://tiqr.test](https://tiqr.stepup.example.com) +Every task described below should be run from that container. ### Development diff --git a/homestead/Homestead.yaml b/homestead/Homestead.yaml deleted file mode 100644 index 93fd9566..00000000 --- a/homestead/Homestead.yaml +++ /dev/null @@ -1,26 +0,0 @@ -ip: 192.168.77.12 -memory: 4096 -cpus: 2 -provider: virtualbox -authorize: ~/.ssh/id_rsa.pub -php: 7.2 -ssl: true -keys: - - ~/.ssh/id_rsa -folders: - - - map: . - to: /home/vagrant/code -sites: - - - map: tiqr.example.com - to: /home/vagrant/code/public - type: symfony4 - php: '7.2' - - - map: tiqr-archive.example.test - to: /home/vagrant/code/archive/public - type: symfony4 - php: '7.2' -name: tiqr-homestead -hostname: tiqr diff --git a/homestead/after.sh b/homestead/after.sh deleted file mode 100644 index d70d5bdc..00000000 --- a/homestead/after.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# If you would like to do some extra provisioning you may -# add any commands you wish to this file and they will -# be run after the Homestead machine is provisioned. -# -# If you have user-specific configurations you would like -# to apply, you may also create user-customizations.sh, -# which will be run after this script. - -cd /home/vagrant/code - -sudo cp /home/vagrant/code/homestead/php.ini /etc/php/7.2/mods-available/custom.ini -sudo phpenmod -v 7.2 custom -composer install -xon -echo 'cd /home/vagrant/code' >> ~/.profile -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion - -nvm install 10 diff --git a/homestead/aliases b/homestead/aliases deleted file mode 100644 index d7a40b67..00000000 --- a/homestead/aliases +++ /dev/null @@ -1,264 +0,0 @@ -alias ..="cd .." -alias ...="cd ../.." - -alias h='cd ~' -alias c='clear' -alias art=artisan - -alias phpspec='vendor/bin/phpspec' -alias phpunit='vendor/bin/phpunit' -alias serve=serve-laravel - -alias xoff='sudo phpdismod -s cli xdebug' -alias xon='sudo phpenmod -s cli xdebug' - -function artisan() { - php artisan "$@" -} - -function dusk() { - pids=$(pidof /usr/bin/Xvfb) - - if [ ! -n "$pids" ]; then - Xvfb :0 -screen 0 1280x960x24 & - fi - - php artisan dusk "$@" -} - -function php71() { - sudo update-alternatives --set php /usr/bin/php7.1 - sudo update-alternatives --set php-config /usr/bin/php-config7.1 - sudo update-alternatives --set phpize /usr/bin/phpize7.1 -} - -function php72() { - sudo update-alternatives --set php /usr/bin/php7.2 - sudo update-alternatives --set php-config /usr/bin/php-config7.2 - sudo update-alternatives --set phpize /usr/bin/phpize7.2 -} - -function php73() { - sudo update-alternatives --set php /usr/bin/php7.3 - sudo update-alternatives --set php-config /usr/bin/php-config7.3 - sudo update-alternatives --set phpize /usr/bin/phpize7.3 -} - -function serve-apache() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-apache.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-apache.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-apache domain path" - fi -} - -function serve-laravel() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-laravel.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-laravel.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve domain path" - fi -} - -function serve-proxy() { - if [[ "$1" && "$2" ]] - then - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-proxy.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-proxy.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-proxy domain port" - fi -} - -function serve-silverstripe() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-silverstripe.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-silverstripe.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-silverstripe domain path" - fi -} - -function serve-spa() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-spa.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-spa.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-spa domain path" - fi -} - -function serve-statamic() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-statamic.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-statamic.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-statamic domain path" - fi -} - -function serve-symfony2() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-symfony2.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-symfony2.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-symfony2 domain path" - fi -} - -function serve-symfony4() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-symfony4.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-symfony4.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-symfony4 domain path" - fi -} - -function serve-pimcore() { - if [[ "$1" && "$2" ]] - then - sudo bash /vagrant/vendor/laravel/homestead/scripts/create-certificate.sh "$1" - sudo dos2unix /vagrant/vendor/laravel/homestead/scripts/serve-pimcore.sh - sudo bash /vagrant/vendor/laravel/homestead/scripts/serve-pimcore.sh "$1" "$2" 80 443 "${3:-7.1}" - else - echo "Error: missing required parameters." - echo "Usage: " - echo " serve-pimcore domain path" - fi -} - -function share() { - if [[ "$1" ]] - then - ngrok http ${@:2} -host-header="$1" 80 - else - echo "Error: missing required parameters." - echo "Usage: " - echo " share domain" - echo "Invocation with extra params passed directly to ngrok" - echo " share domain -region=eu -subdomain=test1234" - fi -} - -function flip() { - sudo bash /vagrant/vendor/laravel/homestead/scripts/flip-webserver.sh -} - -function __has_pv() { - $(hash pv 2>/dev/null); - - return $? -} - -function __pv_install_message() { - if ! __has_pv; then - echo $1 - echo "Install pv with \`sudo apt-get install -y pv\` then run this command again." - echo "" - fi -} - -function dbexport() { - FILE=${1:-/vagrant/mysqldump.sql.gz} - - # This gives an estimate of the size of the SQL file - # It appears that 80% is a good approximation of - # the ratio of estimated size to actual size - SIZE_QUERY="select ceil(sum(data_length) * 0.8) as size from information_schema.TABLES" - - __pv_install_message "Want to see export progress?" - - echo "Exporting databases to '$FILE'" - - if __has_pv; then - ADJUSTED_SIZE=$(mysql --vertical -uhomestead -psecret -e "$SIZE_QUERY" 2>/dev/null | grep 'size' | awk '{print $2}') - HUMAN_READABLE_SIZE=$(numfmt --to=iec-i --suffix=B --format="%.3f" $ADJUSTED_SIZE) - - echo "Estimated uncompressed size: $HUMAN_READABLE_SIZE" - mysqldump -uhomestead -psecret --all-databases --skip-lock-tables --routines 2>/dev/null | pv --size=$ADJUSTED_SIZE | gzip > "$FILE" - else - mysqldump -uhomestead -psecret --all-databases --skip-lock-tables --routines 2>/dev/null | gzip > "$FILE" - fi - - echo "Done." -} - -function dbimport() { - FILE=${1:-/vagrant/mysqldump.sql.gz} - - __pv_install_message "Want to see import progress?" - - echo "Importing databases from '$FILE'" - - if __has_pv; then - pv "$FILE" --progress --eta | zcat | mysql -uhomestead -psecret 2>/dev/null - else - cat "$FILE" | zcat | mysql -uhomestead -psecret 2>/dev/null - fi - - echo "Done." -} - -function xphp() { - (php -m | grep -q xdebug) - if [[ $? -eq 0 ]] - then - XDEBUG_ENABLED=true - else - XDEBUG_ENABLED=false - fi - - if ! $XDEBUG_ENABLED; then xon; fi - - php \ - -dxdebug.remote_host=192.168.10.1 \ - -dxdebug.remote_autostart=1 \ - "$@" - - if ! $XDEBUG_ENABLED; then xoff; fi -} - -function update-socket-wrench() { - cd /var/www/socket-wrench - git pull origin release - composer install - php artisan migrate --force -} - -function seed-socket-wrench() { - cd /var/www/socket-wrench - php artisan db:seed -} diff --git a/homestead/composer.json b/homestead/composer.json deleted file mode 100644 index 1c80b49b..00000000 --- a/homestead/composer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "dev/homestead", - "require": { - "laravel/homestead": "^9.0" - } -} diff --git a/homestead/composer.lock b/homestead/composer.lock deleted file mode 100644 index 5e22a26e..00000000 --- a/homestead/composer.lock +++ /dev/null @@ -1,533 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "1a4b309dcc207e832cd602d667dcdb51", - "packages": [ - { - "name": "laravel/homestead", - "version": "v9.0.7", - "source": { - "type": "git", - "url": "https://github.com/laravel/homestead.git", - "reference": "0add54057b5a4f8a4adf78a6c382131257aec090" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/homestead/zipball/0add54057b5a4f8a4adf78a6c382131257aec090", - "reference": "0add54057b5a4f8a4adf78a6c382131257aec090", - "shasum": "" - }, - "require": { - "php": "^7.1", - "symfony/console": "~3.0||~4.0", - "symfony/process": "~3.0||~4.0", - "symfony/yaml": "~3.0||~4.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "bin": [ - "bin/homestead" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Homestead\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" - } - ], - "description": "A virtual machine for web artisans.", - "time": "2019-07-22T17:55:23+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "symfony/console", - "version": "v4.3.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", - "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/service-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0", - "symfony/var-dumper": "^4.3" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2019-07-24T17:13:59+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/process", - "version": "v4.3.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c", - "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2019-05-30T16:10:05+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v1.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", - "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-06-13T11:15:36+00:00" - }, - { - "name": "symfony/yaml", - "version": "v4.3.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/34d29c2acd1ad65688f58452fd48a46bd996d5a6", - "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2019-07-24T14:47:54+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [] -} diff --git a/homestead/php.ini b/homestead/php.ini deleted file mode 100644 index c1af56c4..00000000 --- a/homestead/php.ini +++ /dev/null @@ -1,5 +0,0 @@ -xdebug.remote_autostart = 1 -xdebug.remote_host = 192.168.77.1 -xdebug.remote_connect_back = 0 -xdebug.coverage_enable=1 -memory_limit = -1 From c1e48900cc201478e029805fbab6fc2a37c6466b Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 19 Dec 2023 12:24:38 +0100 Subject: [PATCH 05/52] Remove build folder --- .gitignore | 1 - build/.gitkeep | 0 2 files changed, 1 deletion(-) delete mode 100644 build/.gitkeep diff --git a/.gitignore b/.gitignore index d5d80e3e..191c3589 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ /userdb.json /.web-server-pid /config/legacy/parameters.yaml -/build/ /var/* /app/ !/var/cache diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 465440cf7fd83ec18cd51625d8ee47f012ed511b Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 7 Feb 2024 09:14:28 +0100 Subject: [PATCH 06/52] Remove the code coverage metric from PHPUnit If we want code coverage stats, we can use scrutenizer for that purpose --- .gitignore | 4 - composer.json | 11 +- composer.lock | 1316 +++++++++++++++++++++---------------------------- 3 files changed, 555 insertions(+), 776 deletions(-) diff --git a/.gitignore b/.gitignore index 191c3589..a9864fbc 100644 --- a/.gitignore +++ b/.gitignore @@ -28,10 +28,6 @@ /web/build .env -# Code coverage reports # -################# -/coverage/* - # OS generated files # ###################### .DS_Store diff --git a/composer.json b/composer.json index 775fce0c..0acc69c4 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,6 @@ "phpmd/phpmd": "~2", "phpstan/phpstan": "^1.10", "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpcov": "~6", "phpunit/phpunit": "^8.5", "sebastian/phpcpd": "^4.1", "squizlabs/php_codesniffer": "~3", @@ -90,12 +89,6 @@ "unit-tests": "./ci/qa/phpunit", "behat": "./ci/qa/behat", "jest": "./ci/qa/jest", - "coverage": [ - "@phpunit-coverage", - "mkdir -p coverage/reports", - "vendor/bin/phpcov merge coverage/reports --html coverage" - ], - "phpunit-coverage": "vendor/bin/phpunit --coverage-php coverage/reports/unit.cov", "encore": [ "yarn encore production" ], @@ -117,7 +110,9 @@ "config": { "sort-packages": true, "allow-plugins": { - "symfony/flex": true + "symfony/flex": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "symfony/runtime": true }, "platform": { "php": "7.2.5" diff --git a/composer.lock b/composer.lock index b3c2f75d..facecdf8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e54207a9031a5fe68151521acbf1e850", + "content-hash": "c95ead47d961b577dca47d6ba848e89c", "packages": [ { "name": "beberlei/assert", @@ -135,32 +135,35 @@ }, { "name": "doctrine/annotations", - "version": "1.13.3", + "version": "1.14.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^1 || ^2", "ext-tokenizer": "*", "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", "vimeo/psalm": "^4.10" }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, "type": "library", "autoload": { "psr-4": { @@ -202,37 +205,86 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.3" + "source": "https://github.com/doctrine/annotations/tree/1.14.3" + }, + "time": "2023-02-01T09:20:38+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2022-07-02T10:48:51+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -264,7 +316,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -280,7 +332,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2024-02-05T11:35:39+00:00" }, { "name": "edamov/pushok", @@ -353,24 +405,24 @@ }, { "name": "fgrosse/phpasn1", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/fgrosse/PHPASN1.git", - "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296" + "reference": "42060ed45344789fb9f21f9f1864fc47b9e3507b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/eef488991d53e58e60c9554b09b1201ca5ba9296", - "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296", + "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/42060ed45344789fb9f21f9f1864fc47b9e3507b", + "reference": "42060ed45344789fb9f21f9f1864fc47b9e3507b", "shasum": "" }, "require": { - "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "~2.0", - "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "suggest": { "ext-bcmath": "BCmath is the fallback extension for big integer calculations", @@ -422,9 +474,10 @@ ], "support": { "issues": "https://github.com/fgrosse/PHPASN1/issues", - "source": "https://github.com/fgrosse/PHPASN1/tree/v2.4.0" + "source": "https://github.com/fgrosse/PHPASN1/tree/v2.5.0" }, - "time": "2021-12-11T12:41:06+00:00" + "abandoned": true, + "time": "2022-12-19T11:08:26+00:00" }, { "name": "guzzlehttp/guzzle", @@ -543,16 +596,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", "shasum": "" }, "require": { @@ -562,11 +615,6 @@ "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, "autoload": { "files": [ "src/functions_include.php" @@ -607,7 +655,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/1.5.3" }, "funding": [ { @@ -623,7 +671,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2023-05-21T12:31:43+00:00" }, { "name": "guzzlehttp/psr7", @@ -1015,21 +1063,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1049,7 +1097,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -1061,27 +1109,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1101,7 +1149,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -1116,9 +1164,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", @@ -1387,6 +1435,7 @@ "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v5.6.1" }, + "abandoned": "Symfony", "time": "2020-08-25T19:10:18+00:00" }, { @@ -1517,16 +1566,16 @@ }, { "name": "surfnet/stepup-bundle", - "version": "4.2.2", + "version": "4.2.6", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-bundle.git", - "reference": "410579c2f0e018fca6cb8acb8e26ee7296654347" + "reference": "c7239a4bff489cc40ebb0dd34c5326d5dfac5046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-bundle/zipball/410579c2f0e018fca6cb8acb8e26ee7296654347", - "reference": "410579c2f0e018fca6cb8acb8e26ee7296654347", + "url": "https://api.github.com/repos/OpenConext/Stepup-bundle/zipball/c7239a4bff489cc40ebb0dd34c5326d5dfac5046", + "reference": "c7239a4bff489cc40ebb0dd34c5326d5dfac5046", "shasum": "" }, "require": { @@ -1535,7 +1584,7 @@ "ext-openssl": "*", "guzzlehttp/guzzle": "^6.0", "monolog/monolog": "~1.11", - "php": "^7.0", + "php": "^7.2", "sensio/framework-extra-bundle": "^5.4", "surfnet/stepup-saml-bundle": "^4.1.8", "symfony/config": "^4.4", @@ -1573,9 +1622,9 @@ ], "support": { "issues": "https://github.com/OpenConext/Stepup-bundle/issues", - "source": "https://github.com/OpenConext/Stepup-bundle/tree/4.2.5" + "source": "https://github.com/OpenConext/Stepup-bundle/tree/4.2.6" }, - "time": "2022-08-02T12:43:19+00:00" + "time": "2023-02-16T15:19:16+00:00" }, { "name": "surfnet/stepup-gssp-bundle", @@ -1632,16 +1681,16 @@ }, { "name": "surfnet/stepup-saml-bundle", - "version": "4.3.3", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-saml-bundle.git", - "reference": "eb61d4eb5e7e2803a56c83ac87741a410536174b" + "reference": "e3f2bc55e876bbd4c40caa9235eb78a79a8d9651" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/eb61d4eb5e7e2803a56c83ac87741a410536174b", - "reference": "eb61d4eb5e7e2803a56c83ac87741a410536174b", + "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/e3f2bc55e876bbd4c40caa9235eb78a79a8d9651", + "reference": "e3f2bc55e876bbd4c40caa9235eb78a79a8d9651", "shasum": "" }, "require": { @@ -1684,20 +1733,24 @@ "stepup", "surfnet" ], - "time": "2022-02-10T11:54:37+00:00" + "support": { + "issues": "https://github.com/OpenConext/Stepup-saml-bundle/issues", + "source": "https://github.com/OpenConext/Stepup-saml-bundle/tree/4.4.3" + }, + "time": "2023-05-15T08:05:57+00:00" }, { "name": "symfony/asset", - "version": "v4.4.40", + "version": "v4.4.46", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "4dee0d02664f2d06005c56b8e43612b7a372e47d" + "reference": "6ef0f9f352f90c469e8b363ebc038d81a7198873" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/4dee0d02664f2d06005c56b8e43612b7a372e47d", - "reference": "4dee0d02664f2d06005c56b8e43612b7a372e47d", + "url": "https://api.github.com/repos/symfony/asset/zipball/6ef0f9f352f90c469e8b363ebc038d81a7198873", + "reference": "6ef0f9f352f90c469e8b363ebc038d81a7198873", "shasum": "" }, "require": { @@ -1737,7 +1790,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v4.4.40" + "source": "https://github.com/symfony/asset/tree/v4.4.46" }, "funding": [ { @@ -1753,20 +1806,20 @@ "type": "tidelift" } ], - "time": "2022-03-07T18:38:28+00:00" + "time": "2022-08-30T22:05:24+00:00" }, { "name": "symfony/cache", - "version": "v5.4.11", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5a0fff46df349f0db3fe242263451fddf5277362" + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5a0fff46df349f0db3fe242263451fddf5277362", - "reference": "5a0fff46df349f0db3fe242263451fddf5277362", + "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", "shasum": "" }, "require": { @@ -1794,7 +1847,7 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1", "psr/simple-cache": "^1.0|^2.0", "symfony/config": "^4.4|^5.0|^6.0", @@ -1827,14 +1880,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", "homepage": "https://symfony.com", "keywords": [ "caching", "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.11" + "source": "https://github.com/symfony/cache/tree/v5.4.35" }, "funding": [ { @@ -1850,7 +1903,7 @@ "type": "tidelift" } ], - "time": "2022-07-28T15:25:17+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/cache-contracts", @@ -2011,16 +2064,16 @@ }, { "name": "symfony/console", - "version": "v4.4.44", + "version": "v4.4.49", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c35fafd7f12ebd6f9e29c95a370df7f1fb171a40" + "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c35fafd7f12ebd6f9e29c95a370df7f1fb171a40", - "reference": "c35fafd7f12ebd6f9e29c95a370df7f1fb171a40", + "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", + "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", "shasum": "" }, "require": { @@ -2081,7 +2134,7 @@ "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v4.4.44" + "source": "https://github.com/symfony/console/tree/v4.4.49" }, "funding": [ { @@ -2097,7 +2150,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2022-11-05T17:10:16+00:00" }, { "name": "symfony/debug", @@ -2544,16 +2597,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.13", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e" + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", "shasum": "" }, "require": { @@ -2603,7 +2656,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" }, "funding": [ { @@ -2619,20 +2672,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:41:36+00:00" + "time": "2022-07-20T09:59:04+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", "shasum": "" }, "require": { @@ -2667,7 +2720,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.19" + "source": "https://github.com/symfony/filesystem/tree/v5.4.35" }, "funding": [ { @@ -2683,20 +2736,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", "shasum": "" }, "require": { @@ -2730,7 +2783,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.35" }, "funding": [ { @@ -2746,20 +2799,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/flex", - "version": "v1.19.3", + "version": "v1.21.5", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "ab0453b16029e131c112df1a76e59eb2a47e1f67" + "reference": "6b46a001639f810d01f4f1b39be1291192a711d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/ab0453b16029e131c112df1a76e59eb2a47e1f67", - "reference": "ab0453b16029e131c112df1a76e59eb2a47e1f67", + "url": "https://api.github.com/repos/symfony/flex/zipball/6b46a001639f810d01f4f1b39be1291192a711d4", + "reference": "6b46a001639f810d01f4f1b39be1291192a711d4", "shasum": "" }, "require": { @@ -2795,7 +2848,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.19.3" + "source": "https://github.com/symfony/flex/tree/v1.21.5" }, "funding": [ { @@ -2811,20 +2864,20 @@ "type": "tidelift" } ], - "time": "2022-08-07T09:39:08+00:00" + "time": "2024-02-05T18:04:39+00:00" }, { "name": "symfony/form", - "version": "v4.4.44", + "version": "v4.4.48", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "db35f2e2c237c41baa8036d256f1b913a2430d04" + "reference": "e1d137b13e0ec2cb5c5e38debca7a510c6f858c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/db35f2e2c237c41baa8036d256f1b913a2430d04", - "reference": "db35f2e2c237c41baa8036d256f1b913a2430d04", + "url": "https://api.github.com/repos/symfony/form/zipball/e1d137b13e0ec2cb5c5e38debca7a510c6f858c6", + "reference": "e1d137b13e0ec2cb5c5e38debca7a510c6f858c6", "shasum": "" }, "require": { @@ -2893,7 +2946,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v4.4.44" + "source": "https://github.com/symfony/form/tree/v4.4.48" }, "funding": [ { @@ -2909,20 +2962,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2022-10-22T05:50:33+00:00" }, { "name": "symfony/framework-bundle", - "version": "v4.4.44", + "version": "v4.4.51", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "3cbca8f6b93681102cab0fe0e3c23d16e4d0ded3" + "reference": "8f1698ff2a97be8442fb202ac93111f7b6b40781" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3cbca8f6b93681102cab0fe0e3c23d16e4d0ded3", - "reference": "3cbca8f6b93681102cab0fe0e3c23d16e4d0ded3", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8f1698ff2a97be8442fb202ac93111f7b6b40781", + "reference": "8f1698ff2a97be8442fb202ac93111f7b6b40781", "shasum": "" }, "require": { @@ -3039,7 +3092,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v4.4.44" + "source": "https://github.com/symfony/framework-bundle/tree/v4.4.51" }, "funding": [ { @@ -3055,7 +3108,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2022-11-05T15:42:31+00:00" }, { "name": "symfony/http-client-contracts", @@ -3137,16 +3190,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.20", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a" + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0435363362a47c14e9cf50663cb8ffbf491875a", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", "shasum": "" }, "require": { @@ -3193,7 +3246,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.20" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" }, "funding": [ { @@ -3209,20 +3262,20 @@ "type": "tidelift" } ], - "time": "2023-01-29T11:11:52+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.50", + "version": "v4.4.51", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "aa6df6c045f034aa13ac752fc234bb300b9488ef" + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/aa6df6c045f034aa13ac752fc234bb300b9488ef", - "reference": "aa6df6c045f034aa13ac752fc234bb300b9488ef", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7", + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7", "shasum": "" }, "require": { @@ -3297,7 +3350,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.50" + "source": "https://github.com/symfony/http-kernel/tree/v4.4.51" }, "funding": [ { @@ -3313,20 +3366,20 @@ "type": "tidelift" } ], - "time": "2023-02-01T08:01:31+00:00" + "time": "2023-11-10T13:31:29+00:00" }, { "name": "symfony/intl", - "version": "v5.4.11", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e" + "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/d305c0c1d31b30b3876e041804c35e49e5f8a96e", - "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e", + "url": "https://api.github.com/repos/symfony/intl/zipball/2fb503f81cd8032a624c55764d1fbaf893aa3cf4", + "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4", "shasum": "" }, "require": { @@ -3335,7 +3388,8 @@ "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/filesystem": "^4.4|^5.0|^6.0" + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -3385,7 +3439,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.11" + "source": "https://github.com/symfony/intl/tree/v5.4.35" }, "funding": [ { @@ -3401,7 +3455,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T11:34:24+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/monolog-bridge", @@ -3569,16 +3623,16 @@ }, { "name": "symfony/options-resolver", - "version": "v5.4.11", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", - "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", "shasum": "" }, "require": { @@ -3618,7 +3672,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" }, "funding": [ { @@ -3634,20 +3688,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -3661,9 +3715,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3700,7 +3751,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -3716,20 +3767,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -3740,9 +3791,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3781,7 +3829,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -3797,20 +3845,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -3823,9 +3871,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3868,7 +3913,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" }, "funding": [ { @@ -3884,20 +3929,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -3908,9 +3953,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3952,7 +3994,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -3968,20 +4010,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -3995,9 +4037,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4035,7 +4074,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -4051,20 +4090,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", "shasum": "" }, "require": { @@ -4072,9 +4111,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4111,7 +4147,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" }, "funding": [ { @@ -4127,20 +4163,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", "shasum": "" }, "require": { @@ -4148,9 +4184,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4190,7 +4223,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" }, "funding": [ { @@ -4206,20 +4239,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -4227,9 +4260,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4273,7 +4303,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -4289,20 +4319,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -4310,9 +4340,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4352,7 +4379,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -4368,20 +4395,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "20fcf370aed6b2b4a2d8170fa23d2d07250e94ab" + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/20fcf370aed6b2b4a2d8170fa23d2d07250e94ab", - "reference": "20fcf370aed6b2b4a2d8170fa23d2d07250e94ab", + "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", "shasum": "" }, "require": { @@ -4429,11 +4456,11 @@ "injection", "object", "property", - "property path", + "property-path", "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.19" + "source": "https://github.com/symfony/property-access/tree/v5.4.35" }, "funding": [ { @@ -4449,20 +4476,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "8ccf54bce2e2edbface1e99cb5a2560a290c9e2d" + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/8ccf54bce2e2edbface1e99cb5a2560a290c9e2d", - "reference": "8ccf54bce2e2edbface1e99cb5a2560a290c9e2d", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", "shasum": "" }, "require": { @@ -4524,7 +4551,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.19" + "source": "https://github.com/symfony/property-info/tree/v5.4.35" }, "funding": [ { @@ -4540,7 +4567,7 @@ "type": "tidelift" } ], - "time": "2023-01-14T11:26:56+00:00" + "time": "2024-01-23T15:43:50+00:00" }, { "name": "symfony/routing", @@ -4816,20 +4843,21 @@ }, { "name": "symfony/security-csrf", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "892dc11b003c0d3da377264bb3d5f178cb894944" + "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/892dc11b003c0d3da377264bb3d5f178cb894944", - "reference": "892dc11b003c0d3da377264bb3d5f178cb894944", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", + "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16", "symfony/security-core": "^4.4|^5.0|^6.0" }, @@ -4868,7 +4896,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v5.4.19" + "source": "https://github.com/symfony/security-csrf/tree/v5.4.35" }, "funding": [ { @@ -4884,7 +4912,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/security-guard", @@ -5116,16 +5144,16 @@ }, { "name": "symfony/string", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", + "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", "shasum": "" }, "require": { @@ -5182,7 +5210,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.19" + "source": "https://github.com/symfony/string/tree/v5.4.35" }, "funding": [ { @@ -5198,7 +5226,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/templating", @@ -5270,16 +5298,16 @@ }, { "name": "symfony/translation", - "version": "v4.4.44", + "version": "v4.4.47", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "af947fefc306cec6ea5a1f6160c7e305a71f2493" + "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/af947fefc306cec6ea5a1f6160c7e305a71f2493", - "reference": "af947fefc306cec6ea5a1f6160c7e305a71f2493", + "url": "https://api.github.com/repos/symfony/translation/zipball/45036b1d53accc48fe9bab71ccd86d57eba0dd94", + "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94", "shasum": "" }, "require": { @@ -5339,7 +5367,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v4.4.44" + "source": "https://github.com/symfony/translation/tree/v4.4.47" }, "funding": [ { @@ -5355,7 +5383,7 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2022-10-03T15:15:11+00:00" }, { "name": "symfony/translation-contracts", @@ -5642,16 +5670,16 @@ }, { "name": "symfony/validator", - "version": "v4.4.44", + "version": "v4.4.48", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "4b566c8d15f3490b0e72b42dd33ea8d2b4857cb1" + "reference": "54781a4c41efbd283b779110bf8ae7f263737775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/4b566c8d15f3490b0e72b42dd33ea8d2b4857cb1", - "reference": "4b566c8d15f3490b0e72b42dd33ea8d2b4857cb1", + "url": "https://api.github.com/repos/symfony/validator/zipball/54781a4c41efbd283b779110bf8ae7f263737775", + "reference": "54781a4c41efbd283b779110bf8ae7f263737775", "shasum": "" }, "require": { @@ -5728,7 +5756,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v4.4.44" + "source": "https://github.com/symfony/validator/tree/v4.4.48" }, "funding": [ { @@ -5744,20 +5772,20 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2022-10-25T13:54:11+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b" + "reference": "ce4685b30e47d94dfc990c5566285ff99ddf012b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b", - "reference": "2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ce4685b30e47d94dfc990c5566285ff99ddf012b", + "reference": "ce4685b30e47d94dfc990c5566285ff99ddf012b", "shasum": "" }, "require": { @@ -5766,12 +5794,12 @@ "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -5817,7 +5845,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.19" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.35" }, "funding": [ { @@ -5833,20 +5861,20 @@ "type": "tidelift" } ], - "time": "2023-01-16T10:52:33+00:00" + "time": "2024-01-23T14:28:09+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.19", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6" + "reference": "abb0a151b62d6b07e816487e20040464af96cae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6", - "reference": "2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", + "reference": "abb0a151b62d6b07e816487e20040464af96cae7", "shasum": "" }, "require": { @@ -5890,7 +5918,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.19" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" }, "funding": [ { @@ -5906,20 +5934,20 @@ "type": "tidelift" } ], - "time": "2023-01-12T16:39:29+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/webpack-encore-bundle", - "version": "v1.15.1", + "version": "v1.17.2", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "718673b1e758533614190ae74d07305a72bc66a9" + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/718673b1e758533614190ae74d07305a72bc66a9", - "reference": "718673b1e758533614190ae74d07305a72bc66a9", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/471ebbc03072dad6e31840dc317bc634a32785f5", + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5", "shasum": "" }, "require": { @@ -5963,7 +5991,7 @@ "description": "Integration with your Symfony app & Webpack Encore!", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.15.1" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.2" }, "funding": [ { @@ -5979,20 +6007,20 @@ "type": "tidelift" } ], - "time": "2022-07-13T17:07:35+00:00" + "time": "2023-09-26T14:36:28+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.44", + "version": "v4.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c2b28c10fb3b7ac67bafa7b8f952cd83f35acde2" + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c2b28c10fb3b7ac67bafa7b8f952cd83f35acde2", - "reference": "c2b28c10fb3b7ac67bafa7b8f952cd83f35acde2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", "shasum": "" }, "require": { @@ -6034,7 +6062,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.44" + "source": "https://github.com/symfony/yaml/tree/v4.4.45" }, "funding": [ { @@ -6050,7 +6078,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T13:16:42+00:00" + "time": "2022-08-02T15:47:23+00:00" }, { "name": "tiqr/tiqr-server-libphp", @@ -6099,16 +6127,16 @@ }, { "name": "twig/twig", - "version": "v2.15.5", + "version": "v2.16.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e" + "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/0c9cc7ef2e0ec6d20c5af1200522a89ba101f623", + "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623", "shasum": "" }, "require": { @@ -6119,12 +6147,12 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.15-dev" + "dev-master": "2.16-dev" } }, "autoload": { @@ -6163,7 +6191,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.5" + "source": "https://github.com/twigphp/Twig/tree/v2.16.0" }, "funding": [ { @@ -6175,7 +6203,7 @@ "type": "tidelift" } ], - "time": "2023-05-03T17:49:41+00:00" + "time": "2023-12-22T07:22:15+00:00" }, { "name": "web-token/jwt-core", @@ -6589,16 +6617,16 @@ "packages-dev": [ { "name": "behat/behat", - "version": "v3.11.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/Behat/Behat.git", - "reference": "a19c72c78eb0cdf7b7c4dabfeec9eb3a282728fc" + "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Behat/zipball/a19c72c78eb0cdf7b7c4dabfeec9eb3a282728fc", - "reference": "a19c72c78eb0cdf7b7c4dabfeec9eb3a282728fc", + "url": "https://api.github.com/repos/Behat/Behat/zipball/2a3832d9cb853a794af3a576f9e524ae460f3340", + "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340", "shasum": "" }, "require": { @@ -6607,17 +6635,18 @@ "ext-mbstring": "*", "php": "^7.2 || ^8.0", "psr/container": "^1.0 || ^2.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/console": "^4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", - "symfony/translation": "^4.4 || ^5.0 || ^6.0", - "symfony/yaml": "^4.4 || ^5.0 || ^6.0" + "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/console": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/translation": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/yaml": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "herrera-io/box": "~1.6.1", + "phpspec/prophecy": "^1.15", "phpunit/phpunit": "^8.5 || ^9.0", - "symfony/process": "^4.4 || ^5.0 || ^6.0", + "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0", "vimeo/psalm": "^4.8" }, "suggest": { @@ -6669,9 +6698,9 @@ ], "support": { "issues": "https://github.com/Behat/Behat/issues", - "source": "https://github.com/Behat/Behat/tree/v3.11.0" + "source": "https://github.com/Behat/Behat/tree/v3.14.0" }, - "time": "2022-07-07T09:49:27+00:00" + "time": "2023-12-09T13:55:02+00:00" }, { "name": "behat/gherkin", @@ -6921,6 +6950,7 @@ "issues": "https://github.com/minkphp/MinkGoutteDriver/issues", "source": "https://github.com/minkphp/MinkGoutteDriver/tree/v1.3.0" }, + "abandoned": "behat/mink-browserkit-driver", "time": "2021-10-12T11:35:46+00:00" }, { @@ -7102,16 +7132,16 @@ }, { "name": "composer/pcre", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe" + "reference": "b439557066cd445732fa57cbc8d905394b4db8a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/c8e9d27cfc5ed22643c19c160455b473ffd8aabe", - "reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe", + "url": "https://api.github.com/repos/composer/pcre/zipball/b439557066cd445732fa57cbc8d905394b4db8a0", + "reference": "b439557066cd445732fa57cbc8d905394b4db8a0", "shasum": "" }, "require": { @@ -7153,7 +7183,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/2.0.0" + "source": "https://github.com/composer/pcre/tree/2.1.1" }, "funding": [ { @@ -7169,7 +7199,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:05:29+00:00" + "time": "2023-10-11T07:10:55+00:00" }, { "name": "composer/xdebug-handler", @@ -7239,28 +7269,28 @@ }, { "name": "doctrine/inflector", - "version": "2.0.4", + "version": "2.0.9", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { @@ -7310,7 +7340,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "source": "https://github.com/doctrine/inflector/tree/2.0.9" }, "funding": [ { @@ -7326,34 +7356,34 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2024-01-15T18:05:13+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -7380,7 +7410,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -7396,7 +7426,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "fabpot/goutte", @@ -7455,6 +7485,7 @@ "issues": "https://github.com/FriendsOfPHP/Goutte/issues", "source": "https://github.com/FriendsOfPHP/Goutte/tree/master" }, + "abandoned": "symfony/browser-kit", "time": "2018-06-29T15:13:57+00:00" }, { @@ -7628,16 +7659,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "v5.2.13", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", "shasum": "" }, "require": { @@ -7692,29 +7723,31 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2023-09-26T02:20:38+00:00" }, { "name": "khanamiryan/qrcode-detector-decoder", - "version": "1.0.5.2", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git", - "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1" + "reference": "45326fb83a2a375065dbb3a134b5b8a5872da569" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/04fdd58d86a387065f707dc6d3cc304c719910c1", - "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1", + "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/45326fb83a2a375065dbb3a134b5b8a5872da569", + "reference": "45326fb83a2a375065dbb3a134b5b8a5872da569", "shasum": "" }, "require": { "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^5.7 | ^7.5 | ^8.0 | ^9.0" + "phpunit/phpunit": "^5.7 | ^7.5 | ^8.0 | ^9.0", + "rector/rector": "^0.13.6", + "symplify/easy-coding-standard": "^11.0" }, "type": "library", "autoload": { @@ -7745,7 +7778,11 @@ "qr", "zxing" ], - "time": "2021-07-13T18:46:38+00:00" + "support": { + "issues": "https://github.com/khanamiryan/php-qrcode-detector-decoder/issues", + "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/1.0.6" + }, + "time": "2022-06-29T09:25:13+00:00" }, { "name": "league/csv", @@ -7867,16 +7904,16 @@ }, { "name": "mockery/mockery", - "version": "1.3.5", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "472fa8ca4e55483d55ee1e73c963718c4393791d" + "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/472fa8ca4e55483d55ee1e73c963718c4393791d", - "reference": "472fa8ca4e55483d55ee1e73c963718c4393791d", + "url": "https://api.github.com/repos/mockery/mockery/zipball/dc206df4fa314a50bbb81cf72239a305c5bbd5c0", + "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0", "shasum": "" }, "require": { @@ -7930,22 +7967,22 @@ ], "support": { "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.3.5" + "source": "https://github.com/mockery/mockery/tree/1.3.6" }, - "time": "2021-09-13T15:33:03+00:00" + "time": "2022-09-07T15:05:49+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -7983,7 +8020,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -7991,20 +8028,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -8045,34 +8082,34 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.3", + "version": "2.16.2", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "da3166a06b4a89915920a42444f707122a1584c9" + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9", - "reference": "da3166a06b4a89915920a42444f707122a1584c9", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", "gregwar/rst": "^1.0", - "phpunit/phpunit": "^4.8.36|^5.7.27", "squizlabs/php_codesniffer": "^2.0.0" }, "bin": [ @@ -8094,9 +8131,15 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.10.3" + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" }, "funding": [ { @@ -8104,7 +8147,7 @@ "type": "tidelift" } ], - "time": "2022-02-23T07:53:09+00:00" + "time": "2023-12-17T18:09:59+00:00" }, { "name": "phar-io/manifest", @@ -8217,184 +8260,24 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, { "name": "phpmd/phpmd", - "version": "2.12.0", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec" + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.3", + "pdepend/pdepend": "^2.16.1", "php": ">=5.3.9" }, "require-dev": { @@ -8403,8 +8286,7 @@ "ext-simplexml": "*", "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", - "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0" + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ "src/bin/phpmd" @@ -8441,6 +8323,7 @@ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", "homepage": "https://phpmd.org/", "keywords": [ + "dev", "mess detection", "mess detector", "pdepend", @@ -8450,7 +8333,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.12.0" + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" }, "funding": [ { @@ -8458,87 +8341,20 @@ "type": "tidelift" } ], - "time": "2022-03-24T13:33:01+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" + "time": "2023-12-11T08:22:20+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.50", + "version": "1.10.57", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", - "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", "shasum": "" }, "require": { @@ -8587,20 +8403,20 @@ "type": "tidelift" } ], - "time": "2023-12-13T10:59:42+00:00" + "time": "2024-01-24T11:51:34+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620" + "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/27ff6339f83796a7e0dd963cf445cd3c456fc620", - "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/ef7db637be9b85fa00278fc3477ac66abe8eb7d1", + "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1", "shasum": "" }, "require": { @@ -8657,9 +8473,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.5" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.7" }, - "time": "2023-10-30T14:52:15+00:00" + "time": "2024-01-10T21:54:42+00:00" }, { "name": "phpunit/php-code-coverage", @@ -8958,74 +8774,18 @@ "abandoned": true, "time": "2021-07-26T12:15:06+00:00" }, - { - "name": "phpunit/phpcov", - "version": "6.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpcov.git", - "reference": "63c32ed2a7dd18e5bd07f58aed1982d2ec9f1960" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcov/zipball/63c32ed2a7dd18e5bd07f58aed1982d2ec9f1960", - "reference": "63c32ed2a7dd18e5bd07f58aed1982d2ec9f1960", - "shasum": "" - }, - "require": { - "php": "^7.2", - "phpunit/php-code-coverage": "^7.0", - "phpunit/phpunit": "^8.0", - "sebastian/diff": "^3.0", - "sebastian/finder-facade": "^1.1", - "sebastian/version": "^2.0", - "symfony/console": "^3.0 || ^4.0" - }, - "bin": [ - "phpcov" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "CLI frontend for php-code-coverage", - "homepage": "https://github.com/sebastianbergmann/phpcov", - "support": { - "issues": "https://github.com/sebastianbergmann/phpcov/issues", - "source": "https://github.com/sebastianbergmann/phpcov/tree/6.0.1" - }, - "time": "2019-11-18T13:38:50+00:00" - }, { "name": "phpunit/phpunit", - "version": "8.5.28", + "version": "8.5.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8f2d1c9c7b30382459c871467853da1a6e44fbd4" + "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8f2d1c9c7b30382459c871467853da1a6e44fbd4", - "reference": "8f2d1c9c7b30382459c871467853da1a6e44fbd4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9652df58e06a681429d8cfdaec3c43d6de581d5a", + "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a", "shasum": "" }, "require": { @@ -9040,15 +8800,14 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.2", - "phpspec/prophecy": "^1.10.3", "phpunit/php-code-coverage": "^7.0.12", "phpunit/php-file-iterator": "^2.0.4", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", + "sebastian/comparator": "^3.0.5", "sebastian/diff": "^3.0.2", "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", + "sebastian/exporter": "^3.1.5", "sebastian/global-state": "^3.0.0", "sebastian/object-enumerator": "^3.0.3", "sebastian/resource-operations": "^2.0.1", @@ -9056,9 +8815,9 @@ "sebastian/version": "^2.0.1" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", + "phpunit/php-invoker": "To allow enforcing time limits" }, "bin": [ "phpunit" @@ -9094,7 +8853,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.28" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.36" }, "funding": [ { @@ -9104,9 +8864,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-07-29T09:20:50+00:00" + "time": "2023-12-01T16:52:15+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -9165,16 +8929,16 @@ }, { "name": "sebastian/comparator", - "version": "3.0.3", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", "shasum": "" }, "require": { @@ -9227,7 +8991,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" }, "funding": [ { @@ -9235,20 +8999,20 @@ "type": "github" } ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2022-09-14T12:31:48+00:00" }, { "name": "sebastian/diff", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", "shasum": "" }, "require": { @@ -9293,7 +9057,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" }, "funding": [ { @@ -9301,7 +9065,7 @@ "type": "github" } ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2023-05-07T05:30:20+00:00" }, { "name": "sebastian/environment", @@ -9368,16 +9132,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.4", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", "shasum": "" }, "require": { @@ -9433,7 +9197,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" }, "funding": [ { @@ -9441,7 +9205,7 @@ "type": "github" } ], - "time": "2021-11-11T13:51:24+00:00" + "time": "2022-09-14T06:00:17+00:00" }, { "name": "sebastian/finder-facade", @@ -9493,16 +9257,16 @@ }, { "name": "sebastian/global-state", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921" + "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/de036ec91d55d2a9e0db2ba975b512cdb1c23921", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/66783ce213de415b451b904bfef9dda0cf9aeae0", + "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0", "shasum": "" }, "require": { @@ -9545,7 +9309,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.3" }, "funding": [ { @@ -9553,7 +9317,7 @@ "type": "github" } ], - "time": "2022-02-10T06:55:38+00:00" + "time": "2023-08-02T09:23:32+00:00" }, { "name": "sebastian/object-enumerator", @@ -9943,16 +9707,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "3.8.1", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "14f5fff1e64118595db5408e946f3a22c75807f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/14f5fff1e64118595db5408e946f3a22c75807f7", + "reference": "14f5fff1e64118595db5408e946f3a22c75807f7", "shasum": "" }, "require": { @@ -9962,11 +9726,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -9981,21 +9745,45 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", - "standards" + "standards", + "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, - "time": "2022-06-18T07:21:10+00:00" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-01-11T20:47:48+00:00" }, { "name": "symfony/browser-kit", @@ -10136,16 +9924,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v4.4.44", + "version": "v4.4.45", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "53cee1108a9748682b1268bc1a76a3d6a665ede2" + "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/53cee1108a9748682b1268bc1a76a3d6a665ede2", - "reference": "53cee1108a9748682b1268bc1a76a3d6a665ede2", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4b8daf6c56801e6d664224261cb100b73edc78a5", + "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5", "shasum": "" }, "require": { @@ -10190,7 +9978,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v4.4.44" + "source": "https://github.com/symfony/dom-crawler/tree/v4.4.45" }, "funding": [ { @@ -10206,20 +9994,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T13:16:42+00:00" + "time": "2022-08-03T12:57:57+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.39.0", + "version": "v1.39.1", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "f2b99ba44e22a44fcf724affa53b5539b25fde90" + "reference": "30c8ac13511f6df7bc9ac088f31d7a48ce6433c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/f2b99ba44e22a44fcf724affa53b5539b25fde90", - "reference": "f2b99ba44e22a44fcf724affa53b5539b25fde90", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/30c8ac13511f6df7bc9ac088f31d7a48ce6433c6", + "reference": "30c8ac13511f6df7bc9ac088f31d7a48ce6433c6", "shasum": "" }, "require": { @@ -10278,7 +10066,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.39.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.39.1" }, "funding": [ { @@ -10294,20 +10082,20 @@ "type": "tidelift" } ], - "time": "2022-04-21T18:16:11+00:00" + "time": "2022-09-13T18:14:36+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.4.11", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "31b1549f54b1a1890e725a0c1c8c2de6ef2205b3" + "reference": "2a0216076da723aeabebef57bbb5009d0ee920f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/31b1549f54b1a1890e725a0c1c8c2de6ef2205b3", - "reference": "31b1549f54b1a1890e725a0c1c8c2de6ef2205b3", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2a0216076da723aeabebef57bbb5009d0ee920f6", + "reference": "2a0216076da723aeabebef57bbb5009d0ee920f6", "shasum": "" }, "require": { @@ -10361,7 +10149,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.11" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.35" }, "funding": [ { @@ -10377,20 +10165,20 @@ "type": "tidelift" } ], - "time": "2022-07-28T13:33:28+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.5", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" + "reference": "887762aa99ff16f65dc8b48aafead415f942d407" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/887762aa99ff16f65dc8b48aafead415f942d407", + "reference": "887762aa99ff16f65dc8b48aafead415f942d407", "shasum": "" }, "require": { @@ -10423,7 +10211,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.35" }, "funding": [ { @@ -10439,7 +10227,7 @@ "type": "tidelift" } ], - "time": "2022-02-18T16:06:09+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/web-profiler-bundle", @@ -10574,16 +10362,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -10612,7 +10400,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -10620,7 +10408,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], From 784f9ff20fde0e66844ce6800aa184ba474dd41d Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 19 Dec 2023 15:19:02 +0100 Subject: [PATCH 07/52] Move .env vars to openconext/parameters.yaml The legacy folder was renamed to openconext (as decided to be the way forward) The .env files only contained env overrides and allowed for setting the secret --- .env.ci | 21 ------ .env.dist | 3 - .env.test | 4 - .env.vm | 21 ------ .gitignore | 3 +- composer.json | 6 +- composer.lock | 73 +------------------ config/bootstrap.php | 38 ++++++---- .../parameters.yaml.dist | 4 +- config/packages/framework.yaml | 5 +- config/services.yaml | 2 +- symfony.lock | 3 - 12 files changed, 38 insertions(+), 145 deletions(-) delete mode 100644 .env.ci delete mode 100644 .env.dist delete mode 100644 .env.test delete mode 100644 .env.vm rename config/{legacy => openconext}/parameters.yaml.dist (97%) diff --git a/.env.ci b/.env.ci deleted file mode 100644 index 08ff06ca..00000000 --- a/.env.ci +++ /dev/null @@ -1,21 +0,0 @@ -# In all environments, the following files are loaded if they exist, -# the later taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration - -###> symfony/framework-bundle ### -APP_ENV=test -APP_SECRET=45aa9def36d107b2a081bbfb7faf828b -#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 -#TRUSTED_HOSTS='^localhost|example\.com$' -###< symfony/framework-bundle ### diff --git a/.env.dist b/.env.dist deleted file mode 100644 index caec3df7..00000000 --- a/.env.dist +++ /dev/null @@ -1,3 +0,0 @@ -KERNEL_CLASS='App\Kernel' -APP_ENV=prod -APP_SECRET=THISISNOTSECUREPLEASEPROVIDEASECRET diff --git a/.env.test b/.env.test deleted file mode 100644 index 24a43c03..00000000 --- a/.env.test +++ /dev/null @@ -1,4 +0,0 @@ -# define your env variables for the test env here -KERNEL_CLASS='App\Kernel' -APP_SECRET='$ecretf0rt3st' -SYMFONY_DEPRECATIONS_HELPER=999999 diff --git a/.env.vm b/.env.vm deleted file mode 100644 index 441076d1..00000000 --- a/.env.vm +++ /dev/null @@ -1,21 +0,0 @@ -# In all environments, the following files are loaded if they exist, -# the later taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration - -###> symfony/framework-bundle ### -APP_ENV=dev -APP_SECRET=45aa9def36d107b2a081bbfb7faf828b -#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 -#TRUSTED_HOSTS='^localhost|example\.com$' -###< symfony/framework-bundle ### diff --git a/.gitignore b/.gitignore index a9864fbc..2d2e318b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,8 @@ /userdb.json /.web-server-pid -/config/legacy/parameters.yaml +/config/openconext/parameters.yaml /var/* -/app/ !/var/cache /var/cache/* !var/cache/.gitkeep diff --git a/composer.json b/composer.json index 0acc69c4..1c3e49fb 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,6 @@ "surfnet/stepup-saml-bundle": "^4.3", "symfony/asset": "^4.3", "symfony/console": "^4.3", - "symfony/dotenv": "^4.3", "symfony/flex": "^1.4", "symfony/form": "^4.3", "symfony/monolog-bundle": "^3.4", @@ -118,6 +117,11 @@ "php": "7.2.5" } }, + "extra": { + "runtime": { + "disable_dotenv": true + } + }, "archive": { "exclude": [ "!/.env", diff --git a/composer.lock b/composer.lock index facecdf8..fee7d320 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c95ead47d961b577dca47d6ba848e89c", + "content-hash": "9713a8728e01c9d8662b77e2b7357ed0", "packages": [ { "name": "beberlei/assert", @@ -2374,75 +2374,6 @@ ], "time": "2022-01-02T09:53:40+00:00" }, - { - "name": "symfony/dotenv", - "version": "v4.4.37", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "fcedd6d382b3afc3e1e786aa4e4fc4cf06f564cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/fcedd6d382b3afc3e1e786aa4e4fc4cf06f564cf", - "reference": "fcedd6d382b3afc3e1e786aa4e4fc4cf06f564cf", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "require-dev": { - "symfony/process": "^3.4.2|^4.0|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "source": "https://github.com/symfony/dotenv/tree/v4.4.37" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:41:36+00:00" - }, { "name": "symfony/error-handler", "version": "v4.4.44", @@ -10423,7 +10354,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "7.2.5" + "php": "8.2" }, "plugin-api-version": "2.6.0" } diff --git a/config/bootstrap.php b/config/bootstrap.php index 9c5a99c6..9c7d3a6c 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -1,23 +1,29 @@ =1.2) -if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v); - } -} elseif (!class_exists(Dotenv::class)) { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} else { - // load all the .env files - (new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env'); +// Test if required parameters are set +if (0 !== count(array_diff($requiredParameters, array_keys($parameters)))) { + throw new RuntimeException(sprintf( + 'Required parameters are not configured, required params are: %s, configure them in %s', + implode(', ', $requiredParameters), + $parametersPath + )); } -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +$_SERVER['APP_ENV'] = $parameters['app_env']; +$_SERVER['APP_DEBUG'] = $parameters['app_debug']; +$_SERVER['APP_SECRET'] = $parameters['app_secret']; + +// Allow the application environment (dev/test/prod) to change via the APP_ENV environment variable. +if (array_key_exists('APP_ENV', $_ENV)) { + $_SERVER['APP_ENV'] = $_ENV['APP_ENV']; +} + +filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/config/legacy/parameters.yaml.dist b/config/openconext/parameters.yaml.dist similarity index 97% rename from config/legacy/parameters.yaml.dist rename to config/openconext/parameters.yaml.dist index 3fcef45c..a95f3684 100644 --- a/config/legacy/parameters.yaml.dist +++ b/config/openconext/parameters.yaml.dist @@ -2,8 +2,10 @@ # Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production. # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration parameters: + app_env: prod + app_debug: false # A secret key that's used to generate certain security-related tokens - secret: ThisTokenIsNotSoSecretChangeIt + app_secret: ThisTokenIsNotSoSecretChangeIt # All locales supported by the application default_locale: en_GB diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 0dfb7d7f..39da7f8f 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,5 +1,8 @@ +imports: + - { resource: ../openconext/*.yaml } + framework: - secret: '%env(APP_SECRET)%' + secret: '%app_secret%' csrf_protection: true http_method_override: true diff --git a/config/services.yaml b/config/services.yaml index fc08bc27..bda29379 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -4,7 +4,7 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration imports: - - { resource: 'legacy/parameters.yaml' } + - { resource: 'openconext/parameters.yaml' } services: # default configuration for services in *this* file diff --git a/symfony.lock b/symfony.lock index e3009064..b5840c89 100644 --- a/symfony.lock +++ b/symfony.lock @@ -322,9 +322,6 @@ "symfony/dom-crawler": { "version": "v4.3.3" }, - "symfony/dotenv": { - "version": "v4.3.3" - }, "symfony/error-handler": { "version": "v4.4.16" }, From 9632063e7b8221916f684c6165618389382adf3e Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 2 Jan 2024 08:42:23 +0100 Subject: [PATCH 08/52] Move config from SF3 to SF4/5 standard --- config/bundles.php | 3 +- config/packages/dev/framework.yaml | 4 - config/packages/dev/monolog.yaml | 25 - config/packages/dev/routing.yaml | 4 - config/packages/dev/surfnet_saml.yaml | 25 - config/packages/dev/web_profiler.yaml | 3 - config/packages/framework.yaml | 24 + config/packages/monolog.yaml | 41 ++ config/packages/prod/monolog.yaml | 13 - config/packages/prod/monolog.yaml.docker | 12 - config/packages/prod/webpack_encore.yaml | 4 - config/packages/sensio_framework_extra.yaml | 3 - config/packages/surfnet_saml.yaml | 54 ++ config/packages/test/framework.yaml | 6 - config/packages/test/monolog.yaml | 14 - config/packages/test/routing.yaml | 3 - config/packages/test/services.yaml | 17 - config/packages/test/surfnet_saml.yaml | 25 - config/packages/web_profiler.yaml | 17 + config/preload.php | 5 + config/routes/framework.yaml | 4 + config/routes/security.yaml | 3 + config/routes/web_profiler.yaml | 8 + .../dev/services.yaml => services_dev.yaml} | 0 config/services_test.yaml | 16 + symfony.lock | 551 +++--------------- var/cache/.gitkeep | 0 var/log/.gitkeep | 0 28 files changed, 256 insertions(+), 628 deletions(-) delete mode 100644 config/packages/dev/framework.yaml delete mode 100644 config/packages/dev/monolog.yaml delete mode 100644 config/packages/dev/routing.yaml delete mode 100644 config/packages/dev/surfnet_saml.yaml delete mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/monolog.yaml delete mode 100644 config/packages/prod/monolog.yaml delete mode 100644 config/packages/prod/monolog.yaml.docker delete mode 100644 config/packages/prod/webpack_encore.yaml delete mode 100644 config/packages/sensio_framework_extra.yaml delete mode 100644 config/packages/test/framework.yaml delete mode 100644 config/packages/test/monolog.yaml delete mode 100644 config/packages/test/routing.yaml delete mode 100644 config/packages/test/services.yaml delete mode 100644 config/packages/test/surfnet_saml.yaml create mode 100644 config/packages/web_profiler.yaml create mode 100644 config/preload.php create mode 100644 config/routes/framework.yaml create mode 100644 config/routes/security.yaml create mode 100644 config/routes/web_profiler.yaml rename config/{packages/dev/services.yaml => services_dev.yaml} (100%) create mode 100644 config/services_test.yaml create mode 100644 var/cache/.gitkeep create mode 100644 var/log/.gitkeep diff --git a/config/bundles.php b/config/bundles.php index ad894211..b34a411a 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -3,7 +3,6 @@ return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], @@ -13,4 +12,6 @@ Surfnet\StepupBundle\SurfnetStepupBundle::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], OpenConext\MonitorBundle\OpenConextMonitorBundle::class => ['all' => true], + FriendsOfBehat\SymfonyExtension\Bundle\FriendsOfBehatSymfonyExtensionBundle::class => ['test' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/framework.yaml b/config/packages/dev/framework.yaml deleted file mode 100644 index badc167d..00000000 --- a/config/packages/dev/framework.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - php_errors: - log: false - diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml deleted file mode 100644 index c96921ca..00000000 --- a/config/packages/dev/monolog.yaml +++ /dev/null @@ -1,25 +0,0 @@ -monolog: - handlers: - main: - type: stream - path: '%kernel.logs_dir%/%kernel.environment%.log' - level: debug - channels: ['!event', '!php'] - console: - type: console - process_psr_3_messages: false - channels: ['!event', '!doctrine', '!console'] - # To follow logs in real time, execute the following command: - # `bin/console server:log -vv` - server_log: - type: server_log - process_psr_3_messages: false - host: 127.0.0.1:9911 - # uncomment to get logging in your browser - # you may have to allow bigger header sizes in your Web server configuration - #firephp: - # type: firephp - # level: info - #chromephp: - # type: chromephp - # level: info diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml deleted file mode 100644 index 8b5ab5ca..00000000 --- a/config/packages/dev/routing.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - router: - strict_requirements: true - profiler: { only_exceptions: false } diff --git a/config/packages/dev/surfnet_saml.yaml b/config/packages/dev/surfnet_saml.yaml deleted file mode 100644 index 646c9e01..00000000 --- a/config/packages/dev/surfnet_saml.yaml +++ /dev/null @@ -1,25 +0,0 @@ -surfnet_saml: - hosted: - identity_provider: - enabled: true - service_provider_repository: surfnet_saml.remote.service_providers - sso_route: gssp_saml_sso - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - service_provider: - enabled: true - assertion_consumer_route: sp_demo_acs - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - metadata: - entity_id_route: gssp_saml_metadata - public_key: "%saml_metadata_publickey%" - private_key: "%saml_metadata_privatekey%" - remote: - service_providers: - - entity_id: "%saml_remote_sp_entity_id%" - certificate_file: "%saml_remote_sp_certificate%" - assertion_consumer_service_url: "%saml_remote_sp_acs%" - - entity_id: https://tiqr.stepup.example.com/saml/metadata - certificate_file: "%saml_idp_publickey%" - assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml deleted file mode 100644 index 1f1cb2bb..00000000 --- a/config/packages/dev/web_profiler.yaml +++ /dev/null @@ -1,3 +0,0 @@ -web_profiler: - toolbar: true - intercept_redirects: false diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 39da7f8f..b7f8a360 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -18,3 +18,27 @@ framework: php_errors: log: "%kernel.debug%" +when@dev: + framework: + router: + strict_requirements: true + profiler: { only_exceptions: false } + + php_errors: + log: false + # To follow logs in real time, execute the following command: + # `bin/console server:log -vv` + server_log: + type: server_log + process_psr_3_messages: false + host: 127.0.0.1:9911 + +when@test: + framework: + test: ~ + session: + storage_id: session.storage.mock_file + profiler: + collect: false + router: + strict_requirements: true diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml new file mode 100644 index 00000000..e8f431c9 --- /dev/null +++ b/config/packages/monolog.yaml @@ -0,0 +1,41 @@ +monolog: + handlers: + prod-signaler: + type: fingers_crossed + action_level: ERROR + passthru_level: NOTICE # this means that all message of level NOTICE or higher are always logged + handler: main_syslog + bubble: false # if we handle it, nothing else should + main_syslog: + type: stream + path: "php://stderr" + formatter: surfnet_stepup.monolog.json_formatter + +when@dev: + monolog: + handlers: + main: + type: stream + path: php://stderr + level: debug + channels: ["!event"] + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!deprecation", "!console"] + +when@test: + monolog: + handlers: + main: + path: php://stderr + type: fingers_crossed + passthru_level: NOTICE + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: php://stderr + level: debug diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml deleted file mode 100644 index 91e538af..00000000 --- a/config/packages/prod/monolog.yaml +++ /dev/null @@ -1,13 +0,0 @@ -monolog: - handlers: - prod-signaler: - type: fingers_crossed - action_level: ERROR - passthru_level: NOTICE # this means that all message of level NOTICE or higher are always logged - handler: main_syslog - bubble: false # if we handle it, nothing else should - main_syslog: - type: syslog - ident: stepup-tiqr - facility: user - formatter: surfnet_stepup.monolog.json_formatter diff --git a/config/packages/prod/monolog.yaml.docker b/config/packages/prod/monolog.yaml.docker deleted file mode 100644 index f1a1e7e9..00000000 --- a/config/packages/prod/monolog.yaml.docker +++ /dev/null @@ -1,12 +0,0 @@ -monolog: - handlers: - prod-signaler: - type: fingers_crossed - action_level: ERROR - passthru_level: NOTICE # this means that all message of level NOTICE or higher are always logged - handler: main_syslog - bubble: false # if we handle it, nothing else should - main_syslog: - type: stream - path: "php://stderr" - formatter: surfnet_stepup.monolog.json_formatter diff --git a/config/packages/prod/webpack_encore.yaml b/config/packages/prod/webpack_encore.yaml deleted file mode 100644 index d0b3ba81..00000000 --- a/config/packages/prod/webpack_encore.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#webpack_encore: - # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) - # Available in version 1.2 - #cache: true diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml deleted file mode 100644 index 1821ccc0..00000000 --- a/config/packages/sensio_framework_extra.yaml +++ /dev/null @@ -1,3 +0,0 @@ -sensio_framework_extra: - router: - annotations: false diff --git a/config/packages/surfnet_saml.yaml b/config/packages/surfnet_saml.yaml index 4f5eb18b..146a91c1 100644 --- a/config/packages/surfnet_saml.yaml +++ b/config/packages/surfnet_saml.yaml @@ -15,3 +15,57 @@ surfnet_saml: - entity_id: "%saml_remote_sp_entity_id%" certificate_file: "%saml_remote_sp_certificate%" assertion_consumer_service_url: "%saml_remote_sp_acs%" + +when@test: + surfnet_saml: + hosted: + identity_provider: + enabled: true + service_provider_repository: surfnet_saml.remote.service_providers + sso_route: gssp_saml_sso + public_key: "%saml_idp_publickey%" + private_key: "%saml_idp_privatekey%" + service_provider: + enabled: true + assertion_consumer_route: sp_demo_acs + public_key: "%saml_idp_publickey%" + private_key: "%saml_idp_privatekey%" + metadata: + entity_id_route: gssp_saml_metadata + public_key: "%saml_metadata_publickey%" + private_key: "%saml_metadata_privatekey%" + remote: + service_providers: + - entity_id: "%saml_remote_sp_entity_id%" + certificate_file: "%saml_remote_sp_certificate%" + assertion_consumer_service_url: "%saml_remote_sp_acs%" + - entity_id: https://tiqr.stepup.example.com/saml/metadata + certificate_file: "%saml_idp_publickey%" + assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs + +when@dev: + surfnet_saml: + hosted: + identity_provider: + enabled: true + service_provider_repository: surfnet_saml.remote.service_providers + sso_route: gssp_saml_sso + public_key: "%saml_idp_publickey%" + private_key: "%saml_idp_privatekey%" + service_provider: + enabled: true + assertion_consumer_route: sp_demo_acs + public_key: "%saml_idp_publickey%" + private_key: "%saml_idp_privatekey%" + metadata: + entity_id_route: gssp_saml_metadata + public_key: "%saml_metadata_publickey%" + private_key: "%saml_metadata_privatekey%" + remote: + service_providers: + - entity_id: "%saml_remote_sp_entity_id%" + certificate_file: "%saml_remote_sp_certificate%" + assertion_consumer_service_url: "%saml_remote_sp_acs%" + - entity_id: https://tiqr.stepup.example.com/saml/metadata + certificate_file: "%saml_idp_publickey%" + assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml deleted file mode 100644 index 344d2757..00000000 --- a/config/packages/test/framework.yaml +++ /dev/null @@ -1,6 +0,0 @@ -framework: - test: ~ - session: - storage_id: session.storage.mock_file - profiler: - collect: false diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml deleted file mode 100644 index 4b85dfd9..00000000 --- a/config/packages/test/monolog.yaml +++ /dev/null @@ -1,14 +0,0 @@ -monolog: - handlers: - main: - type: fingers_crossed - action_level: error - passthru_level: notice # this means that all message of level NOTICE or higher are always logged - handler: nested - nested: - type: stream - path: '%kernel.logs_dir%/%kernel.environment%.log' - level: notice - console: - type: console - process_psr_3_messages: false diff --git a/config/packages/test/routing.yaml b/config/packages/test/routing.yaml deleted file mode 100644 index 4116679a..00000000 --- a/config/packages/test/routing.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - router: - strict_requirements: true diff --git a/config/packages/test/services.yaml b/config/packages/test/services.yaml deleted file mode 100644 index fde2d6cd..00000000 --- a/config/packages/test/services.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# config/services.yaml -imports: - - { resource: '../dev/services.yaml' } - -services: - Dev\FileLogger: - public: true - decorates: 'logger' - arguments: - - '@kernel' - - overide_matcher: - class: App\Service\UserAgentMatcher - public: true - decorates: App\Service\UserAgentMatcher - arguments: - - '/^Behat UA$/' diff --git a/config/packages/test/surfnet_saml.yaml b/config/packages/test/surfnet_saml.yaml deleted file mode 100644 index 646c9e01..00000000 --- a/config/packages/test/surfnet_saml.yaml +++ /dev/null @@ -1,25 +0,0 @@ -surfnet_saml: - hosted: - identity_provider: - enabled: true - service_provider_repository: surfnet_saml.remote.service_providers - sso_route: gssp_saml_sso - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - service_provider: - enabled: true - assertion_consumer_route: sp_demo_acs - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - metadata: - entity_id_route: gssp_saml_metadata - public_key: "%saml_metadata_publickey%" - private_key: "%saml_metadata_privatekey%" - remote: - service_providers: - - entity_id: "%saml_remote_sp_entity_id%" - certificate_file: "%saml_remote_sp_certificate%" - assertion_consumer_service_url: "%saml_remote_sp_acs%" - - entity_id: https://tiqr.stepup.example.com/saml/metadata - certificate_file: "%saml_idp_publickey%" - assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml new file mode 100644 index 00000000..b9461110 --- /dev/null +++ b/config/packages/web_profiler.yaml @@ -0,0 +1,17 @@ +when@dev: + web_profiler: + toolbar: true + intercept_redirects: false + + framework: + profiler: + only_exceptions: false + collect_serializer_data: true + +when@test: + web_profiler: + toolbar: false + intercept_redirects: false + + framework: + profiler: { collect: false } diff --git a/config/preload.php b/config/preload.php new file mode 100644 index 00000000..5ebcdb21 --- /dev/null +++ b/config/preload.php @@ -0,0 +1,5 @@ + Date: Tue, 2 Jan 2024 09:22:53 +0100 Subject: [PATCH 09/52] Move assets to ./assets folder That more closesly matches the modern symfony ways The webpack setup needed some small tweaking in order to keep things in a functioning state --- {public => assets}/images/spinner.gif | Bin {public => assets}/images/spinner.svg | 0 {public => assets}/images/tiqr.png | Bin {public => assets/images}/tiqrRGB.png | Bin {public => assets}/images/tiqr_logo.png | Bin .../openconext}/images/header-logo.png | Bin {public => assets}/scss/application.scss | 0 {public => assets}/scss/vars.scss | 0 .../typescript/AuthenticationPageService.ts | 0 .../typescript/Client/NotificationClient.ts | 0 .../typescript/Client/StatusClient.ts | 0 .../typescript/Component/Component.ts | 0 .../typescript/Component/ComponentCollection.ts | 0 .../typescript/Component/HideableComponent.ts | 0 .../Component/RegistrationStatusComponent.ts | 0 .../typescript/Component/SlideableComponent.ts | 0 .../typescript/RegistrationStateMachine.ts | 0 .../typescript/StatusPollService.ts | 0 .../__test__/AuthenticationPageService.test.ts | 0 .../__test__/RegistrationPageService.test.ts | 0 {public => assets}/typescript/authentication.ts | 0 {public => assets}/typescript/registration.ts | 0 templates/base.html.twig | 2 ++ translations/.gitignore | 0 tsconfig.json | 2 +- webpack.config.js | 16 +++++++++++++--- yarn.lock | 14 +++++++++++--- 27 files changed, 27 insertions(+), 7 deletions(-) rename {public => assets}/images/spinner.gif (100%) rename {public => assets}/images/spinner.svg (100%) rename {public => assets}/images/tiqr.png (100%) rename {public => assets/images}/tiqrRGB.png (100%) rename {public => assets}/images/tiqr_logo.png (100%) rename {public => assets/openconext}/images/header-logo.png (100%) rename {public => assets}/scss/application.scss (100%) rename {public => assets}/scss/vars.scss (100%) rename {public => assets}/typescript/AuthenticationPageService.ts (100%) rename {public => assets}/typescript/Client/NotificationClient.ts (100%) rename {public => assets}/typescript/Client/StatusClient.ts (100%) rename {public => assets}/typescript/Component/Component.ts (100%) rename {public => assets}/typescript/Component/ComponentCollection.ts (100%) rename {public => assets}/typescript/Component/HideableComponent.ts (100%) rename {public => assets}/typescript/Component/RegistrationStatusComponent.ts (100%) rename {public => assets}/typescript/Component/SlideableComponent.ts (100%) rename {public => assets}/typescript/RegistrationStateMachine.ts (100%) rename {public => assets}/typescript/StatusPollService.ts (100%) rename {public => assets}/typescript/__test__/AuthenticationPageService.test.ts (100%) rename {public => assets}/typescript/__test__/RegistrationPageService.test.ts (100%) rename {public => assets}/typescript/authentication.ts (100%) rename {public => assets}/typescript/registration.ts (100%) create mode 100644 translations/.gitignore diff --git a/public/images/spinner.gif b/assets/images/spinner.gif similarity index 100% rename from public/images/spinner.gif rename to assets/images/spinner.gif diff --git a/public/images/spinner.svg b/assets/images/spinner.svg similarity index 100% rename from public/images/spinner.svg rename to assets/images/spinner.svg diff --git a/public/images/tiqr.png b/assets/images/tiqr.png similarity index 100% rename from public/images/tiqr.png rename to assets/images/tiqr.png diff --git a/public/tiqrRGB.png b/assets/images/tiqrRGB.png similarity index 100% rename from public/tiqrRGB.png rename to assets/images/tiqrRGB.png diff --git a/public/images/tiqr_logo.png b/assets/images/tiqr_logo.png similarity index 100% rename from public/images/tiqr_logo.png rename to assets/images/tiqr_logo.png diff --git a/public/images/header-logo.png b/assets/openconext/images/header-logo.png similarity index 100% rename from public/images/header-logo.png rename to assets/openconext/images/header-logo.png diff --git a/public/scss/application.scss b/assets/scss/application.scss similarity index 100% rename from public/scss/application.scss rename to assets/scss/application.scss diff --git a/public/scss/vars.scss b/assets/scss/vars.scss similarity index 100% rename from public/scss/vars.scss rename to assets/scss/vars.scss diff --git a/public/typescript/AuthenticationPageService.ts b/assets/typescript/AuthenticationPageService.ts similarity index 100% rename from public/typescript/AuthenticationPageService.ts rename to assets/typescript/AuthenticationPageService.ts diff --git a/public/typescript/Client/NotificationClient.ts b/assets/typescript/Client/NotificationClient.ts similarity index 100% rename from public/typescript/Client/NotificationClient.ts rename to assets/typescript/Client/NotificationClient.ts diff --git a/public/typescript/Client/StatusClient.ts b/assets/typescript/Client/StatusClient.ts similarity index 100% rename from public/typescript/Client/StatusClient.ts rename to assets/typescript/Client/StatusClient.ts diff --git a/public/typescript/Component/Component.ts b/assets/typescript/Component/Component.ts similarity index 100% rename from public/typescript/Component/Component.ts rename to assets/typescript/Component/Component.ts diff --git a/public/typescript/Component/ComponentCollection.ts b/assets/typescript/Component/ComponentCollection.ts similarity index 100% rename from public/typescript/Component/ComponentCollection.ts rename to assets/typescript/Component/ComponentCollection.ts diff --git a/public/typescript/Component/HideableComponent.ts b/assets/typescript/Component/HideableComponent.ts similarity index 100% rename from public/typescript/Component/HideableComponent.ts rename to assets/typescript/Component/HideableComponent.ts diff --git a/public/typescript/Component/RegistrationStatusComponent.ts b/assets/typescript/Component/RegistrationStatusComponent.ts similarity index 100% rename from public/typescript/Component/RegistrationStatusComponent.ts rename to assets/typescript/Component/RegistrationStatusComponent.ts diff --git a/public/typescript/Component/SlideableComponent.ts b/assets/typescript/Component/SlideableComponent.ts similarity index 100% rename from public/typescript/Component/SlideableComponent.ts rename to assets/typescript/Component/SlideableComponent.ts diff --git a/public/typescript/RegistrationStateMachine.ts b/assets/typescript/RegistrationStateMachine.ts similarity index 100% rename from public/typescript/RegistrationStateMachine.ts rename to assets/typescript/RegistrationStateMachine.ts diff --git a/public/typescript/StatusPollService.ts b/assets/typescript/StatusPollService.ts similarity index 100% rename from public/typescript/StatusPollService.ts rename to assets/typescript/StatusPollService.ts diff --git a/public/typescript/__test__/AuthenticationPageService.test.ts b/assets/typescript/__test__/AuthenticationPageService.test.ts similarity index 100% rename from public/typescript/__test__/AuthenticationPageService.test.ts rename to assets/typescript/__test__/AuthenticationPageService.test.ts diff --git a/public/typescript/__test__/RegistrationPageService.test.ts b/assets/typescript/__test__/RegistrationPageService.test.ts similarity index 100% rename from public/typescript/__test__/RegistrationPageService.test.ts rename to assets/typescript/__test__/RegistrationPageService.test.ts diff --git a/public/typescript/authentication.ts b/assets/typescript/authentication.ts similarity index 100% rename from public/typescript/authentication.ts rename to assets/typescript/authentication.ts diff --git a/public/typescript/registration.ts b/assets/typescript/registration.ts similarity index 100% rename from public/typescript/registration.ts rename to assets/typescript/registration.ts diff --git a/templates/base.html.twig b/templates/base.html.twig index d11c445c..c5cbd811 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -8,6 +8,7 @@ {% block title %}{{ 'site_title'|trans }}{% endblock %} {% block stylesheets %} + {{ encore_entry_link_tags('app') }} {{ encore_entry_link_tags('global') }} {% endblock %} @@ -41,6 +42,7 @@ {% endblock %} {% block javascripts %}{% endblock %} + {{ encore_entry_script_tags('app') }} diff --git a/translations/.gitignore b/translations/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/tsconfig.json b/tsconfig.json index 522c7dd4..b25d6de8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -64,6 +64,6 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, - "include": ["public/typescript"], + "include": ["assets/typescript"], "exclude": ["vendor"] } diff --git a/webpack.config.js b/webpack.config.js index b87f09f6..0ff1869d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,13 +2,23 @@ var Encore = require('@symfony/webpack-encore'); Encore .setOutputPath('public/build/') + .copyFiles([ + { + from: './assets/images', + to: './images/[path][name].[ext]', + }, + { + from: './assets/openconext/images', + to: './images/logo/[path][name].[ext]', + } + ]) .setPublicPath('/build') .cleanupOutputBeforeBuild() // Convert typescript files. .enableTypeScriptLoader() - .addStyleEntry('global', './public/scss/application.scss') - .addEntry('authentication', './public/typescript/authentication.ts') - .addEntry('registration', './public/typescript/registration.ts') + .addStyleEntry('global', './assets/scss/application.scss') + .addEntry('authentication', './assets/typescript/authentication.ts') + .addEntry('registration', './assets/typescript/registration.ts') // Convert sass files. .enableSassLoader(function (options) { diff --git a/yarn.lock b/yarn.lock index 76cdd541..e57a7cf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2372,9 +2372,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400: - version "1.0.30001439" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" - integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== + version "1.0.30001572" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz" + integrity sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw== chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" @@ -3499,6 +3499,14 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-loader@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" From 8ecd61951e814bd7c88de3583093e70d0119ce1d Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 2 Jan 2024 10:59:56 +0100 Subject: [PATCH 10/52] Update Composer dependencies to run SF 6.4 --- composer.json | 104 +++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/composer.json b/composer.json index 1c3e49fb..cc218716 100644 --- a/composer.json +++ b/composer.json @@ -14,56 +14,58 @@ "psr-4": { "Dev\\": "dev", "Tests\\": "tests/" - }, - "files": [ - "vendor/symfony/var-dumper/Resources/functions/dump.php" - ] + } }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-zlib": "*", - "openconext/monitor-bundle": "^2.1", - "sensio/framework-extra-bundle": "^5.4", - "surfnet/stepup-bundle": "^4.1", - "surfnet/stepup-gssp-bundle": "^4", - "surfnet/stepup-saml-bundle": "^4.3", - "symfony/asset": "^4.3", - "symfony/console": "^4.3", - "symfony/flex": "^1.4", - "symfony/form": "^4.3", - "symfony/monolog-bundle": "^3.4", - "symfony/security-bundle": "^4.3", - "symfony/translation": "^4.3", - "symfony/twig-bundle": "^4.3", - "symfony/validator": "^4.3", - "symfony/webpack-encore-bundle": "^1.6", - "symfony/yaml": "^4.3", - "tiqr/tiqr-server-libphp": "^3.0" + "openconext/monitor-bundle": "^4.0", + "surfnet/stepup-bundle": "^6.0.9", + "surfnet/stepup-gssp-bundle": "^5.0", + "surfnet/stepup-saml-bundle": "^6.0", + "symfony/asset": "6.4.*", + "symfony/config": "^6.4", + "symfony/console": "6.4.*", + "symfony/dependency-injection": "^6.4", + "symfony/flex": "^2.4", + "symfony/form": "6.4.*", + "symfony/monolog-bundle": "^3.8", + "symfony/runtime": "6.*.*", + "symfony/security-bundle": "6.4.*", + "symfony/templating": "^6.4", + "symfony/translation": "6.4.*", + "symfony/twig-bundle": "6.4.*", + "symfony/validator": "6.4.*", + "symfony/webpack-encore-bundle": "^2.1", + "symfony/yaml": "6.4.*", + "tiqr/tiqr-server-libphp": "^4.0", + "twig/extra-bundle": "^3.0", + "twig/twig": "^3.0" }, "require-dev": { - "behat/mink": "^1.7", - "behat/mink-browserkit-driver": "^1.3", - "behat/mink-goutte-driver": "^1.2", - "behat/symfony2-extension": "^2.1", - "behatch/contexts": "^3.2", - "jakub-onderka/php-parallel-lint": "~1", - "khanamiryan/qrcode-detector-decoder": "^1.0.3", - "league/csv": "^8.2", - "malukenho/docheader": "^0", - "mockery/mockery": "^1", - "phpmd/phpmd": "~2", + "behat/mink": "^1.9", + "behat/mink-browserkit-driver": "^2.1", + "behat/mink-selenium2-driver": "^1.6", + "friends-of-behat/symfony-extension": "^2.4", + "khanamiryan/qrcode-detector-decoder": "^2.0", + "league/csv": "^9.13", + "malukenho/docheader": "^1", + "mockery/mockery": "^1.6", + "overtrue/phplint": "*", + "phpmd/phpmd": "^2.15", "phpstan/phpstan": "^1.10", "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^8.5", - "sebastian/phpcpd": "^4.1", - "squizlabs/php_codesniffer": "~3", - "symfony/browser-kit": "^4.3", - "symfony/css-selector": "^3", - "symfony/maker-bundle": "~1", - "symfony/phpunit-bridge": "^5.3", - "symfony/stopwatch": "^5.3", - "symfony/web-profiler-bundle": "^5.0" + "phpunit/phpunit": "^9.6", + "sebastian/phpcpd": "^6.0", + "slevomat/coding-standard": "^8.13", + "soyuka/contexts": "^3.3", + "squizlabs/php_codesniffer": "^3.7", + "symfony/browser-kit": "6.4.*", + "symfony/css-selector": "^6.4", + "symfony/phpunit-bridge": "6.4.*", + "symfony/stopwatch": "6.4.*", + "symfony/web-profiler-bundle": "6.4.*" }, "scripts": { "check": [ @@ -95,12 +97,6 @@ "yarn install --frozen-lockfile", "yarn encore production" ], - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ], "auto-scripts": { "cache:clear": "symfony-cmd", "assets:install %PUBLIC_DIR%": "symfony-cmd" @@ -108,18 +104,22 @@ }, "config": { "sort-packages": true, + "platform": { + "php": "8.2" + }, "allow-plugins": { "symfony/flex": true, - "dealerdirect/phpcodesniffer-composer-installer": true, - "symfony/runtime": true - }, - "platform": { - "php": "7.2.5" + "symfony/runtime": true, + "dealerdirect/phpcodesniffer-composer-installer": true } }, "extra": { "runtime": { "disable_dotenv": true + }, + "symfony": { + "allow-contrib": false, + "require": "6.4.*" } }, "archive": { From 00fed4fa3017e80002f71bfc0d5820b58bfb32d5 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Mon, 8 Jan 2024 08:43:22 +0100 Subject: [PATCH 11/52] Get the application back online --- .gitignore | 10 +- composer.json | 1 + config/bundles.php | 1 - config/packages/assets.yaml | 3 - config/packages/cache.yaml | 19 --- config/packages/framework.yaml | 24 ++-- config/packages/monolog.yaml | 5 +- config/packages/routing.yaml | 4 - config/packages/security.yaml | 9 -- config/packages/surfnet_saml.yaml | 46 ++------ config/packages/twig.yaml | 4 +- config/packages/validator.yaml | 8 -- config/routes.yaml | 7 +- config/routes/annotations.yaml | 3 - config/routes/dev/demo.yaml | 2 +- config/routes/dev/twig.yaml | 2 +- config/routes/test/demo.yaml | 2 +- config/services.yaml | 30 ++--- config/services_dev.yaml | 9 +- dev/Command/AuthenticationCommand.php | 19 ++- dev/Command/RegistrationCommand.php | 26 +++-- dev/Controller/QrLinkController.php | 25 ++-- dev/Controller/SPController.php | 47 +++----- dev/FileLogger.php | 22 ++-- dev/HttpClientFactory.php | 2 +- dev/Twig/GsspExtension.php | 11 +- package.json | 5 +- public/index.php | 28 +---- src/Controller/AuthenticationController.php | 51 +++------ src/Controller/CancelController.php | 17 +-- src/Controller/ExceptionController.php | 55 +++++---- src/Controller/InfoController.php | 14 +-- src/Controller/RegistrationController.php | 34 ++---- src/Controller/TiqrAppApiController.php | 59 ++++------ .../LocaleResponseListener.php | 13 +-- src/Exception/TiqrServerRuntimeException.php | 2 +- src/Features/Context/ErrorReportContext.php | 25 ++-- src/Features/Context/TiqrContext.php | 108 ++++++++---------- src/Features/Context/WebContext.php | 15 +-- src/GlobalViewParameters.php | 25 +--- src/Kernel.php | 9 +- src/Service/ErrorPageHelper.php | 51 +++++++++ src/Service/GlobalViewParameters.php | 16 +-- src/Service/UserAgentMatcher.php | 10 +- src/Tiqr/AuthenticationRateLimitService.php | 24 +--- ...uthenticationRateLimitServiceInterface.php | 5 - src/Tiqr/Exception/ConfigurationException.php | 6 +- src/Tiqr/Exception/UserNotExistsException.php | 2 +- src/Tiqr/Legacy/TiqrService.php | 85 ++++++-------- src/Tiqr/Legacy/TiqrUser.php | 29 ++--- src/Tiqr/Legacy/TiqrUserRepository.php | 20 +--- .../Response/AuthenticationErrorResponse.php | 10 +- .../RateLimitedAuthenticationResponse.php | 15 +-- .../RejectedAuthenticationResponse.php | 5 +- .../Response/ValidAuthenticationResponse.php | 10 +- src/Tiqr/TiqrConfiguration.php | 11 +- src/Tiqr/TiqrFactory.php | 72 ++++-------- src/Tiqr/TiqrServiceInterface.php | 8 -- src/Tiqr/TiqrUserInterface.php | 2 - src/Tiqr/TiqrUserRepositoryInterface.php | 4 - src/WithContextLogger.php | 11 +- templates/base.html.twig | 4 +- .../TwigBundle}/Exception/error.html.twig | 0 .../TwigBundle}/Exception/error404.html.twig | 0 var/cache/.gitkeep | 0 var/log/.gitkeep | 0 66 files changed, 427 insertions(+), 774 deletions(-) delete mode 100644 config/packages/assets.yaml delete mode 100644 config/packages/cache.yaml delete mode 100644 config/packages/routing.yaml delete mode 100644 config/packages/validator.yaml delete mode 100644 config/routes/annotations.yaml create mode 100644 src/Service/ErrorPageHelper.php rename templates/{ => bundles/TwigBundle}/Exception/error.html.twig (100%) rename templates/{ => bundles/TwigBundle}/Exception/error404.html.twig (100%) mode change 100644 => 100755 var/cache/.gitkeep mode change 100644 => 100755 var/log/.gitkeep diff --git a/.gitignore b/.gitignore index 2d2e318b..c268efea 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,9 @@ !/var/cache /var/cache/* !var/cache/.gitkeep -!/var/logs -/var/logs/* -!var/logs/.gitkeep +!/var/log +/var/log/* +!var/log/.gitkeep !/var/sessions /var/sessions/* !var/sessions/.gitkeep @@ -73,3 +73,7 @@ ci/qa/.phpcs-cache ###> phpstan/phpstan ### phpstan.neon ###< phpstan/phpstan ### + +###> friends-of-behat/symfony-extension ### +/behat.yml +###< friends-of-behat/symfony-extension ### diff --git a/composer.json b/composer.json index cc218716..c2c37745 100644 --- a/composer.json +++ b/composer.json @@ -48,6 +48,7 @@ "behat/mink-browserkit-driver": "^2.1", "behat/mink-selenium2-driver": "^1.6", "friends-of-behat/symfony-extension": "^2.4", + "guzzle/guzzle": "^3.8", "khanamiryan/qrcode-detector-decoder": "^2.0", "league/csv": "^9.13", "malukenho/docheader": "^1", diff --git a/config/bundles.php b/config/bundles.php index b34a411a..8443793b 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,7 +5,6 @@ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Surfnet\SamlBundle\SurfnetSamlBundle::class => ['all' => true], Surfnet\GsspBundle\SurfnetGsspBundle::class => ['all' => true], diff --git a/config/packages/assets.yaml b/config/packages/assets.yaml deleted file mode 100644 index 051d36dc..00000000 --- a/config/packages/assets.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - assets: - json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml deleted file mode 100644 index 4028c9b7..00000000 --- a/config/packages/cache.yaml +++ /dev/null @@ -1,19 +0,0 @@ -framework: - cache: - # Put the unique name of your app here: the prefix seed - # is used to compute stable namespaces for cache keys. - #prefix_seed: your_vendor_name/app_name - - # The app cache caches to the filesystem by default. - # Other options include: - - # Redis - #app: cache.adapter.redis - #default_redis_provider: redis://localhost - - # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) - #app: cache.adapter.apcu - - # Namespaced pools use the above "app" backend by default - #pools: - #my.dedicated.cache: null diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index b7f8a360..764969a1 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -2,9 +2,13 @@ imports: - { resource: ../openconext/*.yaml } framework: + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' secret: '%app_secret%' csrf_protection: true + handle_all_throwables: true http_method_override: true + error_controller: App\Controller\ExceptionController::show # Enables session support. Note that the session will ONLY be started if you read or write from it. # Remove or comment this section to explicitly disable session support. @@ -12,27 +16,23 @@ framework: handler_id: null cookie_secure: auto cookie_samesite: lax - assets: ~ + router: + strict_requirements: null + utf8: true esi: false fragments: false php_errors: log: "%kernel.debug%" + validation: + email_validation_mode: html5 when@dev: framework: - router: - strict_requirements: true profiler: { only_exceptions: false } - php_errors: log: false - # To follow logs in real time, execute the following command: - # `bin/console server:log -vv` - server_log: - type: server_log - process_psr_3_messages: false - host: 127.0.0.1:9911 - + imports: + - { resource: ../services_dev.yaml } when@test: framework: test: ~ @@ -40,5 +40,3 @@ when@test: storage_id: session.storage.mock_file profiler: collect: false - router: - strict_requirements: true diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index e8f431c9..936e6705 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -10,6 +10,7 @@ monolog: type: stream path: "php://stderr" formatter: surfnet_stepup.monolog.json_formatter + channels: "!event" when@dev: monolog: @@ -18,7 +19,7 @@ when@dev: type: stream path: php://stderr level: debug - channels: ["!event"] + channels: "!event" console: type: console process_psr_3_messages: false @@ -34,7 +35,7 @@ when@test: action_level: error handler: nested excluded_http_codes: [404, 405] - channels: ["!event"] + channels: "!event" nested: type: stream path: php://stderr diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml deleted file mode 100644 index 3d69e1e4..00000000 --- a/config/packages/routing.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - router: - strict_requirements: null - utf8: true diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 75a9b4fa..4c1e5c7d 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -11,15 +11,6 @@ security: pattern: ^/(info|health)$ security: false - main: - anonymous: true - - # activate different ways to authenticate - # https://symfony.com/doc/current/security.html#firewalls-authentication - - # https://symfony.com/doc/current/security/impersonating_user.html - # switch_user: true - # Easy way to control access for large sections of your site # Note: Only the *first* access control that matches will be used access_control: diff --git a/config/packages/surfnet_saml.yaml b/config/packages/surfnet_saml.yaml index 146a91c1..5bb8ce3a 100644 --- a/config/packages/surfnet_saml.yaml +++ b/config/packages/surfnet_saml.yaml @@ -6,6 +6,11 @@ surfnet_saml: sso_route: gssp_saml_sso public_key: "%saml_idp_publickey%" private_key: "%saml_idp_privatekey%" + service_provider: + enabled: true + assertion_consumer_route: sp_demo_acs + public_key: "%saml_idp_publickey%" + private_key: "%saml_idp_privatekey%" metadata: entity_id_route: gssp_saml_metadata public_key: "%saml_metadata_publickey%" @@ -15,9 +20,13 @@ surfnet_saml: - entity_id: "%saml_remote_sp_entity_id%" certificate_file: "%saml_remote_sp_certificate%" assertion_consumer_service_url: "%saml_remote_sp_acs%" + - entity_id: https://tiqr.dev.openconext.local/saml/metadata + certificate_file: "%saml_idp_publickey%" + assertion_consumer_service_url: https://tiqr.dev.openconext.local/demo/sp/acs -when@test: +when@prod: surfnet_saml: + enable_authentication: true hosted: identity_provider: enabled: true @@ -25,38 +34,6 @@ when@test: sso_route: gssp_saml_sso public_key: "%saml_idp_publickey%" private_key: "%saml_idp_privatekey%" - service_provider: - enabled: true - assertion_consumer_route: sp_demo_acs - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - metadata: - entity_id_route: gssp_saml_metadata - public_key: "%saml_metadata_publickey%" - private_key: "%saml_metadata_privatekey%" - remote: - service_providers: - - entity_id: "%saml_remote_sp_entity_id%" - certificate_file: "%saml_remote_sp_certificate%" - assertion_consumer_service_url: "%saml_remote_sp_acs%" - - entity_id: https://tiqr.stepup.example.com/saml/metadata - certificate_file: "%saml_idp_publickey%" - assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs - -when@dev: - surfnet_saml: - hosted: - identity_provider: - enabled: true - service_provider_repository: surfnet_saml.remote.service_providers - sso_route: gssp_saml_sso - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" - service_provider: - enabled: true - assertion_consumer_route: sp_demo_acs - public_key: "%saml_idp_publickey%" - private_key: "%saml_idp_privatekey%" metadata: entity_id_route: gssp_saml_metadata public_key: "%saml_metadata_publickey%" @@ -66,6 +43,3 @@ when@dev: - entity_id: "%saml_remote_sp_entity_id%" certificate_file: "%saml_remote_sp_certificate%" assertion_consumer_service_url: "%saml_remote_sp_acs%" - - entity_id: https://tiqr.stepup.example.com/saml/metadata - certificate_file: "%saml_idp_publickey%" - assertion_consumer_service_url: https://tiqr.stepup.example.com/demo/sp/acs diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 5388c8d7..72f6e0a3 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -1,5 +1,7 @@ twig: - default_path: '%kernel.project_dir%/templates' + paths: + '%kernel.project_dir%/templates': 'default' + '%kernel.project_dir%/vendor/surfnet/stepup-saml-bundle/templates': 'SurfnetSaml' debug: '%kernel.debug%' strict_variables: '%kernel.debug%' globals: diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml deleted file mode 100644 index 350786a1..00000000 --- a/config/packages/validator.yaml +++ /dev/null @@ -1,8 +0,0 @@ -framework: - validation: - email_validation_mode: html5 - - # Enables validator auto-mapping support. - # For instance, basic validation constraints will be inferred from Doctrine's metadata. - #auto_mapping: - # App\Entity\: [] diff --git a/config/routes.yaml b/config/routes.yaml index 5abcdf28..6f053e8c 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,6 +1,7 @@ -#index: -# path: / -# controller: App\Controller\DefaultController::index +controllers: + resource: ../src/Controller/ + type: attribute + gssp_saml: resource: '@SurfnetGsspBundle/Resources/config/routing.yml' diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml deleted file mode 100644 index d49a502a..00000000 --- a/config/routes/annotations.yaml +++ /dev/null @@ -1,3 +0,0 @@ -controllers: - resource: ../../src/Controller/ - type: annotation diff --git a/config/routes/dev/demo.yaml b/config/routes/dev/demo.yaml index 3555caa9..5f6f740c 100644 --- a/config/routes/dev/demo.yaml +++ b/config/routes/dev/demo.yaml @@ -1,3 +1,3 @@ controllers: resource: ../../../dev/Controller/ - type: annotation + type: attribute diff --git a/config/routes/dev/twig.yaml b/config/routes/dev/twig.yaml index f4ee8396..bcbbf13d 100644 --- a/config/routes/dev/twig.yaml +++ b/config/routes/dev/twig.yaml @@ -1,3 +1,3 @@ _errors: - resource: '@TwigBundle/Resources/config/routing/errors.xml' + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' prefix: /_error diff --git a/config/routes/test/demo.yaml b/config/routes/test/demo.yaml index 3555caa9..5f6f740c 100644 --- a/config/routes/test/demo.yaml +++ b/config/routes/test/demo.yaml @@ -1,3 +1,3 @@ controllers: resource: ../../../dev/Controller/ - type: annotation + type: attribute diff --git a/config/services.yaml b/config/services.yaml index bda29379..33fdd9a4 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -18,6 +18,7 @@ services: $supportUrl: '%support_url%' $locales: '%locales%' $tiqrConfiguration: '%tiqr_library_options%' + $appSecret: '%app_secret%' # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name @@ -25,29 +26,22 @@ services: resource: '../src/*' exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + Symfony\Component\DependencyInjection\Container: + alias: 'service_container' + App\Tiqr\Legacy\TiqrService: - public: true - factory: 'App\Tiqr\TiqrFactory:createService' + factory: ['App\Tiqr\TiqrFactory', 'createService'] App\Tiqr\Legacy\TiqrUserRepository: - public: true - factory: 'App\Tiqr\TiqrFactory:createUserRepository' + factory: ['App\Tiqr\TiqrFactory', 'createUserRepository'] App\Tiqr\TiqrUserRepositoryInterface: - public: true alias: App\Tiqr\Legacy\TiqrUserRepository surfnet_saml.saml2.bridge_container: - public: true class: Surfnet\SamlBundle\SAML2\BridgeContainer arguments: - '@logger' @@ -57,12 +51,6 @@ services: $pattern: '%mobile_app_user_agent_pattern%' App\Controller\ExceptionController: - public: true - calls: - - method: setContainer - arguments: - - '@service_container' - tags: - # It is very important this listener has a priority higher than the default exception listener, - # and ideally lower than the profiler listener (so exceptions show up in the toolbar). - - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: -128 } + tags: ['controller.service_arguments'] + arguments: + $errorPageHelper: '@App\Service\ErrorPageHelper' diff --git a/config/services_dev.yaml b/config/services_dev.yaml index 1418edd0..382bd181 100644 --- a/config/services_dev.yaml +++ b/config/services_dev.yaml @@ -7,15 +7,12 @@ services: # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name Dev\: - resource: '../../../dev/*' - exclude: '../../../dev/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + resource: '../dev/*' + exclude: '../dev/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class Dev\Controller\: - resource: '../../../dev/Controller' + resource: '../dev/Controller' tags: ['controller.service_arguments'] - # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones GuzzleHttp\Client: diff --git a/dev/Command/AuthenticationCommand.php b/dev/Command/AuthenticationCommand.php index a4d45ff1..fa3cfbeb 100644 --- a/dev/Command/AuthenticationCommand.php +++ b/dev/Command/AuthenticationCommand.php @@ -20,6 +20,7 @@ use GuzzleHttp\Client; use OCRA; use RuntimeException; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -29,20 +30,17 @@ require_once __DIR__.'/../../vendor/tiqr/tiqr-server-libphp/library/tiqr/Tiqr/OATH/OCRA.php'; +#[AsCommand(name: 'test:authentication')] class AuthenticationCommand extends Command { - private $client; - - public function __construct(Client $client) + public function __construct(private readonly Client $client) { parent::__construct(); - $this->client = $client; } - protected function configure() + protected function configure(): void { $this - ->setName('test:authentication') ->setDescription('Register the app with authentication url.') ->addArgument('path', InputArgument::REQUIRED, 'Path to QR-code image') ->addOption( @@ -82,14 +80,14 @@ protected function execute(InputInterface $input, OutputInterface $output) $matches = []; if (preg_match('/^tiqrauth:\/\/(?P.*)$/', $url, $matches) !== 1) { - throw new RuntimeException(sprintf('Expected url with tiqrauth://')); + throw new RuntimeException('Expected url with tiqrauth://'); } $authn = $matches['url']; - list($serviceId, $session, $challenge, $sp, $version) = explode('/', $authn); + [$serviceId, $session, $challenge, $sp, $version] = explode('/', $authn); $userId = null; if (strpos($serviceId, '@') >= 0) { - list($userId, $serviceId) = explode('@', $serviceId); + [$userId, $serviceId] = explode('@', $serviceId); } $output->writeln([ @@ -165,14 +163,13 @@ protected function execute(InputInterface $input, OutputInterface $output) ]); } - protected function decorateResult($text) + protected function decorateResult($text): string { return "$text"; } /** * @param string $file - * @param OutputInterface $output * * @return string */ diff --git a/dev/Command/RegistrationCommand.php b/dev/Command/RegistrationCommand.php index 5422e609..db3d3501 100644 --- a/dev/Command/RegistrationCommand.php +++ b/dev/Command/RegistrationCommand.php @@ -19,6 +19,7 @@ use GuzzleHttp\Client; use RuntimeException; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -26,20 +27,17 @@ use Symfony\Component\Console\Output\OutputInterface; use Zxing\QrReader; +#[AsCommand(name: 'test:registration')] class RegistrationCommand extends Command { - private $client; - - public function __construct(Client $client) + public function __construct(private readonly Client $client) { parent::__construct(); - $this->client = $client; } - protected function configure() + protected function configure(): void { $this - ->setName('test:registration') ->setDescription('Register the app with registration url.') ->addArgument('path', InputArgument::REQUIRED, 'Path to QR-code image') ->addOption( @@ -59,7 +57,7 @@ protected function configure() ->setHelp('Give the url as argument.'); } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): void { // Fetching the metadata from the Tiqr IDP. $path = $input->getArgument('path'); @@ -67,9 +65,12 @@ protected function execute(InputInterface $input, OutputInterface $output) $matches = []; if (preg_match('/^tiqrenroll:\/\/(?P.*)$/', $url, $matches) !== 1) { - throw new RuntimeException(sprintf('Expected url with tiqrenroll://')); + throw new RuntimeException('Expected url with tiqrenroll://'); } $url = $matches['url']; + // Route the internal curl request via port 80, the host does not + // listen on port 443 + $url = str_replace('https', 'http', $url); $output->writeln("Fetch metadata endpoint from $url"); $metadataResponse = $this->client->get($url); @@ -100,6 +101,9 @@ protected function execute(InputInterface $input, OutputInterface $output) ), $this->decorateResult(json_encode($registrationBody, JSON_PRETTY_PRINT)), ]); + // Route the internal curl request via port 80, the host does not + // listen on port 443 + $metadata->service->enrollmentUrl = str_replace('https', 'http', (string) $metadata->service->enrollmentUrl); $result = $this->client->post($metadata->service->enrollmentUrl, ['form_params' => $registrationBody]); $resultBody = $result->getBody()->getContents(); $output->writeln([ @@ -118,14 +122,12 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->storeIdentity($metadata, $secret, $output); } - protected function decorateResult($text) + protected function decorateResult($text): string { return "$text"; } /** - * @param OutputInterface $output - * * @return string */ protected function readRegistrationUrlFromFile($file, OutputInterface $output) @@ -146,7 +148,7 @@ protected function readRegistrationUrlFromFile($file, OutputInterface $output) * * @return string */ - private function createClientSecret() + private function createClientSecret(): string { return bin2hex(openssl_random_pseudo_bytes(32)); } diff --git a/dev/Controller/QrLinkController.php b/dev/Controller/QrLinkController.php index 2aba5406..f4bd3ead 100644 --- a/dev/Controller/QrLinkController.php +++ b/dev/Controller/QrLinkController.php @@ -28,21 +28,17 @@ */ final class QrLinkController extends AbstractController { - private $tiqrService; - - public function __construct(TiqrServiceInterface $tiqrService) + public function __construct(private readonly TiqrServiceInterface $tiqrService) { - $this->tiqrService = $tiqrService; } /** * Returns the QR for registration without an active authNRequest. * - * @Route("/registration/qr/dev", name="app_identity_registration_qr_dev", methods={"GET"}) - * @param Request $request * @return \Symfony\Component\HttpFoundation\StreamedResponse */ - public function registrationQrAction(Request $request) + #[Route(path: '/registration/qr/dev', name: 'app_identity_registration_qr_dev', methods: ['GET'])] + public function registrationQr(Request $request): \Symfony\Component\HttpFoundation\StreamedResponse { $key = $this->tiqrService->generateEnrollmentKey('dev'); $metadataURL = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode($key))); @@ -52,12 +48,11 @@ public function registrationQrAction(Request $request) /** * Returns the link for registration without an active authNRequest. * - * @Route("/registration/qr/link", name="app_identity_registration_qr_link", methods={"GET"}) - * @param Request $request * @return Response * @throws \InvalidArgumentException */ - public function registrationLinkAction(Request $request) + #[Route(path: '/registration/qr/link', name: 'app_identity_registration_qr_link', methods: ['GET'])] + public function registrationLink(Request $request): \Symfony\Component\HttpFoundation\Response { $key = $this->tiqrService->generateEnrollmentKey('dev'); $metadataUrl = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode($key))); @@ -74,11 +69,10 @@ public function registrationLinkAction(Request $request) /** * Returns the QR without an active authNRequest. * - * @Route("/authentication/qr/{nameId}", name="app_identity_authentication_qr_dev", methods={"GET"}) - * @param string $nameId * @return \Symfony\Component\HttpFoundation\StreamedResponse */ - public function authenticationQrAction($nameId) + #[Route(path: '/authentication/qr/{nameId}', name: 'app_identity_authentication_qr_dev', methods: ['GET'])] + public function authenticationQr(string $nameId): \Symfony\Component\HttpFoundation\StreamedResponse { $this->tiqrService->startAuthentication($nameId, 'dev'); return $this->tiqrService->createAuthenticationQRResponse(); @@ -87,11 +81,10 @@ public function authenticationQrAction($nameId) /** * Returns the link without an active authNRequest. * - * @Route("/authentication/qr/{nameId}/link", name="app_identity_authentication_qr_link", methods={"GET"}) - * @param string $nameId * @return Response */ - public function authenticationQrLinkAction($nameId) + #[Route(path: '/authentication/qr/{nameId}/link', name: 'app_identity_authentication_qr_link', methods: ['GET'])] + public function authenticationQrLink(string $nameId): \Symfony\Component\HttpFoundation\Response { $this->tiqrService->startAuthentication($nameId, 'dev'); $challengeUrl = $this->tiqrService->authenticationUrl(); diff --git a/dev/Controller/SPController.php b/dev/Controller/SPController.php index b7453596..e4ece4d9 100644 --- a/dev/Controller/SPController.php +++ b/dev/Controller/SPController.php @@ -45,29 +45,17 @@ */ final class SPController extends AbstractController { - private $identityProvider; - private $serviceProvider; - private $postBinding; - - public function __construct( - ServiceProvider $serviceProvider, - IdentityProvider $identityProvider, - PostBinding $postBinding - ) { - $this->identityProvider = $identityProvider; - $this->serviceProvider = $serviceProvider; - $this->postBinding = $postBinding; + public function __construct(private readonly ServiceProvider $serviceProvider, private readonly IdentityProvider $identityProvider, private readonly PostBinding $postBinding) + { } /** - * @Route("/demo/sp", name="sp_demo") - * @Route("/", name="homepage") - * - * See @see RegistrationService for a more clean example. * * @throws \Exception */ - public function demoSpAction(Request $request) + #[Route(path: '/demo/sp', name: 'sp_demo')] + #[Route(path: '/', name: 'homepage')] + public function demoSp(Request $request): \Symfony\Component\HttpFoundation\Response { if (!$request->isMethod(Request::METHOD_POST)) { return $this->render('dev/sp.html.twig', ['nameId' => $request->get('nameId')]); @@ -102,12 +90,8 @@ public function demoSpAction(Request $request) return $response; } - /** - * @Route("/demo/sp/acs", name="sp_demo_acs") - * - * See @see RegistrationService for a more clean example. - */ - public function assertionConsumerServiceAction(Request $request) + #[Route(path: '/demo/sp/acs', name: 'sp_demo_acs')] + public function assertionConsumerService(Request $request): \Symfony\Component\HttpFoundation\Response { $xmlResponse = $request->request->get('SAMLResponse'); $xml = base64_decode($xmlResponse); @@ -119,7 +103,7 @@ public function assertionConsumerServiceAction(Request $request) return $this->render('dev/acs.html.twig', [ 'requestId' => $response->getId(), - 'nameId' => $nameID ? [ + 'nameId' => $nameID !== null ? [ 'value' => $nameID->value, 'format' => $nameID->Format, ] : [], @@ -145,11 +129,10 @@ public function assertionConsumerServiceAction(Request $request) /** * Formats xml. * - * @param string $xml * * @return string */ - private function toFormattedXml($xml) + private function toFormattedXml(string|bool $xml): string|false { $domxml = new DOMDocument('1.0'); $domxml->preserveWhiteSpace = false; @@ -162,12 +145,10 @@ private function toFormattedXml($xml) /** * Sign AuthnRequest query parameters. * - * @param array $queryParams * @return string - * * @throws \Exception */ - private function signRequestQuery(array $queryParams) + private function signRequestQuery(array $queryParams): string { /** @var $securityKey */ $securityKey = $this->loadServiceProviderPrivateKey(); @@ -175,7 +156,7 @@ private function signRequestQuery(array $queryParams) $toSign = http_build_query($queryParams); $signature = $securityKey->signData($toSign); - return $toSign.'&Signature='.urlencode(base64_encode($signature)); + return $toSign.'&Signature='.urlencode(base64_encode((string) $signature)); } /** @@ -185,7 +166,7 @@ private function signRequestQuery(array $queryParams) * * @throws \Exception */ - private function loadServiceProviderPrivateKey() + private function loadServiceProviderPrivateKey(): \RobRichards\XMLSecLibs\XMLSecurityKey { $keyLoader = new PrivateKeyLoader(); $privateKey = $keyLoader->loadPrivateKey( @@ -198,13 +179,11 @@ private function loadServiceProviderPrivateKey() } /** - * @param string $xml * * @return Message - * * @throws \Exception */ - private function toUnsignedErrorResponse($xml) + private function toUnsignedErrorResponse(string $xml): \SAML2\Message { $previous = libxml_disable_entity_loader(true); $asXml = DOMDocumentFactory::fromString($xml); diff --git a/dev/FileLogger.php b/dev/FileLogger.php index 3ae33473..04a0290e 100644 --- a/dev/FileLogger.php +++ b/dev/FileLogger.php @@ -24,14 +24,11 @@ final class FileLogger extends AbstractLogger { - private $kernel; - - public function __construct(Kernel $kernel) + public function __construct(private readonly Kernel $kernel) { - $this->kernel = $kernel; } - public function log($level, $message, array $context = array()) + public function log($level, $message, array $context = []): void { if ($level === 'debug') { return; @@ -39,11 +36,14 @@ public function log($level, $message, array $context = array()) $file = fopen($this->getCSVFile(), 'ab+'); $csv = Writer::createFromStream($file); $csv->setDelimiter(';'); - $csv->insertOne(array($level, $message, json_encode($context))); + $csv->insertOne([$level, $message, json_encode($context)]); fclose($file); } - public function cleanLogs() + /** + * @return mixed[] + */ + public function cleanLogs(): array { $logs = $this->getLogs(); $filename = $this->getCSVFile(); @@ -53,7 +53,7 @@ public function cleanLogs() return $logs; } - public function getLogs() + public function getLogs(): array { $filename = $this->getCSVFile(); if (!is_file($filename)) { @@ -62,8 +62,8 @@ public function getLogs() $csv = Reader::createFromStream(fopen($this->getCSVFile(), 'rb')); $csv->setDelimiter(';'); $csv = $csv->fetchAll(); - return array_map(function ($line) { - $line[2] = json_decode($line[2], true); + return array_map(function (array $line): array { + $line[2] = json_decode((string) $line[2], true); return $line; }, $csv); } @@ -72,7 +72,7 @@ public function getLogs() * * @return string */ - protected function getCSVFile() + protected function getCSVFile(): string { $root = $this->kernel->getProjectDir(); diff --git a/dev/HttpClientFactory.php b/dev/HttpClientFactory.php index 4d11cba1..75be82d6 100644 --- a/dev/HttpClientFactory.php +++ b/dev/HttpClientFactory.php @@ -24,7 +24,7 @@ */ class HttpClientFactory { - public static function create() + public static function create(): \GuzzleHttp\Client { // TODO: make the hostname configurable. return new Client([ diff --git a/dev/Twig/GsspExtension.php b/dev/Twig/GsspExtension.php index f4b95358..faf38064 100644 --- a/dev/Twig/GsspExtension.php +++ b/dev/Twig/GsspExtension.php @@ -23,21 +23,16 @@ final class GsspExtension extends AbstractExtension { - private $hostedEntities; - - public function __construct(HostedEntities $hostedEntities) + public function __construct(private readonly HostedEntities $hostedEntities) { - $this->hostedEntities = $hostedEntities; } public function getFunctions() { - return array( - new TwigFunction('demoSpUrl', array($this, 'generateDemoSPUrl')), - ); + return [new TwigFunction('demoSpUrl', $this->generateDemoSPUrl(...))]; } - public function generateDemoSPUrl() + public function generateDemoSPUrl(): string { return sprintf( 'https://pieter.aai.surfnet.nl/simplesamlphp/sp.php?idp=%s', diff --git a/package.json b/package.json index 395409a6..db1f3998 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,13 @@ "@types/jest": "^27", "@types/jquery": "^3.3.9", "@types/node": "^10", + "compass-mixins": "^0.12.10", + "css-loader": "^5", "eslint": "^7", "eslint-config-airbnb": "^19.0", "eslint-plugin-import": "^2.26.0", "eslint-webpack-plugin": "^3.2.0", - "compass-mixins": "^0.12.10", - "css-loader": "^5", + "file-loader": "^6.0.0", "jest": "^27", "jscpd": "^3.4.5", "sass": "^1.43.4", diff --git a/public/index.php b/public/index.php index e30f90c0..a20b1e57 100644 --- a/public/index.php +++ b/public/index.php @@ -1,27 +1,9 @@ handle($request); -$response->send(); -$kernel->terminate($request, $response); +return function (array $context) { + return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); +}; diff --git a/src/Controller/AuthenticationController.php b/src/Controller/AuthenticationController.php index 4d6d6c6c..d88a4f41 100644 --- a/src/Controller/AuthenticationController.php +++ b/src/Controller/AuthenticationController.php @@ -45,37 +45,18 @@ */ class AuthenticationController extends AbstractController { - private $authenticationService; - private $tiqrService; - private $logger; - private $authenticationRateLimitService; - private $userRepository; - private $stateHandler; - - public function __construct( - AuthenticationService $authenticationService, - StateHandlerInterface $stateHandler, - TiqrServiceInterface $tiqrService, - TiqrUserRepositoryInterface $userRepository, - AuthenticationRateLimitServiceInterface $authenticationRateLimitService, - LoggerInterface $logger - ) { - $this->authenticationService = $authenticationService; - $this->stateHandler = $stateHandler; - $this->tiqrService = $tiqrService; - $this->logger = $logger; - $this->authenticationRateLimitService = $authenticationRateLimitService; - $this->userRepository = $userRepository; + public function __construct(private readonly AuthenticationService $authenticationService, private readonly StateHandlerInterface $stateHandler, private readonly TiqrServiceInterface $tiqrService, private readonly TiqrUserRepositoryInterface $userRepository, private readonly AuthenticationRateLimitServiceInterface $authenticationRateLimitService, private readonly LoggerInterface $logger) + { } /** - * @Route("/authentication", name="app_identity_authentication", methods={"GET", "POST"}) * @throws InvalidArgumentException * @throws NoActiveAuthenrequestException * @throws UserNotFoundException * @throws Exception */ - public function authenticationAction(Request $request): Response + #[Route(path: '/authentication', name: 'app_identity_authentication', methods: ['GET', 'POST'])] + public function authentication(Request $request): Response { $nameId = $this->authenticationService->getNameId(); $sari = $this->stateHandler->getRequestId(); @@ -83,7 +64,7 @@ public function authenticationAction(Request $request): Response $logger->info('Verifying if there is a pending authentication request from SP'); - // Do have a valid sample AuthnRequest?. + // Do have a valid sample AuthnRequest? if (!$this->authenticationService->authenticationRequired()) { $logger->error('There is no pending authentication request from SP'); @@ -161,10 +142,10 @@ public function authenticationAction(Request $request): Response } /** - * @Route("/authentication/status", name="app_identity_authentication_status", methods={"GET"}) * @throws InvalidArgumentException */ - public function authenticationStatusAction(): JsonResponse + #[Route(path: '/authentication/status', name: 'app_identity_authentication_status', methods: ['GET'])] + public function authenticationStatus(): JsonResponse { $nameId = $this->authenticationService->getNameId(); $sari = $this->stateHandler->getRequestId(); @@ -209,7 +190,7 @@ private function authenticationChallengeIsExpired(): bool // To check that the session key still exists in the Tiqr_Service's state storage try { $this->tiqrService->authenticationUrl(); - } catch (Exception $e) { + } catch (Exception) { return true; } return false; @@ -254,7 +235,6 @@ private function refreshAuthenticationPage(): JsonResponse * - needs-refresh: refresh the page (the /authentication page will handle the success or error) * - challenge-expired: Message user challenge is expired, let the user give the option to retry. * - * @param string $status * @return JsonResponse */ private function generateAuthenticationStatusResponse(string $status): JsonResponse @@ -271,7 +251,6 @@ private function generateAuthenticationStatusResponse(string $status): JsonRespo * - error: Notification was not send successfully * - no-device: There was no device to send the notification * - * @param string $status * @return JsonResponse */ private function generateNotificationResponse(string $status): JsonResponse @@ -281,10 +260,10 @@ private function generateNotificationResponse(string $status): JsonResponse /** * - * @Route("/authentication/qr", name="app_identity_authentication_qr", methods={"GET"}) * @throws InvalidArgumentException */ - public function authenticationQrAction(): Response + #[Route(path: '/authentication/qr', name: 'app_identity_authentication_qr', methods: ['GET'])] + public function authenticationQr(): Response { $nameId = $this->authenticationService->getNameId(); $sari = $this->stateHandler->getRequestId(); @@ -305,10 +284,10 @@ public function authenticationQrAction(): Response /** * - * @Route("/authentication/notification", name="app_identity_authentication_notification", methods={"POST"}) * @throws InvalidArgumentException */ - public function authenticationNotificationAction(): Response + #[Route(path: '/authentication/notification', name: 'app_identity_authentication_notification', methods: ['POST'])] + public function authenticationNotification(): Response { $nameId = $this->authenticationService->getNameId(); $sari = $this->stateHandler->getRequestId(); @@ -370,7 +349,7 @@ private function handleInvalidResponse(TiqrUserInterface $user, AuthenticationRe return $this->showUserIsBlockedErrorPage($blockedPermanently); } } catch (Exception $e) { - $this->logger->error('Could not determine user (temporary) block state', array('exception' => $e)); + $this->logger->error('Could not determine user (temporary) block state', ['exception' => $e]); } return $this->render('default/authentication.html.twig', [ @@ -388,7 +367,7 @@ private function showUserIsBlockedErrorPage(bool $isBlockedPermanently): Respons } // Forward to the exception controller to prevent an error being logged. return $this->forward( - 'App\Controller\ExceptionController::showAction', + 'App\Controller\ExceptionController::show', [ 'exception' => $exception, ] @@ -396,8 +375,6 @@ private function showUserIsBlockedErrorPage(bool $isBlockedPermanently): Respons } /** - * @param string $notificationType - * @param string $notificationAddress * @return bool True when the notification was successfully sent, false otherwise */ private function sendNotification(string $notificationType, string $notificationAddress): bool diff --git a/src/Controller/CancelController.php b/src/Controller/CancelController.php index e00757d2..a2616ae9 100644 --- a/src/Controller/CancelController.php +++ b/src/Controller/CancelController.php @@ -26,25 +26,18 @@ class CancelController extends AbstractController { - private $authenticationService; - private $registrationService; - private $logger; - public function __construct( - AuthenticationService $authenticationService, - RegistrationService $registrationService, - LoggerInterface $logger + private readonly AuthenticationService $authenticationService, + private readonly RegistrationService $registrationService, + private readonly LoggerInterface $logger ) { - $this->authenticationService = $authenticationService; - $this->registrationService = $registrationService; - $this->logger = $logger; } /** - * @Route("/cancel", name="app_cancel", methods={"GET"}) * @throws \InvalidArgumentException */ - public function cancelAction() + #[Route(path: '/cancel', name: 'app_cancel', methods: ['GET'])] + public function cancel(): \Symfony\Component\HttpFoundation\Response { $this->logger->notice('User cancelled the request'); if ($this->authenticationService->authenticationRequired()) { diff --git a/src/Controller/ExceptionController.php b/src/Controller/ExceptionController.php index b473cdca..647ea425 100644 --- a/src/Controller/ExceptionController.php +++ b/src/Controller/ExceptionController.php @@ -22,63 +22,69 @@ use App\Exception\UserNotFoundException; use App\Exception\UserPermanentlyBlockedException; use App\Exception\UserTemporarilyBlockedException; -use DateTime; +use App\Service\ErrorPageHelper; +use Error; use Exception; use Surfnet\GsspBundle\Exception\UnrecoverableErrorException; use Surfnet\StepupBundle\Controller\ExceptionController as BaseExceptionController; use Surfnet\StepupBundle\Exception\Art; +use Surfnet\StepupBundle\Request\RequestId; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Contracts\Translation\TranslatorInterface; +use Throwable; final class ExceptionController extends BaseExceptionController { - public function onKernelException(ExceptionEvent $event) + public function __construct( + private readonly ErrorPageHelper $errorPageHelper, + TranslatorInterface $translator, + RequestId $requestId + ) { + parent::__construct($translator, $requestId); + } + + public function onKernelException(ExceptionEvent $event): void { - $event->setResponse($this->showAction($event->getRequest(), $event->getException())); + $event->setResponse($this->show($event->getRequest(), $event->getThrowable())); } - public function showAction(Request $request, Exception $exception) + public function show(Request $request, Throwable $exception): Response { - $statusCode = $this->getStatusCode($exception); + $statusCode = 500; + if ($exception instanceof Error) { + $statusCode = $this->getStatusCode($exception); + } - $template = 'Exception\error.html.twig'; + $template = '@default/bundles/TwigBundle/Exception/error.html.twig'; if ($statusCode == 404) { - $template = 'Exception\error404.html.twig'; + $template = '@default/bundles/TwigBundle/Exception/error404.html.twig'; } $response = new Response('', $statusCode); - $timestamp = (new DateTime)->format(DateTime::ISO8601); - $hostname = $request->getHost(); - $requestId = $this->get('surfnet_stepup.request.request_id'); $errorCode = Art::forException($exception); - $userAgent = $request->headers->get('User-Agent'); - $ipAddress = $request->getClientIp(); + + $params = $this->errorPageHelper->generateMetadata($request) + + ['error_code' => $errorCode] + + $this->getPageTitleAndDescription($exception); return $this->render( $template, - [ - 'timestamp' => $timestamp, - 'hostname' => $hostname, - 'request_id' => $requestId->get(), - 'error_code' => $errorCode, - 'user_agent' => $userAgent, - 'ip_address' => $ipAddress, - ] + $this->getPageTitleAndDescription($exception), + $params, $response ); } /** - * @param Exception $exception * @return array View parameters 'title' and 'description' */ - protected function getPageTitleAndDescription(Exception $exception) + protected function getPageTitleAndDescription(\Throwable $exception): array { $translator = $this->getTranslator(); - if ($exception instanceof UnrecoverableErrorException && $exception->getPrevious() !== null) { + if ($exception instanceof UnrecoverableErrorException && $exception->getPrevious() instanceof \Throwable) { return $this->getPageTitleAndDescription($exception->getPrevious()); } elseif ($exception instanceof UserNotFoundException) { $title = $translator->trans('login.error.user_not_found.title'); @@ -105,10 +111,9 @@ protected function getPageTitleAndDescription(Exception $exception) } /** - * @param Exception $exception * @return int HTTP status code */ - protected function getStatusCode(Exception $exception) + protected function getStatusCode(Exception|\Throwable $exception): int { if ($exception instanceof UnrecoverableErrorException) { return Response::HTTP_NOT_ACCEPTABLE; diff --git a/src/Controller/InfoController.php b/src/Controller/InfoController.php index 78f35d9a..58c9a3cf 100644 --- a/src/Controller/InfoController.php +++ b/src/Controller/InfoController.php @@ -23,20 +23,12 @@ class InfoController extends AbstractController { - /** - * @var LoggerInterface - */ - private $logger; - - public function __construct(LoggerInterface $logger) + public function __construct(private readonly LoggerInterface $logger) { - $this->logger = $logger; } - /** - * @Route("/info.html", name="app_info", methods={"GET"}) - */ - public function infoAction() + #[Route(path: '/info.html', name: 'app_info', methods: ['GET'])] + public function info(): \Symfony\Component\HttpFoundation\Response { $this->logger->notice('User requested the info.html page'); return $this->render('default/info.html.twig', []); diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index 5ec0cdeb..e75b8585 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -29,31 +29,18 @@ class RegistrationController extends AbstractController { - private $registrationService; - private $tiqrService; - private $logger; - private $stateHandler; - - public function __construct( - RegistrationService $registrationService, - StateHandlerInterface $stateHandler, - TiqrServiceInterface $tiqrService, - LoggerInterface $logger - ) { - $this->registrationService = $registrationService; - $this->stateHandler = $stateHandler; - $this->tiqrService = $tiqrService; - $this->logger = $logger; + public function __construct(private readonly RegistrationService $registrationService, private readonly StateHandlerInterface $stateHandler, private readonly TiqrServiceInterface $tiqrService, private readonly LoggerInterface $logger) + { } /** * Returns the registration page with QR code that is generated in 'qrRegistrationAction'. * - * @Route("/registration", name="app_identity_registration", methods={"GET", "POST"}) * * @throws \InvalidArgumentException */ - public function registrationAction(Request $request) + #[Route(path: '/registration', name: 'app_identity_registration', methods: ['GET', 'POST'])] + public function registration(Request $request): \Symfony\Component\HttpFoundation\Response { $this->logger->info('Verifying if there is a pending registration from SP'); @@ -94,24 +81,21 @@ public function registrationAction(Request $request) /** * For client-side polling retrieving the status. * - * @Route("/registration/status", name="app_identity_registration_status", methods={"GET"}) * * @throws \InvalidArgumentException */ - public function registrationStatusAction(Request $request) + #[Route(path: '/registration/status', name: 'app_identity_registration_status', methods: ['GET'])] + public function registrationStatus() : \Symfony\Component\HttpFoundation\Response { $this->logger->info('Request for registration status'); - // Do have a valid sample AuthnRequest?. if (!$this->registrationService->registrationRequired()) { $this->logger->error('There is no pending registration request'); return new Response('No registration required', Response::HTTP_BAD_REQUEST); } - $status = $this->tiqrService->getEnrollmentStatus(); $this->logger->info(sprintf('Send json response status "%s"', $status)); - return new Response($this->tiqrService->getEnrollmentStatus()); } @@ -120,11 +104,11 @@ public function registrationStatusAction(Request $request) * * @see /registration/qr/link * - * @Route("/registration/qr/{enrollmentKey}", name="app_identity_registration_qr", methods={"GET"}) * * @throws \InvalidArgumentException */ - public function registrationQrAction(Request $request, $enrollmentKey) + #[Route(path: '/registration/qr/{enrollmentKey}', name: 'app_identity_registration_qr', methods: ['GET'])] + public function registrationQr(Request $request, $enrollmentKey): \Symfony\Component\HttpFoundation\Response { $this->logger->info('Request for registration QR img'); @@ -133,7 +117,7 @@ public function registrationQrAction(Request $request, $enrollmentKey) return new Response('No registration required', Response::HTTP_BAD_REQUEST); } - $metadataUrl = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode($enrollmentKey))); + $metadataUrl = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode((string) $enrollmentKey))); $this->logger->info('Returning registration QR response'); return $this->tiqrService->createRegistrationQRResponse($metadataUrl); } diff --git a/src/Controller/TiqrAppApiController.php b/src/Controller/TiqrAppApiController.php index 16c0691e..962ce9e7 100644 --- a/src/Controller/TiqrAppApiController.php +++ b/src/Controller/TiqrAppApiController.php @@ -39,32 +39,22 @@ */ class TiqrAppApiController extends AbstractController { - private $tiqrService; - private $userRepository; - private $logger; - private $authenticationRateLimitService; - public function __construct( - TiqrServiceInterface $tiqrService, - TiqrUserRepositoryInterface $userRepository, - AuthenticationRateLimitServiceInterface $authenticationRateLimitService, - LoggerInterface $logger + private readonly TiqrServiceInterface $tiqrService, + private readonly TiqrUserRepositoryInterface $userRepository, + private readonly AuthenticationRateLimitServiceInterface $authenticationRateLimitService, + private readonly LoggerInterface $logger ) { - $this->tiqrService = $tiqrService; - $this->userRepository = $userRepository; - $this->logger = $logger; - $this->authenticationRateLimitService = $authenticationRateLimitService; } /** * Metadata endpoint. * * The endpoint where the Tiqr app gets it's registration information from during enrollment - * - * @Route("/tiqr.php", name="app_identity_registration_metadata", methods={"GET"}) - * @Route("/tiqr/tiqr.php", methods={"GET"}) */ - public function metadataAction(Request $request) + #[Route(path: '/tiqr.php', name: 'app_identity_registration_metadata', methods: ['GET'])] + #[Route(path: '/tiqr/tiqr.php', methods: ['GET'])] + public function metadata(Request $request): Response { $enrollmentKey = $request->get('key'); if (empty($enrollmentKey)) { @@ -104,7 +94,7 @@ public function metadataAction(Request $request) return new JsonResponse($metadata); } catch (Exception $e) { - $this->logger->error('Error handling metadata GET request, returning HTTP 500', array('exception' => $e)); + $this->logger->error('Error handling metadata GET request, returning HTTP 500', ['exception' => $e]); return new Response('Error handling metadata GET request', Response::HTTP_INTERNAL_SERVER_ERROR); } } @@ -112,13 +102,11 @@ public function metadataAction(Request $request) /** * This is the route where the app authenticates or registers. * - * @Route("/tiqr.php", name="app_identity_registration_authentication", methods={"POST"}) - * @Route("/tiqr/tiqr.php", methods={"POST"}) * - * @param UserAgentMatcherInterface $userAgentMatcher - * @param Request $request * @return Response */ + #[Route(path: '/tiqr.php', name: 'app_identity_registration_authentication', methods: ['POST'])] + #[Route(path: '/tiqr/tiqr.php', methods: ['POST'])] public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $request) { $operation = $request->get('operation'); @@ -132,14 +120,14 @@ public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $reque if ($operation === 'register') { $this->logger->notice( 'Got POST with registration response', - array('notificationType' => $notificationType, 'notificationAddress' => $notificationAddress) + ['notificationType' => $notificationType, 'notificationAddress' => $notificationAddress] ); return $this->registerAction($userAgentMatcher, $request, $notificationType, $notificationAddress); } if ($operation === 'login') { $this->logger->notice( 'Got POST with login response', - array('notificationType' => $notificationType, 'notificationAddress' => $notificationAddress) + ['notificationType' => $notificationType, 'notificationAddress' => $notificationAddress] ); return $this->loginAction($request, $notificationType, $notificationAddress); } @@ -149,11 +137,8 @@ public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $reque } /** - * @param UserAgentMatcherInterface $userAgentMatcher - * @param Request $request * @param $notificationType * @param $notificationAddress - * * @return Response * @throws \InvalidArgumentException */ @@ -162,7 +147,8 @@ private function registerAction( Request $request, string $notificationType, string $notificationAddress - ) { + ): Response + { $enrollmentSecret = $request->get('otp'); // enrollment secret relayed by tiqr app if (empty($enrollmentSecret)) { $this->logger->error('Missing "otp" parameter'); @@ -211,7 +197,7 @@ private function registerAction( 'sari' => $this->tiqrService->getSariForSessionIdentifier($enrollmentSecret), ]); } catch (Exception $e) { - $logger->error(sprintf('Validation of the enrollment secret "%s" failed', $enrollmentSecret), array('exception' => $e)); + $logger->error(sprintf('Validation of the enrollment secret "%s" failed', $enrollmentSecret), ['exception' => $e]); return new Response('Enrollment failed', Response::HTTP_FORBIDDEN); } @@ -220,7 +206,7 @@ private function registerAction( // Note: historically both uppercase and lowercase hex strings are used // 1. Assert that the secret is a valid hex string - $decoded_secret = hex2bin($secret); + $decoded_secret = hex2bin((string) $secret); if (false === $decoded_secret) { $logger->error('Invalid secret, secret must be a hex string'); return new Response('Invalid secret', Response::HTTP_FORBIDDEN); @@ -238,7 +224,7 @@ private function registerAction( ->createUser($userId, $secret) ->updateNotification($notificationType, $notificationAddress); } catch (Exception $e) { - $logger->error('Error setting user secret and/or notification address and type', array('exception' => $e)); + $logger->error('Error setting user secret and/or notification address and type', ['exception' => $e]); return new Response('Error creating user', Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -247,16 +233,13 @@ private function registerAction( $this->tiqrService->finalizeEnrollment($enrollmentSecret); $logger->notice('Enrollment finalized'); } catch (Exception $e) { - $logger->warning('Error finalizing enrollment', array('exception' => $e)); + $logger->warning('Error finalizing enrollment', ['exception' => $e]); } return new Response('OK', Response::HTTP_OK); } /** Handle login operation from the app, returns response for the app - * @param Request $request - * @param string $notificationType - * @param string $notificationAddress * * @return Response * @@ -299,7 +282,7 @@ private function loginAction(Request $request, string $notificationType, string try { $user = $this->userRepository->getUser($userId); } catch (UserNotExistsException $e) { - $logger->error('User not found', array('exception' => $e)); + $logger->error('User not found', ['exception' => $e]); return new Response('INVALID_USER', Response::HTTP_FORBIDDEN); } @@ -316,7 +299,7 @@ private function loginAction(Request $request, string $notificationType, string try { $user->updateNotification($notificationType, $notificationAddress); } catch (Exception $e) { - $this->logger->warning('Error updating notification type and address', array('exception' => $e)); + $this->logger->warning('Error updating notification type and address', ['exception' => $e]); // Continue } return new Response($result->getMessage(), Response::HTTP_OK); @@ -325,7 +308,7 @@ private function loginAction(Request $request, string $notificationType, string $logger->notice('User authentication denied: ' . $result->getMessage()); return new Response($result->getMessage(), Response::HTTP_FORBIDDEN); } catch (Exception $e) { - $this->logger->error('Authentication failed', array('exception' => $e)); + $this->logger->error('Authentication failed', ['exception' => $e]); } return new Response('AUTHENTICATION_FAILED', Response::HTTP_FORBIDDEN); diff --git a/src/EventSubscriber/LocaleResponseListener.php b/src/EventSubscriber/LocaleResponseListener.php index 3592abc3..990fa4f3 100644 --- a/src/EventSubscriber/LocaleResponseListener.php +++ b/src/EventSubscriber/LocaleResponseListener.php @@ -28,15 +28,12 @@ /** * Handles the lang selection based on cookie. */ -final class LocaleResponseListener implements EventSubscriberInterface +final readonly class LocaleResponseListener implements EventSubscriberInterface { - const STEPUP_LOCALE_COOKIE = 'stepup_locale'; + public const STEPUP_LOCALE_COOKIE = 'stepup_locale'; - private $translator; - - public function __construct(TranslatorInterface $translator) + public function __construct(private TranslatorInterface $translator) { - $this->translator = $translator; } public static function getSubscribedEvents() @@ -48,10 +45,8 @@ public static function getSubscribedEvents() /** * Sets the application local based on stepup cookie. - * - * @param RequestEvent $event */ - public function onKernelRequest(RequestEvent $event) + public function onKernelRequest(RequestEvent $event): void { $request = $event->getRequest(); $local = $request->cookies->get(self::STEPUP_LOCALE_COOKIE, $request->getLocale()); diff --git a/src/Exception/TiqrServerRuntimeException.php b/src/Exception/TiqrServerRuntimeException.php index 4f84c196..bdb9bdc9 100644 --- a/src/Exception/TiqrServerRuntimeException.php +++ b/src/Exception/TiqrServerRuntimeException.php @@ -23,7 +23,7 @@ class TiqrServerRuntimeException extends RuntimeException { - public static function fromOriginalException(Exception $e) + public static function fromOriginalException(Exception $e): self { return new self($e->getMessage(), (int)$e->getCode(), $e); } diff --git a/src/Features/Context/ErrorReportContext.php b/src/Features/Context/ErrorReportContext.php index 302166c9..11c8c5b7 100644 --- a/src/Features/Context/ErrorReportContext.php +++ b/src/Features/Context/ErrorReportContext.php @@ -38,16 +38,15 @@ final class ErrorReportContext implements Context, KernelAwareContext * @var MinkContext */ private $minkContext; - private $kernel; + private ?\Symfony\Component\HttpKernel\KernelInterface $kernel = null; /** * Fetch the required contexts. * - * @param \Behat\Behat\Hook\Scope\BeforeScenarioScope $scope * * @BeforeScenario */ - public function gatherContexts(BeforeScenarioScope $scope) + public function gatherContexts(BeforeScenarioScope $scope): void { $environment = $scope->getEnvironment(); @@ -57,11 +56,10 @@ public function gatherContexts(BeforeScenarioScope $scope) /** * This will print the failed html result. * - * @param \Behat\Behat\Hook\Scope\AfterStepScope $scope * * @AfterStep */ - public function dumpInfoAfterFailedStep(AfterStepScope $scope) + public function dumpInfoAfterFailedStep(AfterStepScope $scope): void { if ($this->stepIsSuccessful($scope)) { return; @@ -79,7 +77,7 @@ public function dumpInfoAfterFailedStep(AfterStepScope $scope) $this->saveErrorFile($scope, $filename); $this->takeScreenShotAfterFailedStep($filename); - } catch (DriverException $exception) { + } catch (DriverException) { return; } } @@ -91,7 +89,7 @@ public function dumpInfoAfterFailedStep(AfterStepScope $scope) * * @throws \Behat\Mink\Exception\DriverException */ - private function takeScreenShotAfterFailedStep($fileName) + private function takeScreenShotAfterFailedStep(string|array|null $fileName): void { $session = $this->minkContext->getSession(); if (!($session->getDriver() instanceof Selenium2Driver)) { @@ -109,10 +107,9 @@ private function takeScreenShotAfterFailedStep($fileName) /** * Save the page result file to disk. * - * @param \Behat\Behat\Hook\Scope\AfterStepScope $scope * @param string $fileName */ - private function saveErrorFile(AfterStepScope $scope, $fileName) + private function saveErrorFile(AfterStepScope $scope, string|array|null $fileName): void { $session = $this->minkContext->getSession(); $content = <<< TEXT @@ -135,7 +132,7 @@ private function saveErrorFile(AfterStepScope $scope, $fileName) * @return bool * TRUE if it is successfully. */ - private function stepIsSuccessful(AfterStepScope $scope) + private function stepIsSuccessful(AfterStepScope $scope): bool { return $scope->getTestResult()->getResultCode() !== TestResult::FAILED; } @@ -143,7 +140,6 @@ private function stepIsSuccessful(AfterStepScope $scope) /** * Returns the scenaro for a given step. * - * @param \Behat\Behat\Hook\Scope\StepScope $scope * * @return \Behat\Gherkin\Node\ScenarioInterface */ @@ -166,7 +162,6 @@ private function getScenario(StepScope $scope) /** * Returns the scenario for a given step. * - * @param \Behat\Behat\Hook\Scope\StepScope $scope * * @return \Behat\Gherkin\Node\NodeInterface|null */ @@ -184,7 +179,7 @@ private function getBackGroundStep(StepScope $scope) return null; } - private function getOutputPath() + private function getOutputPath(): string { $root = $this->kernel->getProjectDir(); return implode(DIRECTORY_SEPARATOR, [$root, 'var', 'log']); @@ -192,10 +187,8 @@ private function getOutputPath() /** * Sets Kernel instance. - * - * @param KernelInterface $kernel */ - public function setKernel(KernelInterface $kernel) + public function setKernel(KernelInterface $kernel): void { $this->kernel = $kernel; } diff --git a/src/Features/Context/TiqrContext.php b/src/Features/Context/TiqrContext.php index 9225311d..df8360bb 100644 --- a/src/Features/Context/TiqrContext.php +++ b/src/Features/Context/TiqrContext.php @@ -80,15 +80,16 @@ class TiqrContext implements Context, KernelAwareContext * @var Response */ protected $authenticatioResponse; + public function __construct(private \App\Tiqr\TiqrUserRepositoryInterface $tiqrUserRepository, private \App\Tiqr\TiqrConfigurationInterface $tiqrConfiguration, private \Dev\FileLogger $fileLogger) + { + } /** * Sets HttpKernel instance. * This method will be automatically called by Symfony2Extension * ContextInitializer. - * - * @param KernelInterface $kernel */ - public function setKernel(KernelInterface $kernel) + public function setKernel(KernelInterface $kernel): void { $this->kernel = $kernel; } @@ -98,7 +99,7 @@ public function setKernel(KernelInterface $kernel) * * @BeforeScenario */ - public function gatherContexts(BeforeScenarioScope $scope) + public function gatherContexts(BeforeScenarioScope $scope): void { $environment = $scope->getEnvironment(); $this->minkContext = $environment->getContext(MinkContext::class); @@ -110,7 +111,7 @@ public function gatherContexts(BeforeScenarioScope $scope) * * @BeforeScenario */ - public function restore(BeforeScenarioScope $scope) + public function restore(BeforeScenarioScope $scope): void { $this->userAgent = 'Behat UA'; } @@ -125,7 +126,7 @@ public function restore(BeforeScenarioScope $scope) * @throws \Surfnet\SamlBundle\Exception\NotFound * @throws \Assert\AssertionFailedException */ - public function theRegistrationQrCodeIsScanned() + public function theRegistrationQrCodeIsScanned(): void { /** @var Client $client */ $this->minkContext->visitPath('/registration/qr/link'); @@ -146,10 +147,10 @@ public function theRegistrationQrCodeIsScanned() * @throws \Surfnet\SamlBundle\Exception\NotFound * @throws \Assert\AssertionFailedException */ - public function theAuthenticationQrCodeIsScanned() + public function theAuthenticationQrCodeIsScanned(): void { /** @var Client $client */ - $this->minkContext->visitPath('/authentication/qr/' . urlencode($this->metadata->identity->identifier) . '/link'); + $this->minkContext->visitPath('/authentication/qr/' . urlencode((string) $this->metadata->identity->identifier) . '/link'); // Should start with tiqrenroll:// $content = $this->minkContext->getMink()->getSession()->getPage()->getText(); Assertion::startsWith($content, 'tiqrauth://'); @@ -162,14 +163,12 @@ public function theAuthenticationQrCodeIsScanned() * * @When the user registers the service with notification type :notificationType address: :notificationAddress * @When the user registers the service - * @param string $notificationType - * @param string $notificationAddress * @throws \Assert\AssertionFailedException */ public function userRegisterTheService( string $notificationType = '', string $notificationAddress = '' - ) { + ): void { $this->notificationType = $notificationType; $this->notificationAddress = $notificationAddress; $this->minkContext->visitPath($this->metadataUrl); @@ -204,10 +203,8 @@ public function userRegisterTheService( /** * @Given the mobile tiqr app identifies itself with the user agent :userAgent - * - * @param string $userAgent */ - public function mobileAppUsesUserAgent(string $userAgent) + public function mobileAppUsesUserAgent(string $userAgent): void { $this->userAgent = $userAgent; } @@ -217,16 +214,14 @@ public function mobileAppUsesUserAgent(string $userAgent) * * @When the app authenticates to the service with notification type :notificationType address: :notificationAddress * @When the app authenticates to the service - * @param string $notificationType - * @param string $notificationAddress * @throws \Exception */ public function appAuthenticates( string $notificationType = '', string $notificationAddress = '' - ) { - list($serviceId, $session, $challenge, $sp, $version) = explode('/', $this->authenticationUrl); - list($userId, $serviceId) = explode('@', $serviceId); + ): void { + [$serviceId, $session, $challenge, $sp, $version] = explode('/', $this->authenticationUrl); + [$userId, $serviceId] = explode('@', $serviceId); $service = (array)$this->metadata->service; $authenticationUrl = $service['authenticationUrl']; $ocraSuite = $service['ocraSuite']; @@ -242,10 +237,10 @@ public function appAuthenticates( 'notificationAddress' => $notificationAddress, ]; // Internal request does not like an absolute path. - $authenticationUrl = str_replace('https://tiqr.stepup.example.com', '', $authenticationUrl); + $authenticationUrl = str_replace('https://tiqr.stepup.example.com', '', (string) $authenticationUrl); $this->authenticatioResponse = $this->kernel->handle( - Request::create($authenticationUrl, 'POST', $authenticationBody) + Request::create($authenticationUrl, \Symfony\Component\HttpFoundation\Request::METHOD_POST, $authenticationBody) ); } @@ -253,14 +248,12 @@ public function appAuthenticates( * This does the app authentication logic. * * @When the app authenticates to the service with wrong password - * @param string $notificationType - * @param string $notificationAddress * @throws \Exception */ public function appAuthenticatesWithWrongPassword( - $notificationType = '', - $notificationAddress = '' - ) { + string $notificationType = '', + string $notificationAddress = '' + ): void { $secret = $this->clientSecret; // We scramble the secret key, normally the user does this with his password $this->clientSecret = $this->createClientSecret(); @@ -274,7 +267,7 @@ public function appAuthenticatesWithWrongPassword( * @throws \Assert\AssertionFailedException * @throws \Exception */ - public function userRegisteredWithWrongUserAgent() + public function userRegisteredWithWrongUserAgent(): void { $resultBody = $this->minkContext->getMink()->getSession()->getPage()->getContent(); Assertion::eq( @@ -293,7 +286,7 @@ public function userRegisteredWithWrongUserAgent() * @throws \Assert\AssertionFailedException * @throws \Exception */ - public function userRegisterTheServiceWithSameQr() + public function userRegisterTheServiceWithSameQr(): void { // The first registration attempt should succeed. $resultBody = $this->minkContext->getMink()->getSession()->getPage()->getContent(); @@ -316,13 +309,13 @@ public function userRegisterTheServiceWithSameQr() * @throws \App\Tiqr\Exception\UserNotExistsException * @throws \Assert\AssertionFailedException */ - public function weHaveARegisteredUser() + public function weHaveARegisteredUser(): void { $resultBody = $this->minkContext->getMink()->getSession()->getPage()->getContent(); Assertion::eq($resultBody, 'OK', 'Enrollment failed'); /** @var TiqrUserRepositoryInterface $userRepository */ - $userRepository = $this->kernel->getContainer()->get(TiqrUserRepositoryInterface::class); + $userRepository = $this->tiqrUserRepository; // we have a registered user $user = $userRepository->getUser($this->metadata->identity->identifier); Assertion::eq($user->getSecret(), $this->clientSecret); @@ -334,7 +327,7 @@ public function weHaveARegisteredUser() * * @throws \Assert\AssertionFailedException */ - public function weHaveAAuthenticatedUser() + public function weHaveAAuthenticatedUser(): void { Assertion::eq("OK", $this->authenticatioResponse->getContent()); Assertion::eq($this->authenticatioResponse->getStatusCode(), 200); @@ -345,7 +338,7 @@ public function weHaveAAuthenticatedUser() * * @throws \Assert\AssertionFailedException */ - public function weHaveTheAuthenticationError($error) + public function weHaveTheAuthenticationError($error): void { Assertion::eq($error, $this->authenticatioResponse->getContent()); Assertion::eq($this->authenticatioResponse->getStatusCode(), Response::HTTP_FORBIDDEN); @@ -353,14 +346,13 @@ public function weHaveTheAuthenticationError($error) /** * @Given tiqr users is permanently blocked after :attempts attempts - * @param int $attempts * @throws \Assert\AssertionFailedException */ - public function tiqrUserIsPermentlyBlockedConfiguration($attempts) + public function tiqrUserIsPermentlyBlockedConfiguration(int $attempts): void { $container = $this->kernel->getContainer(); /** @var TiqrConfiguration $config */ - $config = $container->get(TiqrConfigurationInterface::class); + $config = $this->tiqrConfiguration; $config->setMaxLoginAttempts($attempts); } @@ -368,7 +360,7 @@ public function tiqrUserIsPermentlyBlockedConfiguration($attempts) * * @return string */ - private function createClientSecret() + private function createClientSecret(): string { return bin2hex(openssl_random_pseudo_bytes(32)); } @@ -381,7 +373,7 @@ private function createClientSecret() * @throws \Assert\AssertionFailedException * @throws \GuzzleHttp\Exception\GuzzleException */ - public function iScanTheTiqrRegistrationQrcode() + public function iScanTheTiqrRegistrationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); /** @var Client $client */ @@ -404,7 +396,7 @@ public function iScanTheTiqrRegistrationQrcode() * @throws \Assert\AssertionFailedException * @throws \GuzzleHttp\Exception\GuzzleException */ - public function iClickTheTiqrRegistrationQrcode() + public function iClickTheTiqrRegistrationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); /** @var Client $client */ @@ -421,7 +413,7 @@ public function iClickTheTiqrRegistrationQrcode() * @throws \Assert\AssertionFailedException * @throws \GuzzleHttp\Exception\GuzzleException */ - public function iScanTheTiqrAuthenticationQrcode() + public function iScanTheTiqrAuthenticationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); /** @var Client $client */ @@ -438,10 +430,10 @@ public function iScanTheTiqrAuthenticationQrcode() /** * @When /^I clear the logs$/ */ - public function clearTheLogs() + public function clearTheLogs(): void { /** @var FileLogger $logger */ - $logger = $this->kernel->getContainer()->get(FileLogger::class); + $logger = $this->fileLogger; $logger->cleanLogs(); } @@ -451,18 +443,18 @@ public function clearTheLogs() * @throws \Assert\AssertionFailedException * @throws \Exception */ - public function theLogsAre(TableNode $table) + public function theLogsAre(TableNode $table): void { /** @var FileLogger $logger */ - $logger = $this->kernel->getContainer()->get(FileLogger::class); + $logger = $this->fileLogger; $logs = $logger->cleanLogs(); $rows = array_values($table->getColumnsHash()); try { foreach ($rows as $index => $row) { Assertion::true(isset($logs[$index]), sprintf('Missing message %s', $row['message'])); - list($level, $message, $context) = $logs[$index]; - if (preg_match('/^\/.*\/$/', $row['message']) === 1) { + [$level, $message, $context] = $logs[$index]; + if (preg_match('/^\/.*\/$/', (string) $row['message']) === 1) { Assertion::regex($message, $row['message']); } else { Assertion::eq($message, $row['message'], @@ -490,16 +482,14 @@ public function theLogsAre(TableNode $table) $logs = array_slice($logs, count($rows)); Assertion::noContent($logs, var_export($logs, true)); } catch (AssertionFailedException $exception) { - $yml = implode(PHP_EOL, array_map(function ($log) { - return sprintf( - '| %s | %s | %s |', - $log[0], - $log[1], - isset($log[2]['sari']) ? 'present' : '' - ); - }, $logs)); - - throw new \Exception($exception->getMessage() . PHP_EOL . $yml); + $yml = implode(PHP_EOL, array_map(fn($log): string => sprintf( + '| %s | %s | %s |', + $log[0], + $log[1], + isset($log[2]['sari']) ? 'present' : '' + ), $logs)); + + throw new \Exception($exception->getMessage() . PHP_EOL . $yml, $exception->getCode(), $exception); } } @@ -513,7 +503,7 @@ public function theLogsAre(TableNode $table) * @return string * @throws \GuzzleHttp\Exception\GuzzleException */ - private function getFileContentsInsecure($src) + private function getFileContentsInsecure($src): string|false { $session = $this->minkContext->getMink()->getSession(); $driver = $session->getDriver(); @@ -528,7 +518,7 @@ private function getFileContentsInsecure($src) /** * @Given I fill in :field with my identifier */ - public function iFillInWithMyIdentifier($field) + public function iFillInWithMyIdentifier($field): void { $this->minkContext->fillField($field, $this->metadata->identity->identifier); } @@ -536,9 +526,9 @@ public function iFillInWithMyIdentifier($field) /** * @Given I fill in :field with my one time password and press ok */ - public function iFillInWithMyOTP($field) + public function iFillInWithMyOTP($field): void { - list($serviceId, $session, $challenge) = explode('/', $this->authenticationUrl); + [$serviceId, $session, $challenge] = explode('/', $this->authenticationUrl); $service = (array)$this->metadata->service; $ocraSuite = $service['ocraSuite']; $response = \OCRA::generateOCRA($ocraSuite, $this->clientSecret, '', $challenge, '', $session, ''); diff --git a/src/Features/Context/WebContext.php b/src/Features/Context/WebContext.php index 38af992a..f280ed63 100644 --- a/src/Features/Context/WebContext.php +++ b/src/Features/Context/WebContext.php @@ -54,10 +54,8 @@ class WebContext implements Context, KernelAwareContext * Sets HttpKernel instance. * This method will be automatically called by Symfony2Extension * ContextInitializer. - * - * @param KernelInterface $kernel */ - public function setKernel(KernelInterface $kernel) + public function setKernel(KernelInterface $kernel): void { $this->kernel = $kernel; } @@ -67,7 +65,7 @@ public function setKernel(KernelInterface $kernel) * * @BeforeScenario */ - public function gatherContexts(BeforeScenarioScope $scope) + public function gatherContexts(BeforeScenarioScope $scope): void { $environment = $scope->getEnvironment(); $this->minkContext = $environment->getContext(MinkContext::class); @@ -78,7 +76,7 @@ public function gatherContexts(BeforeScenarioScope $scope) * * @BeforeScenario @remote */ - public function setGoutteDriver() + public function setGoutteDriver(): void { $this->previousMinkSession = $this->minkContext->getMink()->getDefaultSessionName(); $this->minkContext->getMink()->setDefaultSessionName('goutte'); @@ -89,7 +87,7 @@ public function setGoutteDriver() * * @AfterScenario @remote */ - public function resetGoutteDriver() + public function resetGoutteDriver(): void { $this->minkContext->getMink()->setDefaultSessionName($this->previousMinkSession); } @@ -126,7 +124,7 @@ public function getServiceProvider() * * @throws \Exception */ - public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider() + public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider(): void { $authnRequest = new AuthnRequest(); $authnRequest->setAssertionConsumerServiceURL('https://service_provider_unkown/saml/acs'); @@ -145,11 +143,10 @@ public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider() } /** - * @param PrivateKey $key * @return XMLSecurityKey * @throws \Exception */ - private static function loadPrivateKey(PrivateKey $key) + private function loadPrivateKey(PrivateKey $key): \RobRichards\XMLSecLibs\XMLSecurityKey { $keyLoader = new PrivateKeyLoader(); $privateKey = $keyLoader->loadPrivateKey($key); diff --git a/src/GlobalViewParameters.php b/src/GlobalViewParameters.php index 2d153e0b..e4cd0a33 100644 --- a/src/GlobalViewParameters.php +++ b/src/GlobalViewParameters.php @@ -24,31 +24,8 @@ final class GlobalViewParameters { - /** - * @var TranslatorInterface - */ - private $translator; - - /** - * @var string[] - */ - private $locales; - - /** - * @var string[] - */ - private $supportUrl; - - /** - * @param TranslatorInterface $translator - * @param array $locales - * @param array $supportUrl - */ - public function __construct(TranslatorInterface $translator, array $locales, array $supportUrl) + public function __construct(private readonly TranslatorInterface $translator, private readonly array $locales, private array $supportUrl) { - $this->translator = $translator; - $this->locales = $locales; - $this->supportUrl = $supportUrl; } /** diff --git a/src/Kernel.php b/src/Kernel.php index 24a66cc7..006a522d 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -22,6 +22,7 @@ use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel as BaseKernel; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; use Symfony\Component\Routing\RouteCollectionBuilder; class Kernel extends BaseKernel @@ -57,12 +58,12 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); } - protected function configureRoutes(RouteCollectionBuilder $routes): void + protected function configureRoutes(RoutingConfigurator $routes): void { $confDir = $this->getProjectDir().'/config'; - $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, 'glob'); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, 'glob'); } } diff --git a/src/Service/ErrorPageHelper.php b/src/Service/ErrorPageHelper.php new file mode 100644 index 00000000..0a216db0 --- /dev/null +++ b/src/Service/ErrorPageHelper.php @@ -0,0 +1,51 @@ + + */ + public function generateMetadata(Request $request): array + { + $timestamp = (new DateTime)->format(DateTimeInterface::ATOM); + $hostname = $request->getHost(); + $userAgent = $request->headers->get('User-Agent'); + $ipAddress = $request->getClientIp(); + return [ + 'timestamp' => $timestamp, + 'hostname' => $hostname, + 'request_id' => $this->requestId->get(), + 'user_agent' => $userAgent, + 'ip_address' => $ipAddress, + ]; + } +} diff --git a/src/Service/GlobalViewParameters.php b/src/Service/GlobalViewParameters.php index f7663e59..bb5e268f 100644 --- a/src/Service/GlobalViewParameters.php +++ b/src/Service/GlobalViewParameters.php @@ -27,26 +27,12 @@ final class GlobalViewParameters */ private $translator; - /** - * @var string[] - */ - private $locales; - - /** - * @var string[] - */ - private $supportUrl; - /** * @param TranslatorInterface $translator - * @param array $locales - * @param array $supportUrl */ - public function __construct(TranslatorInterface $translator, array $locales, array $supportUrl) + public function __construct(TranslatorInterface $translator, private readonly array $locales, private array $supportUrl) { $this->translator = $translator; - $this->locales = $locales; - $this->supportUrl = $supportUrl; } /** diff --git a/src/Service/UserAgentMatcher.php b/src/Service/UserAgentMatcher.php index eabf62cd..e9ceb72d 100644 --- a/src/Service/UserAgentMatcher.php +++ b/src/Service/UserAgentMatcher.php @@ -22,24 +22,18 @@ final class UserAgentMatcher implements UserAgentMatcherInterface { - /** - * @var string - */ - private $pattern; - /** * @param string $pattern */ - public function __construct($pattern) + public function __construct(private $pattern) { - $this->pattern = $pattern; } /** * @param Request $request * @return bool */ - public function isOfficialTiqrMobileApp(Request $request) + public function isOfficialTiqrMobileApp(Request $request): int|false { $userAgent = $request->headers->get('User-Agent'); diff --git a/src/Tiqr/AuthenticationRateLimitService.php b/src/Tiqr/AuthenticationRateLimitService.php index 70bef7bf..13a0f45c 100644 --- a/src/Tiqr/AuthenticationRateLimitService.php +++ b/src/Tiqr/AuthenticationRateLimitService.php @@ -30,27 +30,14 @@ /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -final class AuthenticationRateLimitService implements AuthenticationRateLimitServiceInterface +final readonly class AuthenticationRateLimitService implements AuthenticationRateLimitServiceInterface { - private $tiqrService; - private $configuration; - private $logger; - /** * - * @param TiqrServiceInterface $tiqrService - * @param TiqrConfigurationInterface $configuration - * @param LoggerInterface $logger * @throws \Exception */ - public function __construct( - TiqrServiceInterface $tiqrService, - TiqrConfigurationInterface $configuration, - LoggerInterface $logger - ) { - $this->tiqrService = $tiqrService; - $this->configuration = $configuration; - $this->logger = $logger; + public function __construct(private TiqrServiceInterface $tiqrService, private TiqrConfigurationInterface $configuration, private LoggerInterface $logger) + { } /** @@ -128,9 +115,6 @@ public function authenticate(string $sessionKey, TiqrUserInterface $user, string } /** - * @param LoggerInterface $logger - * @param AuthenticationResponse $result - * @param TiqrUserInterface $user * * @return AuthenticationResponse * @throws Exception\ConfigurationException @@ -175,7 +159,7 @@ private function handleAuthenticationRejectResponse( $now = new \DateTimeImmutable(); // Just block the user temporarily if we don't got a limit. - if (!$this->configuration->hasMaxTemporarilyLoginAttempts()) { + if ($this->configuration->hasMaxTemporarilyLoginAttempts() === 0) { $user->blockTemporarily($now); $logger->notice('Increase temporarily block attempt'); diff --git a/src/Tiqr/AuthenticationRateLimitServiceInterface.php b/src/Tiqr/AuthenticationRateLimitServiceInterface.php index fd39fc47..3c6d7560 100644 --- a/src/Tiqr/AuthenticationRateLimitServiceInterface.php +++ b/src/Tiqr/AuthenticationRateLimitServiceInterface.php @@ -22,18 +22,14 @@ interface AuthenticationRateLimitServiceInterface { /** - * @param string $sessionKey - * @param TiqrUserInterface $user * @param string $response * The one time password. - * * @return AuthenticationResponse * @throws \Exception */ public function authenticate(string $sessionKey, TiqrUserInterface $user, string $response): AuthenticationResponse; /** - * @param TiqrUserInterface $user * * @return bool * @throws \Exception @@ -41,7 +37,6 @@ public function authenticate(string $sessionKey, TiqrUserInterface $user, string public function isBlockedPermanently(TiqrUserInterface $user): bool; /** - * @param TiqrUserInterface $user * * @return bool * @throws \Exception diff --git a/src/Tiqr/Exception/ConfigurationException.php b/src/Tiqr/Exception/ConfigurationException.php index c5535a00..17d84e82 100644 --- a/src/Tiqr/Exception/ConfigurationException.php +++ b/src/Tiqr/Exception/ConfigurationException.php @@ -19,17 +19,17 @@ final class ConfigurationException extends \Exception { - public static function noMaximumDuration() + public static function noMaximumDuration(): self { return new self('There is no maximum duration to block an user'); } - public static function noMaxAttempts() + public static function noMaxAttempts(): self { return new self('An user can have unlimited attempts'); } - public static function noMaxTemporarilyAttempts() + public static function noMaxTemporarilyAttempts(): self { return new self('An user can have unlimited temporarily block attempts'); } diff --git a/src/Tiqr/Exception/UserNotExistsException.php b/src/Tiqr/Exception/UserNotExistsException.php index 3cda458c..84bcb85e 100644 --- a/src/Tiqr/Exception/UserNotExistsException.php +++ b/src/Tiqr/Exception/UserNotExistsException.php @@ -19,7 +19,7 @@ final class UserNotExistsException extends \Exception { - public static function createFromId($userId) + public static function createFromId($userId): self { return new self(sprintf('User with id "%s"', $userId)); } diff --git a/src/Tiqr/Legacy/TiqrService.php b/src/Tiqr/Legacy/TiqrService.php index 5ffe8275..c5e54937 100644 --- a/src/Tiqr/Legacy/TiqrService.php +++ b/src/Tiqr/Legacy/TiqrService.php @@ -26,6 +26,7 @@ use App\Tiqr\TiqrUserInterface; use Exception; use Psr\Log\LoggerInterface; +use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\StreamedResponse; use Tiqr_Service; @@ -39,32 +40,17 @@ */ final class TiqrService implements TiqrServiceInterface { - const ENROLL_KEYS_SESSION_NAME = 'enrollment-session-keys'; - /** - * @var \Tiqr_Service - */ - private $tiqrService; - private $tiqrStateStorage; - private $session; - private $logger; - - /** - * @var string - */ - private $accountName; + public const ENROLL_KEYS_SESSION_NAME = 'enrollment-session-keys'; + private SessionInterface $session; public function __construct( - Tiqr_Service $tiqrService, - Tiqr_StateStorage_StateStorageInterface $tiqrStateStorage, - SessionInterface $session, - LoggerInterface $logger, - $accountName + private readonly Tiqr_Service $tiqrService, + private readonly Tiqr_StateStorage_StateStorageInterface $tiqrStateStorage, + private readonly RequestStack $requestStack, + private readonly LoggerInterface $logger, + private readonly string $appSecret, + private readonly string $accountName ) { - $this->tiqrService = $tiqrService; - $this->tiqrStateStorage = $tiqrStateStorage; - $this->session = $session; - $this->logger = $logger; - $this->accountName = $accountName; } /** @@ -73,7 +59,7 @@ public function __construct( public function createRegistrationQRResponse(string $metadataURL): StreamedResponse { try { - return new StreamedResponse(function () use ($metadataURL) { + return new StreamedResponse(function () use ($metadataURL): void { $this->tiqrService->generateEnrollmentQR($metadataURL); }); } catch (Exception $e) { @@ -101,6 +87,8 @@ public function getEnrollmentSecret(string $enrollmentKey, string $sari): string */ public function generateEnrollmentKey(string $sari): string { + $this->initSession(); + $this->logger->debug('Generating userId'); $userId = $this->generateId(); $this->logger->debug('Storing the userId to session state'); @@ -130,6 +118,7 @@ public function generateEnrollmentKey(string $sari): string */ private function storeEnrollmentKey(string $key): void { + $this->initSession(); $keys = []; if ($this->session->has(self::ENROLL_KEYS_SESSION_NAME)) { $keys = $this->session->get(self::ENROLL_KEYS_SESSION_NAME); @@ -182,6 +171,7 @@ public function finalizeEnrollment(string $enrollmentSecret): void */ public function startAuthentication(string $userId, string $sari): string { + $this->initSession(); try { $sessionKey = $this->tiqrService->startAuthenticationSession($userId, $this->session->getId()); $this->session->set('sessionKey', $sessionKey); @@ -200,6 +190,7 @@ public function startAuthentication(string $userId, string $sari): string */ public function isAuthenticated(): bool { + $this->initSession(); return $this->tiqrService->getAuthenticatedUser($this->session->getId()) !== null; } @@ -214,7 +205,7 @@ public function createAuthenticationQRResponse(): StreamedResponse { $sessionKey = $this->getAuthenticationSessionKey(); try { - return new StreamedResponse(function () use ($sessionKey) { + return new StreamedResponse(function () use ($sessionKey): void { $this->tiqrService->generateAuthQR($sessionKey); }); } catch (Exception $e) { @@ -247,20 +238,14 @@ public function authenticate(TiqrUserInterface $user, string $response, string $ { try { $result = $this->tiqrService->authenticate($user->getId(), $user->getSecret(), $sessionKey, $response); - switch ($result) { - case Tiqr_Service::AUTH_RESULT_AUTHENTICATED: - return new ValidAuthenticationResponse('OK'); - case Tiqr_Service::AUTH_RESULT_INVALID_CHALLENGE: - return new AuthenticationErrorResponse('INVALID_CHALLENGE'); - case Tiqr_Service::AUTH_RESULT_INVALID_REQUEST: - return new AuthenticationErrorResponse('INVALID_REQUEST'); - case Tiqr_Service::AUTH_RESULT_INVALID_RESPONSE: - return new RejectedAuthenticationResponse('INVALID_RESPONSE'); - case Tiqr_Service::AUTH_RESULT_INVALID_USERID: - return new AuthenticationErrorResponse('INVALID_USER'); - default: - return new AuthenticationErrorResponse('ERROR'); - } + return match ($result) { + Tiqr_Service::AUTH_RESULT_AUTHENTICATED => new ValidAuthenticationResponse('OK'), + Tiqr_Service::AUTH_RESULT_INVALID_CHALLENGE => new AuthenticationErrorResponse('INVALID_CHALLENGE'), + Tiqr_Service::AUTH_RESULT_INVALID_REQUEST => new AuthenticationErrorResponse('INVALID_REQUEST'), + Tiqr_Service::AUTH_RESULT_INVALID_RESPONSE => new RejectedAuthenticationResponse('INVALID_RESPONSE'), + Tiqr_Service::AUTH_RESULT_INVALID_USERID => new AuthenticationErrorResponse('INVALID_USER'), + default => new AuthenticationErrorResponse('ERROR'), + }; } catch (Exception $e) { $this->logger->error( sprintf('Error authenticating user "%s": %s', $user->getId(), $e->getMessage()) @@ -275,6 +260,7 @@ public function authenticate(TiqrUserInterface $user, string $response, string $ */ public function getEnrollmentStatus(): int { + $this->initSession(); try { return $this->tiqrService->getEnrollmentStatus($this->session->getId()); } catch (Exception $e) { @@ -299,6 +285,7 @@ public function enrollmentFinalized(): bool */ public function getUserId(): string { + $this->initSession(); return $this->session->get('userId'); } @@ -307,6 +294,7 @@ public function getUserId(): string */ public function getAuthenticationSessionKey(): string { + $this->initSession(); return $this->session->get('sessionKey'); } @@ -329,29 +317,25 @@ public function sendNotification(string $notificationType, string $notificationA ////////// // Private - /** * Currently the legacy way to generate the user Tiqr id. * * TODO:maybe use something like UUID? * - * @param int $length * * @return string */ private function generateId(int $length = 4): string { - return base_convert(time(), 10, 36) . '-' . base_convert(mt_rand(0, pow(36, $length)), 10, 36); + return base_convert(time(), 10, 36) . '-' . base_convert(mt_rand(0, 36 ** $length), 10, 36); } /** Create a stable hash from $identifier - * @param string $identifier * @return string The hashed version of $identifier */ private function getHashedIdentifier(string $identifier): string { - // TODO: Use Symfony configuration system instead of accessing $_ENV directly - return hash_hmac('sha256', $identifier, $_ENV['APP_SECRET']); + return hash_hmac('sha256', $identifier, $this->appSecret); } public function getSariForSessionIdentifier(string $identifier): string @@ -359,7 +343,7 @@ public function getSariForSessionIdentifier(string $identifier): string try { $hashed_identifier = $this->getHashedIdentifier($identifier); $res = $this->tiqrStateStorage->getValue('sari_' . $hashed_identifier); - } catch (Exception $e) { + } catch (Exception) { $this->logger->error(sprintf('Error getting SARI for identifier "%s"', substr($identifier, 0, 8))); return ''; } @@ -385,7 +369,7 @@ private function unsetSariForSessionIdentifier(string $identifier): bool try { $hashed_identifier = $this->getHashedIdentifier($identifier); $this->tiqrStateStorage->unsetValue('sari_' . $hashed_identifier); - } catch (Exception $e) { + } catch (Exception) { $this->logger->error( sprintf('unsetSariForSessionIdentifier failed for "%s"', substr($identifier, 0, 8)) ); @@ -436,6 +420,8 @@ private function setSariForSessionIdentifier(string $identifier, string $sari): */ private function clearPreviousEnrollmentState(): void { + $this->initSession(); + $keys = []; if ($this->session->has(self::ENROLL_KEYS_SESSION_NAME)) { $keys = $this->session->get(self::ENROLL_KEYS_SESSION_NAME); @@ -456,4 +442,9 @@ private function clearPreviousEnrollmentState(): void $this->session->set(self::ENROLL_KEYS_SESSION_NAME, $keys); } + + private function initSession(): void + { + $this->session = $this->requestStack->getSession(); + } } diff --git a/src/Tiqr/Legacy/TiqrUser.php b/src/Tiqr/Legacy/TiqrUser.php index c09718a3..bccddbf2 100644 --- a/src/Tiqr/Legacy/TiqrUser.php +++ b/src/Tiqr/Legacy/TiqrUser.php @@ -33,28 +33,17 @@ class TiqrUser implements TiqrUserInterface { /** - * @var Tiqr_UserStorage_Interface + * @param string $userId */ - private $userStorage; - - /** - * @var Tiqr_UserSecretStorage_Interface - */ - private $userSecretStorage; - - /** - * @var string The userId - */ - private $userId; - public function __construct( - Tiqr_UserStorage_Interface $userStorage, - Tiqr_UserSecretStorage_Interface $userSecretStorage, - $userId - ) { - $this->userStorage = $userStorage; - $this->userSecretStorage = $userSecretStorage; - $this->userId = $userId; + private readonly Tiqr_UserStorage_Interface $userStorage, + private readonly Tiqr_UserSecretStorage_Interface $userSecretStorage, + /** + * @var string The userId + */ + private $userId + ) + { } /** diff --git a/src/Tiqr/Legacy/TiqrUserRepository.php b/src/Tiqr/Legacy/TiqrUserRepository.php index be74701c..0f7b2f43 100644 --- a/src/Tiqr/Legacy/TiqrUserRepository.php +++ b/src/Tiqr/Legacy/TiqrUserRepository.php @@ -27,24 +27,10 @@ /** * Wrapper around the legacy Tiqr user repository. */ -final class TiqrUserRepository implements TiqrUserRepositoryInterface +final readonly class TiqrUserRepository implements TiqrUserRepositoryInterface { - /** - * @var \Tiqr_UserStorage_Interface - */ - private $userStorage; - - /** - * @var \Tiqr_UserSecretStorage_Interface - */ - private $userSecretStorage; - - public function __construct( - Tiqr_UserStorage_Interface $userStorage, - Tiqr_UserSecretStorage_Interface $userSecretStorage - ) { - $this->userStorage = $userStorage; - $this->userSecretStorage = $userSecretStorage; + public function __construct(private Tiqr_UserStorage_Interface $userStorage, private Tiqr_UserSecretStorage_Interface $userSecretStorage) + { } /** diff --git a/src/Tiqr/Response/AuthenticationErrorResponse.php b/src/Tiqr/Response/AuthenticationErrorResponse.php index 08767cca..01f46a11 100644 --- a/src/Tiqr/Response/AuthenticationErrorResponse.php +++ b/src/Tiqr/Response/AuthenticationErrorResponse.php @@ -22,15 +22,9 @@ */ class AuthenticationErrorResponse implements AuthenticationResponse { - private $error; - - /** - * - * @param string $error - */ - public function __construct(string $error) + + public function __construct(private readonly string $error) { - $this->error = $error; } /** diff --git a/src/Tiqr/Response/RateLimitedAuthenticationResponse.php b/src/Tiqr/Response/RateLimitedAuthenticationResponse.php index c195e221..2f78b0f4 100644 --- a/src/Tiqr/Response/RateLimitedAuthenticationResponse.php +++ b/src/Tiqr/Response/RateLimitedAuthenticationResponse.php @@ -20,21 +20,10 @@ /** * */ -final class RateLimitedAuthenticationResponse implements AuthenticationResponse +final readonly class RateLimitedAuthenticationResponse implements AuthenticationResponse { - /** - * @var AuthenticationResponse - */ - private $response; - /** - * @var int - */ - private $attemptsLeft; - - public function __construct(AuthenticationResponse $response, int $attemptsLeft) + public function __construct(private AuthenticationResponse $response, private int $attemptsLeft) { - $this->response = $response; - $this->attemptsLeft = $attemptsLeft; } /** diff --git a/src/Tiqr/Response/RejectedAuthenticationResponse.php b/src/Tiqr/Response/RejectedAuthenticationResponse.php index 6496f1b2..0a8c3a1a 100644 --- a/src/Tiqr/Response/RejectedAuthenticationResponse.php +++ b/src/Tiqr/Response/RejectedAuthenticationResponse.php @@ -22,11 +22,8 @@ */ class RejectedAuthenticationResponse implements AuthenticationResponse { - private $error; - - public function __construct(string $error) + public function __construct(private readonly string $error) { - $this->error = $error; } /** diff --git a/src/Tiqr/Response/ValidAuthenticationResponse.php b/src/Tiqr/Response/ValidAuthenticationResponse.php index b337de43..48286d21 100644 --- a/src/Tiqr/Response/ValidAuthenticationResponse.php +++ b/src/Tiqr/Response/ValidAuthenticationResponse.php @@ -19,15 +19,9 @@ class ValidAuthenticationResponse implements AuthenticationResponse { - private $message; - - /** - * - * @param string $message - */ - public function __construct(string $message) + + public function __construct(private readonly string $message) { - $this->message = $message; } /** diff --git a/src/Tiqr/TiqrConfiguration.php b/src/Tiqr/TiqrConfiguration.php index d7aa540b..994c15d0 100644 --- a/src/Tiqr/TiqrConfiguration.php +++ b/src/Tiqr/TiqrConfiguration.php @@ -24,9 +24,9 @@ class TiqrConfiguration implements TiqrConfigurationInterface { private $options = []; - const TEMPORARILY_BLOCK_DURATION = 'temporarilyBlockDuration'; - const MAX_ATTEMPTS = 'maxAttempts'; - const MAX_TEMPORARILY_BLOCKS = 'maxTemporarilyBlocks'; + final public const TEMPORARILY_BLOCK_DURATION = 'temporarilyBlockDuration'; + final public const MAX_ATTEMPTS = 'maxAttempts'; + final public const MAX_TEMPORARILY_BLOCKS = 'maxTemporarilyBlocks'; /** * @param array[] $tiqrConfiguration @@ -159,9 +159,6 @@ public function hasMaxLoginAttempts(): bool return isset($this->options[self::MAX_ATTEMPTS]); } - /** - * @param int $attempts - */ public function setMaxLoginAttempts(int $attempts): void { $this->options[self::MAX_ATTEMPTS] = $attempts; @@ -174,7 +171,7 @@ public function setMaxLoginAttempts(int $attempts): void */ public function getMaxTemporarilyLoginAttempts(): int { - if (!$this->hasMaxTemporarilyLoginAttempts()) { + if ($this->hasMaxTemporarilyLoginAttempts() === 0) { throw ConfigurationException::noMaxTemporarilyAttempts(); } return $this->options[self::MAX_TEMPORARILY_BLOCKS]; diff --git a/src/Tiqr/TiqrFactory.php b/src/Tiqr/TiqrFactory.php index b3b248f1..17b45321 100644 --- a/src/Tiqr/TiqrFactory.php +++ b/src/Tiqr/TiqrFactory.php @@ -20,8 +20,7 @@ use App\Tiqr\Legacy\TiqrService; use App\Tiqr\Legacy\TiqrUserRepository; use Psr\Log\LoggerInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpFoundation\RequestStack; use Tiqr_Service; use Tiqr_StateStorage; use Tiqr_UserSecretStorage; @@ -29,32 +28,19 @@ class TiqrFactory { - private $configuration; - private $container; - private $session; - private $logger; - private $loaded = false; - - public function __construct( - TiqrConfigurationInterface $configuration, - ContainerInterface $container, - SessionInterface $session, - LoggerInterface $logger - ) { - $this->configuration = $configuration; - $this->container = $container; - $this->session = $session; - $this->logger = $logger; - } + private static bool $loaded = false; // Created from services.yaml - public function createService(): TiqrService - { - $this->loadDependencies(); - $options = $this->configuration->getTiqrOptions(); + public static function createService( + TiqrConfigurationInterface $configuration, + RequestStack $requestStack, + LoggerInterface $logger, + string $appSecret + ): TiqrService { + $options = $configuration->getTiqrOptions(); $storageType = "file"; - $storageOptions = array(); + $storageOptions = []; if (isset($options["statestorage"])) { $storageType = $options["statestorage"]["type"]; @@ -62,47 +48,33 @@ public function createService(): TiqrService } return new TiqrService( - new Tiqr_Service($this->logger, $options), - Tiqr_StateStorage::getStorage($storageType, $storageOptions, $this->logger), - $this->session, - $this->logger, + new Tiqr_Service($logger, $options), + Tiqr_StateStorage::getStorage($storageType, $storageOptions, $logger), + $requestStack, + $logger, + $appSecret, $options['name'] ); } // Created from services.yaml - public function createUserRepository(): TiqrUserRepository + public static function createUserRepository( + TiqrConfigurationInterface $configuration, + LoggerInterface $logger + ): TiqrUserRepository { - $this->loadDependencies(); - $options = $this->configuration->getTiqrOptions(); + $options = $configuration->getTiqrOptions(); $userStorage = Tiqr_UserStorage::getStorage( $options['userstorage']['type'], $options['userstorage'], - $this->logger + $logger ); $userSecretStorage = Tiqr_UserSecretStorage::getSecretStorage( $options['usersecretstorage']['type'], - $this->logger, + $logger, $options['usersecretstorage'] ); return new TiqrUserRepository($userStorage, $userSecretStorage); } - - private function loadDependencies() - { - if ($this->loaded) { - return; - } - $this->loaded = true; - $projectDirectory = $this->container->getParameter('kernel.project_dir'); - $vendorPath = $projectDirectory . '/vendor'; - require_once $vendorPath . '/tiqr/tiqr-server-libphp/library/tiqr/Tiqr/AutoLoader.php'; - $autoloader = \Tiqr_AutoLoader::getInstance([ - 'tiqr.path' => $vendorPath . '/tiqr/tiqr-server-libphp/library/tiqr', - 'zend.path' => $vendorPath . '/zendframework/zendframework1/library', - 'phpqrcode.path' => $vendorPath . '/kairos/phpqrcode', - ]); - $autoloader->setIncludePath(); - } } diff --git a/src/Tiqr/TiqrServiceInterface.php b/src/Tiqr/TiqrServiceInterface.php index d065bd26..0f849efe 100644 --- a/src/Tiqr/TiqrServiceInterface.php +++ b/src/Tiqr/TiqrServiceInterface.php @@ -29,7 +29,6 @@ interface TiqrServiceInterface * * @see \Tiqr_Service::generateEnrollmentQR() * - * @param string $metadataURL * @return StreamedResponse */ public function createRegistrationQRResponse(string $metadataURL): StreamedResponse; @@ -146,8 +145,6 @@ public function finalizeEnrollment(string $enrollmentSecret): void; * @see \Tiqr_Service::startAuthenticationSession() * @see \Tiqr_Service::generateAuthURL() * - * @param string $userId - * @param string $sari * * @return string the generated authentication URL * @throws TiqrServerRuntimeException @@ -194,9 +191,6 @@ public function createAuthenticationQRResponse(): StreamedResponse; public function authenticationUrl(): string; /** - * @param TiqrUserInterface $user - * @param string $response - * @param string $sessionKey * * @return AuthenticationResponse * @throws TiqrServerRuntimeException @@ -245,8 +239,6 @@ public function getAuthenticationSessionKey(): string; * return the $notificationAddress and the $notificationType that are required * to sent push notifications to the device. * - * @param string $notificationType - * @param string $notificationAddress * @throws TiqrServerRuntimeException * */ diff --git a/src/Tiqr/TiqrUserInterface.php b/src/Tiqr/TiqrUserInterface.php index de225d0c..895f25a7 100644 --- a/src/Tiqr/TiqrUserInterface.php +++ b/src/Tiqr/TiqrUserInterface.php @@ -41,8 +41,6 @@ public function getDisplayName(): string; public function getSecret(): string; /** Update the user's notificationType and notificationAddress - * @param string $notificationType - * @param string $notificationAddress * * @throws TiqrServerRuntimeException when there was en error updating the user's account */ diff --git a/src/Tiqr/TiqrUserRepositoryInterface.php b/src/Tiqr/TiqrUserRepositoryInterface.php index 37bff803..b8b86769 100644 --- a/src/Tiqr/TiqrUserRepositoryInterface.php +++ b/src/Tiqr/TiqrUserRepositoryInterface.php @@ -29,18 +29,14 @@ interface TiqrUserRepositoryInterface /** * Create new tiqr user. * - * @param string $userId - * @param string $secret * * @return TiqrUserInterface - * * @throws UserNotExistsException * @throws TiqrServerRuntimeException */ public function createUser(string $userId, string $secret): TiqrUser; /** - * @param string $userId * * @return TiqrUserInterface * diff --git a/src/WithContextLogger.php b/src/WithContextLogger.php index 9bf2ffae..2435ffd3 100644 --- a/src/WithContextLogger.php +++ b/src/WithContextLogger.php @@ -22,16 +22,11 @@ final class WithContextLogger extends AbstractLogger { - private $logger; - private $context; - - private function __construct(LoggerInterface $logger, array $context) + private function __construct(private readonly LoggerInterface $logger, private readonly array $context) { - $this->logger = $logger; - $this->context = $context; } - public static function from(LoggerInterface $logger, array $context) + public static function from(LoggerInterface $logger, array $context): self { return new self($logger, $context); } @@ -44,7 +39,7 @@ public static function from(LoggerInterface $logger, array $context) * * @return void */ - public function log($level, $message, array $context = array()) + public function log($level, $message, array $context = []): void { $this->logger->log($level, $message, array_merge($this->context, $context)); } diff --git a/templates/base.html.twig b/templates/base.html.twig index c5cbd811..ad9027c1 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -8,7 +8,6 @@ {% block title %}{{ 'site_title'|trans }}{% endblock %} {% block stylesheets %} - {{ encore_entry_link_tags('app') }} {{ encore_entry_link_tags('global') }} {% endblock %} @@ -18,7 +17,7 @@
@@ -42,7 +41,6 @@ {% endblock %} {% block javascripts %}{% endblock %} - {{ encore_entry_script_tags('app') }} diff --git a/templates/Exception/error.html.twig b/templates/bundles/TwigBundle/Exception/error.html.twig similarity index 100% rename from templates/Exception/error.html.twig rename to templates/bundles/TwigBundle/Exception/error.html.twig diff --git a/templates/Exception/error404.html.twig b/templates/bundles/TwigBundle/Exception/error404.html.twig similarity index 100% rename from templates/Exception/error404.html.twig rename to templates/bundles/TwigBundle/Exception/error404.html.twig diff --git a/var/cache/.gitkeep b/var/cache/.gitkeep old mode 100644 new mode 100755 diff --git a/var/log/.gitkeep b/var/log/.gitkeep old mode 100644 new mode 100755 From 3e597cc79bac82d64ff668c306614408fc12f79c Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Mon, 8 Jan 2024 09:21:03 +0100 Subject: [PATCH 12/52] Call the correct method This should have resulted in 500 errors in the tiqr app previously. --- src/Tiqr/Legacy/TiqrUser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tiqr/Legacy/TiqrUser.php b/src/Tiqr/Legacy/TiqrUser.php index bccddbf2..b655a7db 100644 --- a/src/Tiqr/Legacy/TiqrUser.php +++ b/src/Tiqr/Legacy/TiqrUser.php @@ -169,7 +169,7 @@ public function addTemporarilyLoginAttempt(): void { try { // Note: this is not transactional and requires two SQL queries when using the PDO driver - $this->userStorage->setTemporaryBlockAttempts($this->userId, $this->getTemporaryLoginAttempts() + 1); + $this->userStorage->setTemporaryBlockAttempts($this->userId, $this->getTemporarilyLoginAttempts() + 1); } catch (Exception $e) { // Catch errors from the tiqr-server and up-cycle them to exceptions that are meaningful to our domain throw TiqrServerRuntimeException::fromOriginalException($e); From edcddcefff625e8f2d190cae789a84c18fa50955 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Mon, 8 Jan 2024 11:56:01 +0100 Subject: [PATCH 13/52] Adhere to PHPStan levels 1..3 --- ci/qa/phpstan-baseline.neon | 29 ++++++++++++++ composer.json | 2 +- src/Features/Context/ErrorReportContext.php | 4 +- src/Features/Context/TiqrContext.php | 43 +++++++-------------- src/Features/Context/WebContext.php | 3 +- src/GlobalViewParameters.php | 38 ------------------ src/Service/GlobalViewParameters.php | 17 +++----- src/Service/UserAgentMatcher.php | 15 ++----- src/Service/UserAgentMatcherInterface.php | 6 +-- src/Tiqr/TiqrConfiguration.php | 20 ++-------- src/Tiqr/TiqrConfigurationInterface.php | 18 ++------- src/Tiqr/TiqrServiceInterface.php | 16 -------- src/Tiqr/TiqrUserRepositoryInterface.php | 10 +---- 13 files changed, 66 insertions(+), 155 deletions(-) delete mode 100644 src/GlobalViewParameters.php diff --git a/ci/qa/phpstan-baseline.neon b/ci/qa/phpstan-baseline.neon index 364905f7..cdd89903 100644 --- a/ci/qa/phpstan-baseline.neon +++ b/ci/qa/phpstan-baseline.neon @@ -1,2 +1,31 @@ parameters: ignoreErrors: + - + message: "#^Call to an undefined method Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface\\:\\:setLocale\\(\\)\\.$#" + count: 1 + path: ../../src/EventSubscriber/LocaleResponseListener.php + + - + message: "#^Call to an undefined method Behat\\\\Gherkin\\\\Node\\\\NodeInterface\\:\\:getText\\(\\)\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Call to an undefined method Behat\\\\Mink\\\\Driver\\\\DriverInterface\\:\\:getClient\\(\\)\\.$#" + count: 2 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" + count: 1 + path: ../../src/Features/Context/WebContext.php diff --git a/composer.json b/composer.json index c2c37745..3651a1ea 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "symfony/runtime": "6.*.*", "symfony/security-bundle": "6.4.*", "symfony/templating": "^6.4", - "symfony/translation": "6.4.*", + "symfony/translation": "^6.4", "symfony/twig-bundle": "6.4.*", "symfony/validator": "6.4.*", "symfony/webpack-encore-bundle": "^2.1", diff --git a/src/Features/Context/ErrorReportContext.php b/src/Features/Context/ErrorReportContext.php index 11c8c5b7..16ac15c6 100644 --- a/src/Features/Context/ErrorReportContext.php +++ b/src/Features/Context/ErrorReportContext.php @@ -31,14 +31,14 @@ /** * Generates a HTML/png error output report when a build fails. */ -final class ErrorReportContext implements Context, KernelAwareContext +final class ErrorReportContext implements Context { /** * @var MinkContext */ private $minkContext; - private ?\Symfony\Component\HttpKernel\KernelInterface $kernel = null; + private ?KernelInterface $kernel = null; /** * Fetch the required contexts. diff --git a/src/Features/Context/TiqrContext.php b/src/Features/Context/TiqrContext.php index df8360bb..96d96881 100644 --- a/src/Features/Context/TiqrContext.php +++ b/src/Features/Context/TiqrContext.php @@ -30,6 +30,7 @@ use Behat\Symfony2Extension\Context\KernelAwareContext; use Dev\FileLogger; use GuzzleHttp\Client; +use OCRA; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; @@ -40,7 +41,7 @@ * * @SuppressWarnings(PHPMD) */ -class TiqrContext implements Context, KernelAwareContext +class TiqrContext implements Context { /** * @var MinkContext @@ -60,7 +61,6 @@ class TiqrContext implements Context, KernelAwareContext /** * The registration metadata. - * @var mixed */ protected $metadata; @@ -72,16 +72,17 @@ class TiqrContext implements Context, KernelAwareContext * * @var string */ - protected $authenticationUrl; + protected string $authenticationUrl; /** * The authentication result. - * - * @var Response */ - protected $authenticatioResponse; - public function __construct(private \App\Tiqr\TiqrUserRepositoryInterface $tiqrUserRepository, private \App\Tiqr\TiqrConfigurationInterface $tiqrConfiguration, private \Dev\FileLogger $fileLogger) - { + protected Response $authenticatioResponse; + public function __construct( + private readonly TiqrUserRepositoryInterface $tiqrUserRepository, + private readonly TiqrConfigurationInterface $tiqrConfiguration, + private readonly FileLogger $fileLogger + ) { } /** @@ -128,7 +129,6 @@ public function restore(BeforeScenarioScope $scope): void */ public function theRegistrationQrCodeIsScanned(): void { - /** @var Client $client */ $this->minkContext->visitPath('/registration/qr/link'); // Should start with tiqrenroll:// $content = $this->minkContext->getMink()->getSession()->getPage()->getText(); @@ -149,7 +149,6 @@ public function theRegistrationQrCodeIsScanned(): void */ public function theAuthenticationQrCodeIsScanned(): void { - /** @var Client $client */ $this->minkContext->visitPath('/authentication/qr/' . urlencode((string) $this->metadata->identity->identifier) . '/link'); // Should start with tiqrenroll:// $content = $this->minkContext->getMink()->getSession()->getPage()->getText(); @@ -188,7 +187,6 @@ public function userRegisterTheService( 'notificationAddress' => $notificationAddress, ]; - /** @var \Symfony\Bundle\FrameworkBundle\Client $client */ $client = $this->minkContext->getSession()->getDriver()->getClient(); $client->request( 'POST', @@ -227,7 +225,7 @@ public function appAuthenticates( $ocraSuite = $service['ocraSuite']; - $response = \OCRA::generateOCRA($ocraSuite, $this->clientSecret, '', $challenge, '', $session, ''); + $response = OCRA::generateOCRA($ocraSuite, $this->clientSecret, '', $challenge, '', $session, ''); $authenticationBody = [ 'operation' => 'login', 'sessionKey' => $session, @@ -351,15 +349,10 @@ public function weHaveTheAuthenticationError($error): void public function tiqrUserIsPermentlyBlockedConfiguration(int $attempts): void { $container = $this->kernel->getContainer(); - /** @var TiqrConfiguration $config */ $config = $this->tiqrConfiguration; $config->setMaxLoginAttempts($attempts); } - /** - * - * @return string - */ private function createClientSecret(): string { return bin2hex(openssl_random_pseudo_bytes(32)); @@ -376,7 +369,6 @@ private function createClientSecret(): string public function iScanTheTiqrRegistrationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); - /** @var Client $client */ $page = $session->getPage(); $img = $page->find('css', 'div.qr > a > img'); $src = $img->getAttribute('src'); @@ -399,7 +391,6 @@ public function iScanTheTiqrRegistrationQrcode(): void public function iClickTheTiqrRegistrationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); - /** @var Client $client */ $page = $session->getPage(); $anchor = $page->find('css', 'div.qr > a'); $this->metadataUrl = str_replace('tiqrenroll://', '', $anchor->getAttribute('href')); @@ -416,7 +407,6 @@ public function iClickTheTiqrRegistrationQrcode(): void public function iScanTheTiqrAuthenticationQrcode(): void { $session = $this->minkContext->getMink()->getSession(); - /** @var Client $client */ $page = $session->getPage(); $img = $page->find('css', 'div.qr img'); $src = $img->getAttribute('src'); @@ -432,7 +422,6 @@ public function iScanTheTiqrAuthenticationQrcode(): void */ public function clearTheLogs(): void { - /** @var FileLogger $logger */ $logger = $this->fileLogger; $logger->cleanLogs(); } @@ -445,7 +434,6 @@ public function clearTheLogs(): void */ public function theLogsAre(TableNode $table): void { - /** @var FileLogger $logger */ $logger = $this->fileLogger; $logs = $logger->cleanLogs(); $rows = array_values($table->getColumnsHash()); @@ -498,12 +486,9 @@ public function theLogsAre(TableNode $table): void * * This support the strange way how tiqr sends the qr code. * - * @param string $src - * - * @return string * @throws \GuzzleHttp\Exception\GuzzleException */ - private function getFileContentsInsecure($src): string|false + private function getFileContentsInsecure(string $src): string|false { $session = $this->minkContext->getMink()->getSession(); $driver = $session->getDriver(); @@ -518,7 +503,7 @@ private function getFileContentsInsecure($src): string|false /** * @Given I fill in :field with my identifier */ - public function iFillInWithMyIdentifier($field): void + public function iFillInWithMyIdentifier(string $field): void { $this->minkContext->fillField($field, $this->metadata->identity->identifier); } @@ -526,12 +511,12 @@ public function iFillInWithMyIdentifier($field): void /** * @Given I fill in :field with my one time password and press ok */ - public function iFillInWithMyOTP($field): void + public function iFillInWithMyOTP(string $field): void { [$serviceId, $session, $challenge] = explode('/', $this->authenticationUrl); $service = (array)$this->metadata->service; $ocraSuite = $service['ocraSuite']; - $response = \OCRA::generateOCRA($ocraSuite, $this->clientSecret, '', $challenge, '', $session, ''); + $response = OCRA::generateOCRA($ocraSuite, $this->clientSecret, '', $challenge, '', $session, ''); $this->minkContext->visit('/authentication?otp=' . urlencode($response)); } } diff --git a/src/Features/Context/WebContext.php b/src/Features/Context/WebContext.php index f280ed63..0c7b2e51 100644 --- a/src/Features/Context/WebContext.php +++ b/src/Features/Context/WebContext.php @@ -20,7 +20,6 @@ use Behat\Behat\Context\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\MinkExtension\Context\MinkContext; -use Behat\Symfony2Extension\Context\KernelAwareContext; use RobRichards\XMLSecLibs\XMLSecurityKey; use SAML2\AuthnRequest; use SAML2\Certificate\PrivateKeyLoader; @@ -33,7 +32,7 @@ /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class WebContext implements Context, KernelAwareContext +class WebContext implements Context { /** * @var MinkContext diff --git a/src/GlobalViewParameters.php b/src/GlobalViewParameters.php deleted file mode 100644 index e4cd0a33..00000000 --- a/src/GlobalViewParameters.php +++ /dev/null @@ -1,38 +0,0 @@ -supportUrl[$this->translator->getLocale()]; - } -} diff --git a/src/Service/GlobalViewParameters.php b/src/Service/GlobalViewParameters.php index bb5e268f..bb93f139 100644 --- a/src/Service/GlobalViewParameters.php +++ b/src/Service/GlobalViewParameters.php @@ -18,21 +18,14 @@ namespace App\Service; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; final class GlobalViewParameters { - /** - * @var TranslatorInterface - */ - private $translator; - - /** - * @param TranslatorInterface $translator - */ - public function __construct(TranslatorInterface $translator, private readonly array $locales, private array $supportUrl) - { - $this->translator = $translator; + public function __construct( + private readonly TranslatorInterface $translator, + private readonly array $supportUrl + ) { } /** diff --git a/src/Service/UserAgentMatcher.php b/src/Service/UserAgentMatcher.php index e9ceb72d..f0286830 100644 --- a/src/Service/UserAgentMatcher.php +++ b/src/Service/UserAgentMatcher.php @@ -22,21 +22,14 @@ final class UserAgentMatcher implements UserAgentMatcherInterface { - /** - * @param string $pattern - */ - public function __construct(private $pattern) + public function __construct(private readonly string $pattern) { } - /** - * @param Request $request - * @return bool - */ - public function isOfficialTiqrMobileApp(Request $request): int|false + public function isOfficialTiqrMobileApp(Request $request): bool { $userAgent = $request->headers->get('User-Agent'); - - return preg_match($this->pattern, $userAgent); + $result = preg_match($this->pattern, $userAgent); + return $result === 1; } } diff --git a/src/Service/UserAgentMatcherInterface.php b/src/Service/UserAgentMatcherInterface.php index 62bfb497..54a6b0f1 100644 --- a/src/Service/UserAgentMatcherInterface.php +++ b/src/Service/UserAgentMatcherInterface.php @@ -22,9 +22,5 @@ interface UserAgentMatcherInterface { - /** - * @param Request $request - * @return bool - */ - public function isOfficialTiqrMobileApp(Request $request); + public function isOfficialTiqrMobileApp(Request $request): bool; } diff --git a/src/Tiqr/TiqrConfiguration.php b/src/Tiqr/TiqrConfiguration.php index 994c15d0..3e056a30 100644 --- a/src/Tiqr/TiqrConfiguration.php +++ b/src/Tiqr/TiqrConfiguration.php @@ -108,8 +108,6 @@ public function __construct(array $tiqrConfiguration) /** * Please don't use this to get individual options. - * - * @return array */ public function getTiqrOptions(): array { @@ -117,8 +115,7 @@ public function getTiqrOptions(): array } /** - * @return boolean - * TRUE if there is a maximum block duration. + * @return boolean TRUE if there is a maximum block duration. */ public function temporarilyBlockEnabled(): bool { @@ -126,8 +123,7 @@ public function temporarilyBlockEnabled(): bool } /** - * @return int - * The maximum block duration in minutes. + * @return int The maximum block duration in minutes. * * @throws ConfigurationException */ @@ -140,7 +136,6 @@ public function getTemporarilyBlockDuration(): int } /** - * @return int * @throws \App\Tiqr\Exception\ConfigurationException */ public function getMaxAttempts(): int @@ -151,9 +146,6 @@ public function getMaxAttempts(): int return $this->options[self::MAX_ATTEMPTS]; } - /** - * @return boolean - */ public function hasMaxLoginAttempts(): bool { return isset($this->options[self::MAX_ATTEMPTS]); @@ -165,8 +157,6 @@ public function setMaxLoginAttempts(int $attempts): void } /** - * @return int - * * @throws ConfigurationException */ public function getMaxTemporarilyLoginAttempts(): int @@ -177,11 +167,7 @@ public function getMaxTemporarilyLoginAttempts(): int return $this->options[self::MAX_TEMPORARILY_BLOCKS]; } - /** - * - * @return bool - */ - public function hasMaxTemporarilyLoginAttempts(): int + public function hasMaxTemporarilyLoginAttempts(): bool { return isset($this->options[self::MAX_TEMPORARILY_BLOCKS]); } diff --git a/src/Tiqr/TiqrConfigurationInterface.php b/src/Tiqr/TiqrConfigurationInterface.php index 18aa5f92..ce9ec85a 100644 --- a/src/Tiqr/TiqrConfigurationInterface.php +++ b/src/Tiqr/TiqrConfigurationInterface.php @@ -22,8 +22,6 @@ interface TiqrConfigurationInterface { /** * Please don't use this to get individual options. - * - * @return array */ public function getTiqrOptions(): array; @@ -42,26 +40,18 @@ public function temporarilyBlockEnabled(): bool; public function getTemporarilyBlockDuration(): int; /** - * @return int - * @throws \App\Tiqr\Exception\ConfigurationException + * @throws ConfigurationException */ public function getMaxAttempts(): int; - /** - * @return boolean - */ public function hasMaxLoginAttempts(): bool; + public function setMaxLoginAttempts(int $attempts): void; + /** - * @return int - * * @throws ConfigurationException */ public function getMaxTemporarilyLoginAttempts(): int; - /** - * - * @return bool - */ - public function hasMaxTemporarilyLoginAttempts(): int; + public function hasMaxTemporarilyLoginAttempts(): bool; } diff --git a/src/Tiqr/TiqrServiceInterface.php b/src/Tiqr/TiqrServiceInterface.php index 0f849efe..45a1339f 100644 --- a/src/Tiqr/TiqrServiceInterface.php +++ b/src/Tiqr/TiqrServiceInterface.php @@ -28,8 +28,6 @@ interface TiqrServiceInterface * Return a stream with the PNG image data of a QR code with the enrollment url and enrollment key * * @see \Tiqr_Service::generateEnrollmentQR() - * - * @return StreamedResponse */ public function createRegistrationQRResponse(string $metadataURL): StreamedResponse; @@ -156,8 +154,6 @@ public function startAuthentication(string $userId, string $sari): string; * false otherwise * * @see \Tiqr_Service::getAuthenticatedUser() - * - * Does not throw */ public function isAuthenticated(): bool; @@ -170,7 +166,6 @@ public function isAuthenticated(): bool; * * @see \Tiqr_Service::generateAuthQR() * - * @return StreamedResponse * @throws TiqrServerRuntimeException */ public function createAuthenticationQRResponse(): StreamedResponse; @@ -183,8 +178,6 @@ public function createAuthenticationQRResponse(): StreamedResponse; * same device as where the application is installed * * @see \Tiqr_Service::generateAuthURL() - * - * @return the generated URL * @throws TiqrServerRuntimeException * */ @@ -192,7 +185,6 @@ public function authenticationUrl(): string; /** * - * @return AuthenticationResponse * @throws TiqrServerRuntimeException */ public function authenticate(TiqrUserInterface $user, string $response, string $sessionKey): AuthenticationResponse; @@ -201,7 +193,6 @@ public function authenticate(TiqrUserInterface $user, string $response, string $ * Returns the current enrollment status. * @see \Tiqr_Service::getEnrollmentStatus() * - * @return int * @throws TiqrServerRuntimeException */ public function getEnrollmentStatus(): int; @@ -217,18 +208,11 @@ public function enrollmentFinalized(): bool; /** * Returns the current id of the enrolled user. - * @return string - * - * Does not throw */ public function getUserId(): string; /** * Return the authentication session id. - * - * @return string - * - * Does not throw */ public function getAuthenticationSessionKey(): string; diff --git a/src/Tiqr/TiqrUserRepositoryInterface.php b/src/Tiqr/TiqrUserRepositoryInterface.php index b8b86769..f347049f 100644 --- a/src/Tiqr/TiqrUserRepositoryInterface.php +++ b/src/Tiqr/TiqrUserRepositoryInterface.php @@ -28,20 +28,14 @@ interface TiqrUserRepositoryInterface { /** * Create new tiqr user. - * - * - * @return TiqrUserInterface * @throws UserNotExistsException * @throws TiqrServerRuntimeException */ - public function createUser(string $userId, string $secret): TiqrUser; + public function createUser(string $userId, string $secret): TiqrUserInterface; /** - * - * @return TiqrUserInterface - * * @throws UserNotExistsException * @throws TiqrServerRuntimeException */ - public function getUser(string $userId): TiqrUser; + public function getUser(string $userId): TiqrUserInterface; } From 05f0bca4145b1747143cf132cc901e17e69ea3a0 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Mon, 8 Jan 2024 14:45:14 +0100 Subject: [PATCH 14/52] Adhere to PHPStan levels 4..6 --- ci/qa/phpstan-baseline.neon | 20 +++++ src/Controller/ExceptionController.php | 2 +- src/Controller/RegistrationController.php | 19 ++-- src/DependencyInjection/Configuration.php | 2 +- src/Features/Context/ErrorReportContext.php | 26 +++--- src/Features/Context/TiqrContext.php | 88 +++++++++---------- src/Features/Context/WebContext.php | 5 +- src/Service/GlobalViewParameters.php | 3 + src/Tiqr/AuthenticationRateLimitService.php | 9 +- src/Tiqr/Exception/UserNotExistsException.php | 6 +- src/Tiqr/Legacy/TiqrService.php | 27 +----- src/Tiqr/TiqrConfiguration.php | 6 +- src/Tiqr/TiqrConfigurationInterface.php | 1 + src/Tiqr/TiqrFactory.php | 2 - src/Tiqr/TiqrServiceInterface.php | 2 +- src/Tiqr/TiqrUserInterface.php | 2 +- src/WithContextLogger.php | 21 +++-- 17 files changed, 122 insertions(+), 119 deletions(-) diff --git a/ci/qa/phpstan-baseline.neon b/ci/qa/phpstan-baseline.neon index cdd89903..4adca865 100644 --- a/ci/qa/phpstan-baseline.neon +++ b/ci/qa/phpstan-baseline.neon @@ -1,5 +1,25 @@ parameters: ignoreErrors: + - + message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:createBlockingConfig\\(\\) has no return type specified\\.$#" + count: 1 + path: ../../src/DependencyInjection/Configuration.php + + - + message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:createGeneralConfig\\(\\) has no return type specified\\.$#" + count: 1 + path: ../../src/DependencyInjection/Configuration.php + + - + message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:createLibraryConfig\\(\\) has no return type specified\\.$#" + count: 1 + path: ../../src/DependencyInjection/Configuration.php + + - + message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:createStorageConfig\\(\\) has no return type specified\\.$#" + count: 1 + path: ../../src/DependencyInjection/Configuration.php + - message: "#^Call to an undefined method Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface\\:\\:setLocale\\(\\)\\.$#" count: 1 diff --git a/src/Controller/ExceptionController.php b/src/Controller/ExceptionController.php index 647ea425..4f432a4e 100644 --- a/src/Controller/ExceptionController.php +++ b/src/Controller/ExceptionController.php @@ -78,7 +78,7 @@ public function show(Request $request, Throwable $exception): Response } /** - * @return array View parameters 'title' and 'description' + * @return array View parameters 'title' and 'description' */ protected function getPageTitleAndDescription(\Throwable $exception): array { diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index e75b8585..653534db 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -29,18 +29,21 @@ class RegistrationController extends AbstractController { - public function __construct(private readonly RegistrationService $registrationService, private readonly StateHandlerInterface $stateHandler, private readonly TiqrServiceInterface $tiqrService, private readonly LoggerInterface $logger) - { + public function __construct( + private readonly RegistrationService $registrationService, + private readonly StateHandlerInterface $stateHandler, + private readonly TiqrServiceInterface $tiqrService, + private readonly LoggerInterface $logger + ) { } /** * Returns the registration page with QR code that is generated in 'qrRegistrationAction'. * - * * @throws \InvalidArgumentException */ #[Route(path: '/registration', name: 'app_identity_registration', methods: ['GET', 'POST'])] - public function registration(Request $request): \Symfony\Component\HttpFoundation\Response + public function registration(Request $request): Response { $this->logger->info('Verifying if there is a pending registration from SP'); @@ -85,7 +88,7 @@ public function registration(Request $request): \Symfony\Component\HttpFoundatio * @throws \InvalidArgumentException */ #[Route(path: '/registration/status', name: 'app_identity_registration_status', methods: ['GET'])] - public function registrationStatus() : \Symfony\Component\HttpFoundation\Response + public function registrationStatus() : Response { $this->logger->info('Request for registration status'); // Do have a valid sample AuthnRequest?. @@ -96,7 +99,7 @@ public function registrationStatus() : \Symfony\Component\HttpFoundation\Respons } $status = $this->tiqrService->getEnrollmentStatus(); $this->logger->info(sprintf('Send json response status "%s"', $status)); - return new Response($this->tiqrService->getEnrollmentStatus()); + return new Response((string) $this->tiqrService->getEnrollmentStatus()); } /** @@ -108,7 +111,7 @@ public function registrationStatus() : \Symfony\Component\HttpFoundation\Respons * @throws \InvalidArgumentException */ #[Route(path: '/registration/qr/{enrollmentKey}', name: 'app_identity_registration_qr', methods: ['GET'])] - public function registrationQr(Request $request, $enrollmentKey): \Symfony\Component\HttpFoundation\Response + public function registrationQr(Request $request, string $enrollmentKey): Response { $this->logger->info('Request for registration QR img'); @@ -117,7 +120,7 @@ public function registrationQr(Request $request, $enrollmentKey): \Symfony\Compo return new Response('No registration required', Response::HTTP_BAD_REQUEST); } - $metadataUrl = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode((string) $enrollmentKey))); + $metadataUrl = $request->getUriForPath(sprintf('/tiqr.php?key=%s', urlencode($enrollmentKey))); $this->logger->info('Returning registration QR response'); return $this->tiqrService->createRegistrationQRResponse($metadataUrl); } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 9566e289..8a361d57 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -26,7 +26,7 @@ class Configuration implements ConfigurationInterface /** * {@inheritdoc} */ - public function getConfigTreeBuilder() + public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('app'); $rootNode = $treeBuilder->getRootNode(); diff --git a/src/Features/Context/ErrorReportContext.php b/src/Features/Context/ErrorReportContext.php index 16ac15c6..7c3cdc84 100644 --- a/src/Features/Context/ErrorReportContext.php +++ b/src/Features/Context/ErrorReportContext.php @@ -21,12 +21,15 @@ use Behat\Behat\Hook\Scope\AfterStepScope; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Behat\Hook\Scope\StepScope; +use Behat\Gherkin\Node\ScenarioInterface; use Behat\Mink\Driver\Selenium2Driver; use Behat\Mink\Exception\DriverException; use Behat\MinkExtension\Context\MinkContext; use Behat\Symfony2Extension\Context\KernelAwareContext; use Behat\Testwork\Tester\Result\TestResult; +use Exception; use Symfony\Component\HttpKernel\KernelInterface; +use function is_string; /** * Generates a HTML/png error output report when a build fails. @@ -56,7 +59,6 @@ public function gatherContexts(BeforeScenarioScope $scope): void /** * This will print the failed html result. * - * * @AfterStep */ public function dumpInfoAfterFailedStep(AfterStepScope $scope): void @@ -66,15 +68,16 @@ public function dumpInfoAfterFailedStep(AfterStepScope $scope): void } try { $scenario = $this->getScenario($scope); - if (null !== $scenario) { + if ($scenario instanceof ScenarioInterface) { $title = $scenario->getTitle(); - } - if (null === $scenario) { + } else { $step = $this->getBackGroundStep($scope); $title = $step->getNodeType().'-'.$step->getText(); } $filename = preg_replace('/[^a-zA-Z0-9]/', '-', $title); - + if (!is_string($filename)) { + throw new Exception('Unable to parse the file name'); + } $this->saveErrorFile($scope, $filename); $this->takeScreenShotAfterFailedStep($filename); } catch (DriverException) { @@ -83,13 +86,13 @@ public function dumpInfoAfterFailedStep(AfterStepScope $scope): void } /** - * Saves screen shot. + * Saves screenshot. * * @param string $fileName * * @throws \Behat\Mink\Exception\DriverException */ - private function takeScreenShotAfterFailedStep(string|array|null $fileName): void + private function takeScreenShotAfterFailedStep(string $fileName): void { $session = $this->minkContext->getSession(); if (!($session->getDriver() instanceof Selenium2Driver)) { @@ -106,10 +109,8 @@ private function takeScreenShotAfterFailedStep(string|array|null $fileName): voi /** * Save the page result file to disk. - * - * @param string $fileName */ - private function saveErrorFile(AfterStepScope $scope, string|array|null $fileName): void + private function saveErrorFile(AfterStepScope $scope, string $fileName): void { $session = $this->minkContext->getSession(); $content = <<< TEXT @@ -139,11 +140,8 @@ private function stepIsSuccessful(AfterStepScope $scope): bool /** * Returns the scenaro for a given step. - * - * - * @return \Behat\Gherkin\Node\ScenarioInterface */ - private function getScenario(StepScope $scope) + private function getScenario(StepScope $scope): null|ScenarioInterface { $scenario = null; $feature = $scope->getFeature(); diff --git a/src/Features/Context/TiqrContext.php b/src/Features/Context/TiqrContext.php index 96d96881..bf387d8c 100644 --- a/src/Features/Context/TiqrContext.php +++ b/src/Features/Context/TiqrContext.php @@ -29,8 +29,12 @@ use Behat\MinkExtension\Context\MinkContext; use Behat\Symfony2Extension\Context\KernelAwareContext; use Dev\FileLogger; +use Exception; use GuzzleHttp\Client; +use GuzzleHttp\Exception\GuzzleException; use OCRA; +use stdClass; +use Surfnet\SamlBundle\Exception\NotFound; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; @@ -43,34 +47,26 @@ */ class TiqrContext implements Context { - /** - * @var MinkContext - */ - protected $minkContext; + protected MinkContext $minkContext; - /** - * @var KernelInterface - */ - protected $kernel; + protected KernelInterface $kernel; - protected $metadataUrl; + protected string $metadataUrl; - protected $clientSecret; + protected string $clientSecret; - protected $userAgent; + protected string $userAgent; /** * The registration metadata. */ - protected $metadata; + protected stdClass $metadata; - protected $notificationType; - protected $notificationAddress; + protected string $notificationType; + protected string $notificationAddress; /** * The scanned QR code with the '//tiqrauth' part. - * - * @var string */ protected string $authenticationUrl; @@ -120,12 +116,12 @@ public function restore(BeforeScenarioScope $scope): void /** * We are not actually scanning the QR code, but downloading link from: * - * @see QrLinkController::qrRegistrationAction + * @throws NotFound + * @throws AssertionFailedException + *@see QrLinkController::qrRegistrationAction * * @Given the registration QR code is scanned * - * @throws \Surfnet\SamlBundle\Exception\NotFound - * @throws \Assert\AssertionFailedException */ public function theRegistrationQrCodeIsScanned(): void { @@ -140,12 +136,12 @@ public function theRegistrationQrCodeIsScanned(): void /** * We are not actually scanning the QR code, but downloading link from: * - * @see QrLinkController::qrRegistrationAction + * @throws NotFound + * @throws AssertionFailedException + *@see QrLinkController::qrRegistrationAction * * @Given the authentication QR code is scanned * - * @throws \Surfnet\SamlBundle\Exception\NotFound - * @throws \Assert\AssertionFailedException */ public function theAuthenticationQrCodeIsScanned(): void { @@ -162,7 +158,7 @@ public function theAuthenticationQrCodeIsScanned(): void * * @When the user registers the service with notification type :notificationType address: :notificationAddress * @When the user registers the service - * @throws \Assert\AssertionFailedException + * @throws AssertionFailedException */ public function userRegisterTheService( string $notificationType = '', @@ -212,7 +208,7 @@ public function mobileAppUsesUserAgent(string $userAgent): void * * @When the app authenticates to the service with notification type :notificationType address: :notificationAddress * @When the app authenticates to the service - * @throws \Exception + * @throws Exception */ public function appAuthenticates( string $notificationType = '', @@ -246,7 +242,7 @@ public function appAuthenticates( * This does the app authentication logic. * * @When the app authenticates to the service with wrong password - * @throws \Exception + * @throws Exception */ public function appAuthenticatesWithWrongPassword( string $notificationType = '', @@ -262,8 +258,8 @@ public function appAuthenticatesWithWrongPassword( /** * @Then tiqr errors with a message telling the user agent was wrong * - * @throws \Assert\AssertionFailedException - * @throws \Exception + * @throws AssertionFailedException + * @throws Exception */ public function userRegisteredWithWrongUserAgent(): void { @@ -281,8 +277,8 @@ public function userRegisteredWithWrongUserAgent(): void /** * @Then we register with the same QR code it should not work anymore. * - * @throws \Assert\AssertionFailedException - * @throws \Exception + * @throws AssertionFailedException + * @throws Exception */ public function userRegisterTheServiceWithSameQr(): void { @@ -293,19 +289,19 @@ public function userRegisterTheServiceWithSameQr(): void // The second attempt should fail. try { $this->userRegisterTheService($this->notificationType, $this->notificationAddress); - } catch (\Exception $exception) { + } catch (Exception $exception) { Assertion::eq($exception->getMessage(), 'Metadata has expired'); return; } - throw new \Exception('It should not be valid'); + throw new Exception('It should not be valid'); } /** * @Then we have a registered user * * @throws \App\Tiqr\Exception\UserNotExistsException - * @throws \Assert\AssertionFailedException + * @throws AssertionFailedException */ public function weHaveARegisteredUser(): void { @@ -323,7 +319,7 @@ public function weHaveARegisteredUser(): void * @Then we have a authenticated user * @Then we have a authenticated app * - * @throws \Assert\AssertionFailedException + * @throws AssertionFailedException */ public function weHaveAAuthenticatedUser(): void { @@ -334,9 +330,9 @@ public function weHaveAAuthenticatedUser(): void /** * @Then we have the authentication error :error * - * @throws \Assert\AssertionFailedException + * @throws AssertionFailedException */ - public function weHaveTheAuthenticationError($error): void + public function weHaveTheAuthenticationError(string $error): void { Assertion::eq($error, $this->authenticatioResponse->getContent()); Assertion::eq($this->authenticatioResponse->getStatusCode(), Response::HTTP_FORBIDDEN); @@ -344,7 +340,7 @@ public function weHaveTheAuthenticationError($error): void /** * @Given tiqr users is permanently blocked after :attempts attempts - * @throws \Assert\AssertionFailedException + * @throws AssertionFailedException */ public function tiqrUserIsPermentlyBlockedConfiguration(int $attempts): void { @@ -363,8 +359,8 @@ private function createClientSecret(): string * * @Then I scan the tiqr registration qrcode * - * @throws \Assert\AssertionFailedException - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws AssertionFailedException + * @throws GuzzleException */ public function iScanTheTiqrRegistrationQrcode(): void { @@ -385,8 +381,8 @@ public function iScanTheTiqrRegistrationQrcode(): void * * @Then I click the tiqr registration qrcode * - * @throws \Assert\AssertionFailedException - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws AssertionFailedException + * @throws GuzzleException */ public function iClickTheTiqrRegistrationQrcode(): void { @@ -401,8 +397,8 @@ public function iClickTheTiqrRegistrationQrcode(): void * * @Then I scan the tiqr authentication qrcode * - * @throws \Assert\AssertionFailedException - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws AssertionFailedException + * @throws GuzzleException */ public function iScanTheTiqrAuthenticationQrcode(): void { @@ -429,8 +425,8 @@ public function clearTheLogs(): void /** * @Given /^the logs are:$/ * - * @throws \Assert\AssertionFailedException - * @throws \Exception + * @throws AssertionFailedException + * @throws Exception */ public function theLogsAre(TableNode $table): void { @@ -477,7 +473,7 @@ public function theLogsAre(TableNode $table): void isset($log[2]['sari']) ? 'present' : '' ), $logs)); - throw new \Exception($exception->getMessage() . PHP_EOL . $yml, $exception->getCode(), $exception); + throw new Exception($exception->getMessage() . PHP_EOL . $yml, $exception->getCode(), $exception); } } @@ -486,7 +482,7 @@ public function theLogsAre(TableNode $table): void * * This support the strange way how tiqr sends the qr code. * - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws GuzzleException */ private function getFileContentsInsecure(string $src): string|false { diff --git a/src/Features/Context/WebContext.php b/src/Features/Context/WebContext.php index 0c7b2e51..29251cc9 100644 --- a/src/Features/Context/WebContext.php +++ b/src/Features/Context/WebContext.php @@ -25,6 +25,7 @@ use SAML2\Certificate\PrivateKeyLoader; use SAML2\Configuration\PrivateKey; use SAML2\Constants; +use SAML2\XML\saml\Issuer; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\KernelInterface; @@ -128,7 +129,9 @@ public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider(): void $authnRequest = new AuthnRequest(); $authnRequest->setAssertionConsumerServiceURL('https://service_provider_unkown/saml/acs'); $authnRequest->setDestination($this->getIdentityProvider()->getSsoUrl()); - $authnRequest->setIssuer('https://service_provider_unkown/saml/metadata'); + $issuer = new Issuer(); + $issuer->setValue('https://service_provider_unkown/saml/metadata'); + $authnRequest->setIssuer($issuer); $authnRequest->setProtocolBinding(Constants::BINDING_HTTP_REDIRECT); // Sign with random key, does not mather for now. diff --git a/src/Service/GlobalViewParameters.php b/src/Service/GlobalViewParameters.php index bb93f139..694c622a 100644 --- a/src/Service/GlobalViewParameters.php +++ b/src/Service/GlobalViewParameters.php @@ -22,6 +22,9 @@ final class GlobalViewParameters { + /** + * @param array $supportUrl + */ public function __construct( private readonly TranslatorInterface $translator, private readonly array $supportUrl diff --git a/src/Tiqr/AuthenticationRateLimitService.php b/src/Tiqr/AuthenticationRateLimitService.php index 13a0f45c..4e71211d 100644 --- a/src/Tiqr/AuthenticationRateLimitService.php +++ b/src/Tiqr/AuthenticationRateLimitService.php @@ -65,11 +65,6 @@ public function isBlockedTemporarily(TiqrUserInterface $user): bool } /** - * @param string $sessionKey - * @param TiqrUserInterface $user - * @param string $response - * - * @return AuthenticationResponse * @throws \InvalidArgumentException * @throws Exception\ConfigurationException * @throws \Exception @@ -115,8 +110,6 @@ public function authenticate(string $sessionKey, TiqrUserInterface $user, string } /** - * - * @return AuthenticationResponse * @throws Exception\ConfigurationException */ private function handleAuthenticationRejectResponse( @@ -159,7 +152,7 @@ private function handleAuthenticationRejectResponse( $now = new \DateTimeImmutable(); // Just block the user temporarily if we don't got a limit. - if ($this->configuration->hasMaxTemporarilyLoginAttempts() === 0) { + if (!$this->configuration->hasMaxTemporarilyLoginAttempts()) { $user->blockTemporarily($now); $logger->notice('Increase temporarily block attempt'); diff --git a/src/Tiqr/Exception/UserNotExistsException.php b/src/Tiqr/Exception/UserNotExistsException.php index 84bcb85e..91f7ae8d 100644 --- a/src/Tiqr/Exception/UserNotExistsException.php +++ b/src/Tiqr/Exception/UserNotExistsException.php @@ -17,9 +17,11 @@ namespace App\Tiqr\Exception; -final class UserNotExistsException extends \Exception +use Exception; + +final class UserNotExistsException extends Exception { - public static function createFromId($userId): self + public static function createFromId(string $userId): self { return new self(sprintf('User with id "%s"', $userId)); } diff --git a/src/Tiqr/Legacy/TiqrService.php b/src/Tiqr/Legacy/TiqrService.php index c5e54937..2e780c12 100644 --- a/src/Tiqr/Legacy/TiqrService.php +++ b/src/Tiqr/Legacy/TiqrService.php @@ -129,6 +129,7 @@ private function storeEnrollmentKey(string $key): void /** * @see TiqrServiceInterface::getEnrollmentMetadata() + * @return array */ public function getEnrollmentMetadata(string $key, string $loginUri, string $enrollmentUrl): array { @@ -327,7 +328,7 @@ public function sendNotification(string $notificationType, string $notificationA */ private function generateId(int $length = 4): string { - return base_convert(time(), 10, 36) . '-' . base_convert(mt_rand(0, 36 ** $length), 10, 36); + return base_convert((string) time(), 10, 36) . '-' . base_convert((string) mt_rand(0, 36 ** $length), 10, 36); } /** Create a stable hash from $identifier @@ -355,30 +356,6 @@ public function getSariForSessionIdentifier(string $identifier): string return $res; } - /** - * @param string $identifier Enrollment key or session key - * @return bool true on success, false otherwise - * Does not throw - */ - private function unsetSariForSessionIdentifier(string $identifier): bool - { - $this->logger->info( - sprintf("Unsetting SARI for identifier '%s...'", substr($identifier, 0, 8)) - ); - - try { - $hashed_identifier = $this->getHashedIdentifier($identifier); - $this->tiqrStateStorage->unsetValue('sari_' . $hashed_identifier); - } catch (Exception) { - $this->logger->error( - sprintf('unsetSariForSessionIdentifier failed for "%s"', substr($identifier, 0, 8)) - ); - return false; - } - - return true; - } - /** * Associate $identifier with the provided stepup authentication request id (SARI) * Associations expire after one hour diff --git a/src/Tiqr/TiqrConfiguration.php b/src/Tiqr/TiqrConfiguration.php index 3e056a30..6c0c3a53 100644 --- a/src/Tiqr/TiqrConfiguration.php +++ b/src/Tiqr/TiqrConfiguration.php @@ -23,13 +23,14 @@ class TiqrConfiguration implements TiqrConfigurationInterface { + /** @var array */ private $options = []; final public const TEMPORARILY_BLOCK_DURATION = 'temporarilyBlockDuration'; final public const MAX_ATTEMPTS = 'maxAttempts'; final public const MAX_TEMPORARILY_BLOCKS = 'maxTemporarilyBlocks'; /** - * @param array[] $tiqrConfiguration + * @param array> $tiqrConfiguration * * @throws \Assert\AssertionFailedException */ @@ -108,6 +109,7 @@ public function __construct(array $tiqrConfiguration) /** * Please don't use this to get individual options. + * @return array> */ public function getTiqrOptions(): array { @@ -161,7 +163,7 @@ public function setMaxLoginAttempts(int $attempts): void */ public function getMaxTemporarilyLoginAttempts(): int { - if ($this->hasMaxTemporarilyLoginAttempts() === 0) { + if (!$this->hasMaxTemporarilyLoginAttempts()) { throw ConfigurationException::noMaxTemporarilyAttempts(); } return $this->options[self::MAX_TEMPORARILY_BLOCKS]; diff --git a/src/Tiqr/TiqrConfigurationInterface.php b/src/Tiqr/TiqrConfigurationInterface.php index ce9ec85a..06f10354 100644 --- a/src/Tiqr/TiqrConfigurationInterface.php +++ b/src/Tiqr/TiqrConfigurationInterface.php @@ -22,6 +22,7 @@ interface TiqrConfigurationInterface { /** * Please don't use this to get individual options. + * @return array */ public function getTiqrOptions(): array; diff --git a/src/Tiqr/TiqrFactory.php b/src/Tiqr/TiqrFactory.php index 17b45321..9929e2bb 100644 --- a/src/Tiqr/TiqrFactory.php +++ b/src/Tiqr/TiqrFactory.php @@ -28,8 +28,6 @@ class TiqrFactory { - private static bool $loaded = false; - // Created from services.yaml public static function createService( TiqrConfigurationInterface $configuration, diff --git a/src/Tiqr/TiqrServiceInterface.php b/src/Tiqr/TiqrServiceInterface.php index 45a1339f..4bbd40f1 100644 --- a/src/Tiqr/TiqrServiceInterface.php +++ b/src/Tiqr/TiqrServiceInterface.php @@ -90,7 +90,7 @@ public function generateEnrollmentKey(string $sari): string; * can be generated with the * getEnrollmentSecret call. * - * @return array An array of metadata that the phone needs to complete + * @return array An array of metadata that the phone needs to complete * enrollment. You must encode it in JSON before you send * it to the phone. * diff --git a/src/Tiqr/TiqrUserInterface.php b/src/Tiqr/TiqrUserInterface.php index 895f25a7..d9c732bc 100644 --- a/src/Tiqr/TiqrUserInterface.php +++ b/src/Tiqr/TiqrUserInterface.php @@ -65,7 +65,7 @@ public function getLoginAttempts(): int; * * @throws TiqrServerRuntimeException */ - public function addLoginAttempt(); + public function addLoginAttempt(): void; /** * Get the user's number of unsuccessful temporary login attempts diff --git a/src/WithContextLogger.php b/src/WithContextLogger.php index 2435ffd3..7f99a3d4 100644 --- a/src/WithContextLogger.php +++ b/src/WithContextLogger.php @@ -22,24 +22,31 @@ final class WithContextLogger extends AbstractLogger { - private function __construct(private readonly LoggerInterface $logger, private readonly array $context) - { + private function __construct( + private readonly LoggerInterface $logger, + /** @var array $context */ + private readonly array $context + ) { } - public static function from(LoggerInterface $logger, array $context): self - { + /** + * @param array $context + */ + public static function from( + LoggerInterface $logger, + array $context + ): self { return new self($logger, $context); } /** * Logs with an arbitrary level. * - * @param mixed $level - * @param array $context + * @param array $context * * @return void */ - public function log($level, $message, array $context = []): void + public function log($level, string|\Stringable $message, array $context = []): void { $this->logger->log($level, $message, array_merge($this->context, $context)); } From 3caff6ecf64c18464cfd297870d6219a98413f89 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Mon, 8 Jan 2024 15:06:12 +0100 Subject: [PATCH 15/52] Adhere to PHPStan levels 7..9 Level 8 and 9 have mostly been ignored as most of the warnings where hailing from the behat contexts --- ci/qa/phpstan-baseline.neon | 309 +++++++++++++++++++++++++++- src/Features/Context/WebContext.php | 25 ++- src/Service/UserAgentMatcher.php | 3 + src/Tiqr/Legacy/TiqrService.php | 2 +- 4 files changed, 326 insertions(+), 13 deletions(-) diff --git a/ci/qa/phpstan-baseline.neon b/ci/qa/phpstan-baseline.neon index 4adca865..e2b91a16 100644 --- a/ci/qa/phpstan-baseline.neon +++ b/ci/qa/phpstan-baseline.neon @@ -1,5 +1,95 @@ parameters: ignoreErrors: + - + message: "#^Parameter \\#3 \\$response of method App\\\\Tiqr\\\\AuthenticationRateLimitServiceInterface\\:\\:authenticate\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/AuthenticationController.php + + - + message: "#^Cannot cast mixed to string\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$enrollmentEnrollmentKey of method App\\\\Tiqr\\\\TiqrServiceInterface\\:\\:getEnrollmentSecret\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$enrollmentSecret of method App\\\\Tiqr\\\\TiqrServiceInterface\\:\\:finalizeEnrollment\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$enrollmentSecret of method App\\\\Tiqr\\\\TiqrServiceInterface\\:\\:validateEnrollmentSecret\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$identifier of method App\\\\Tiqr\\\\TiqrServiceInterface\\:\\:getSariForSessionIdentifier\\(\\) expects string, mixed given\\.$#" + count: 4 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$key of method App\\\\Tiqr\\\\TiqrServiceInterface\\:\\:getEnrollmentMetadata\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$sessionKey of method App\\\\Tiqr\\\\AuthenticationRateLimitServiceInterface\\:\\:authenticate\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#1 \\$userId of method App\\\\Tiqr\\\\TiqrUserRepositoryInterface\\:\\:getUser\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#2 \\$context of static method App\\\\WithContextLogger\\:\\:from\\(\\) expects array\\, array\\ given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#2 \\$notificationType of method App\\\\Controller\\\\TiqrAppApiController\\:\\:loginAction\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#2 \\$secret of method App\\\\Tiqr\\\\TiqrUserRepositoryInterface\\:\\:createUser\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + count: 2 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#3 \\$notificationAddress of method App\\\\Controller\\\\TiqrAppApiController\\:\\:loginAction\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#3 \\$notificationType of method App\\\\Controller\\\\TiqrAppApiController\\:\\:registerAction\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#3 \\$response of method App\\\\Tiqr\\\\AuthenticationRateLimitServiceInterface\\:\\:authenticate\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#3 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + count: 2 + path: ../../src/Controller/TiqrAppApiController.php + + - + message: "#^Parameter \\#4 \\$notificationAddress of method App\\\\Controller\\\\TiqrAppApiController\\:\\:registerAction\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Controller/TiqrAppApiController.php + - message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:createBlockingConfig\\(\\) has no return type specified\\.$#" count: 1 @@ -26,12 +116,32 @@ parameters: path: ../../src/EventSubscriber/LocaleResponseListener.php - - message: "#^Call to an undefined method Behat\\\\Gherkin\\\\Node\\\\NodeInterface\\:\\:getText\\(\\)\\.$#" + message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" count: 1 path: ../../src/Features/Context/ErrorReportContext.php - - message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" + message: "#^Cannot call method getNodeType\\(\\) on Behat\\\\Gherkin\\\\Node\\\\NodeInterface\\|null\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Cannot call method getProjectDir\\(\\) on Symfony\\\\Component\\\\HttpKernel\\\\KernelInterface\\|null\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Cannot call method getSteps\\(\\) on Behat\\\\Gherkin\\\\Node\\\\BackgroundNode\\|null\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Cannot call method getText\\(\\) on Behat\\\\Gherkin\\\\Node\\\\NodeInterface\\|null\\.$#" + count: 1 + path: ../../src/Features/Context/ErrorReportContext.php + + - + message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, string\\|null given\\.$#" count: 1 path: ../../src/Features/Context/ErrorReportContext.php @@ -45,7 +155,202 @@ parameters: count: 1 path: ../../src/Features/Context/TiqrContext.php + - + message: "#^Cannot access offset 'sari' on mixed\\.$#" + count: 2 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot access offset 0 on mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot access offset 1 on mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot access offset 2 on mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot access property \\$service on mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot call method getAttribute\\(\\) on Behat\\\\Mink\\\\Element\\\\NodeElement\\|null\\.$#" + count: 3 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Cannot use array destructuring on mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Parameter \\#1 \\$src of method App\\\\Features\\\\Context\\\\TiqrContext\\:\\:getFileContentsInsecure\\(\\) expects string, string\\|null given\\.$#" + count: 2 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, string\\|null given\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Parameter \\#3 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + + - + message: "#^Property App\\\\Features\\\\Context\\\\TiqrContext\\:\\:\\$metadata \\(stdClass\\) does not accept mixed\\.$#" + count: 1 + path: ../../src/Features/Context/TiqrContext.php + - message: "#^Call to an undefined method Behat\\\\Testwork\\\\Environment\\\\Environment\\:\\:getContext\\(\\)\\.$#" count: 1 path: ../../src/Features/Context/WebContext.php + + - + message: "#^Parameter \\#1 \\$key of method App\\\\Features\\\\Context\\\\WebContext\\:\\:loadPrivateKey\\(\\) expects SAML2\\\\Configuration\\\\PrivateKey, mixed given\\.$#" + count: 1 + path: ../../src/Features/Context/WebContext.php + + - + message: "#^Property App\\\\Features\\\\Context\\\\WebContext\\:\\:\\$previousMinkSession \\(string\\) does not accept string\\|null\\.$#" + count: 1 + path: ../../src/Features/Context/WebContext.php + + - + message: "#^Generator expects value type Symfony\\\\Component\\\\HttpKernel\\\\Bundle\\\\BundleInterface, object given\\.$#" + count: 1 + path: ../../src/Kernel.php + + - + message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Cannot access an offset on mixed\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Cannot access offset mixed on mixed\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Method App\\\\Tiqr\\\\Legacy\\\\TiqrService\\:\\:getAuthenticationSessionKey\\(\\) should return string but returns mixed\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Method App\\\\Tiqr\\\\Legacy\\\\TiqrService\\:\\:getUserId\\(\\) should return string but returns mixed\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Parameter \\#1 \\$enrollmentKey of method Tiqr_Service\\:\\:clearEnrollmentState\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Parameter \\#1 \\$value of function count expects array\\|Countable, mixed given\\.$#" + count: 2 + path: ../../src/Tiqr/Legacy/TiqrService.php + + - + message: "#^Cannot access offset 'apikey' on mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Cannot access offset 'arguments' on mixed\\.$#" + count: 4 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Cannot access offset 'certificate' on mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Cannot access offset 'environment' on mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Cannot access offset 'type' on mixed\\.$#" + count: 8 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Method App\\\\Tiqr\\\\TiqrConfiguration\\:\\:getMaxAttempts\\(\\) should return int but returns mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Method App\\\\Tiqr\\\\TiqrConfiguration\\:\\:getMaxTemporarilyLoginAttempts\\(\\) should return int but returns mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Method App\\\\Tiqr\\\\TiqrConfiguration\\:\\:getTemporarilyBlockDuration\\(\\) should return int but returns mixed\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Method App\\\\Tiqr\\\\TiqrConfiguration\\:\\:getTiqrOptions\\(\\) should return array\\\\> but returns array\\\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrConfiguration.php + + - + message: "#^Cannot access offset 'type' on mixed\\.$#" + count: 3 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#1 \\$type of static method Tiqr_StateStorage\\:\\:getStorage\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#1 \\$type of static method Tiqr_UserSecretStorage\\:\\:getSecretStorage\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#1 \\$type of static method Tiqr_UserStorage\\:\\:getStorage\\(\\) expects string, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#2 \\$options of static method Tiqr_StateStorage\\:\\:getStorage\\(\\) expects array, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#2 \\$options of static method Tiqr_UserStorage\\:\\:getStorage\\(\\) expects array, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#3 \\$options of static method Tiqr_UserSecretStorage\\:\\:getSecretStorage\\(\\) expects array, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php + + - + message: "#^Parameter \\#6 \\$accountName of class App\\\\Tiqr\\\\Legacy\\\\TiqrService constructor expects string, mixed given\\.$#" + count: 1 + path: ../../src/Tiqr/TiqrFactory.php diff --git a/src/Features/Context/WebContext.php b/src/Features/Context/WebContext.php index 29251cc9..c77b7d4c 100644 --- a/src/Features/Context/WebContext.php +++ b/src/Features/Context/WebContext.php @@ -20,12 +20,17 @@ use Behat\Behat\Context\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\MinkExtension\Context\MinkContext; +use Exception; use RobRichards\XMLSecLibs\XMLSecurityKey; use SAML2\AuthnRequest; use SAML2\Certificate\PrivateKeyLoader; use SAML2\Configuration\PrivateKey; use SAML2\Constants; use SAML2\XML\saml\Issuer; +use Surfnet\SamlBundle\Entity\IdentityProvider; +use Surfnet\SamlBundle\Entity\ServiceProvider; +use Surfnet\SamlBundle\Entity\StaticServiceProviderRepository; +use Surfnet\SamlBundle\Exception\NotFound; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\KernelInterface; @@ -92,10 +97,7 @@ public function resetGoutteDriver(): void $this->minkContext->getMink()->setDefaultSessionName($this->previousMinkSession); } - /** - * @return \Surfnet\SamlBundle\Entity\IdentityProvider - */ - public function getIdentityProvider() + public function getIdentityProvider(): IdentityProvider { /** @var RequestStack $stack */ $stack = $this->kernel->getContainer()->get('request_stack'); @@ -103,16 +105,19 @@ public function getIdentityProvider() $ip = $this->kernel->getContainer()->get('surfnet_saml.hosted.identity_provider'); $stack->pop(); + if (!$ip instanceof IdentityProvider) { + throw new Exception('No Hosted Identity Provider could be found'); + } + return $ip; } /** - * @return \Surfnet\SamlBundle\Entity\ServiceProvider - * - * @throws \Surfnet\SamlBundle\Exception\NotFound + * @throws NotFound */ - public function getServiceProvider() + public function getServiceProvider(): ServiceProvider { + /** @var StaticServiceProviderRepository $serviceProviders */ $serviceProviders = $this->kernel->getContainer()->get('surfnet_saml.remote.service_providers'); return $serviceProviders->getServiceProvider( 'https://pieter.aai.surfnet.nl/simplesamlphp/module.php/saml/sp/metadata.php/default-sp' @@ -122,7 +127,7 @@ public function getServiceProvider() /** * @Given /^a normal SAML 2.0 AuthnRequest form a unknown service provider$/ * - * @throws \Exception + * @throws Exception */ public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider(): void { @@ -146,7 +151,7 @@ public function aNormalSAMLAuthnRequestFormAUnknownServiceProvider(): void /** * @return XMLSecurityKey - * @throws \Exception + * @throws Exception */ private function loadPrivateKey(PrivateKey $key): \RobRichards\XMLSecLibs\XMLSecurityKey { diff --git a/src/Service/UserAgentMatcher.php b/src/Service/UserAgentMatcher.php index f0286830..8412f2f2 100644 --- a/src/Service/UserAgentMatcher.php +++ b/src/Service/UserAgentMatcher.php @@ -29,6 +29,9 @@ public function __construct(private readonly string $pattern) public function isOfficialTiqrMobileApp(Request $request): bool { $userAgent = $request->headers->get('User-Agent'); + if (!$userAgent) { + return false; + } $result = preg_match($this->pattern, $userAgent); return $result === 1; } diff --git a/src/Tiqr/Legacy/TiqrService.php b/src/Tiqr/Legacy/TiqrService.php index 2e780c12..3dfb4f5f 100644 --- a/src/Tiqr/Legacy/TiqrService.php +++ b/src/Tiqr/Legacy/TiqrService.php @@ -309,7 +309,7 @@ public function sendNotification(string $notificationType, string $notificationA if (false === $translatedAddress) { throw new TiqrServerRuntimeException(sprintf('Error translating address for "%s"', $notificationAddress)); } - $this->tiqrService->sendAuthNotification($this->getAuthenticationSessionKey(), $notificationType, $translatedAddress); + $this->tiqrService->sendAuthNotification($this->getAuthenticationSessionKey(), $notificationType, (string) $translatedAddress); } catch (Exception $e) { throw TiqrServerRuntimeException::fromOriginalException($e); } From 5321b999d24166c22e81fdc4e976f575647f4936 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 9 Jan 2024 10:51:55 +0100 Subject: [PATCH 16/52] Remove http downgrade logic --- dev/Command/AuthenticationCommand.php | 5 +++-- dev/Command/RegistrationCommand.php | 14 +++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dev/Command/AuthenticationCommand.php b/dev/Command/AuthenticationCommand.php index fa3cfbeb..9c41b126 100644 --- a/dev/Command/AuthenticationCommand.php +++ b/dev/Command/AuthenticationCommand.php @@ -72,7 +72,7 @@ protected function configure(): void ->setHelp('Give the url as argument.'); } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { // Fetching the metadata from the Tiqr IDP. $path = $input->getArgument('path'); @@ -133,7 +133,7 @@ protected function execute(InputInterface $input, OutputInterface $output) 'Please login manually:', $this->decorateResult($response), ]); - return; + return 1; } $authenticationBody = [ @@ -161,6 +161,7 @@ protected function execute(InputInterface $input, OutputInterface $output) 'Authentication result:', $this->decorateResult($result), ]); + return 0; } protected function decorateResult($text): string diff --git a/dev/Command/RegistrationCommand.php b/dev/Command/RegistrationCommand.php index db3d3501..5af60af5 100644 --- a/dev/Command/RegistrationCommand.php +++ b/dev/Command/RegistrationCommand.php @@ -57,7 +57,7 @@ protected function configure(): void ->setHelp('Give the url as argument.'); } - protected function execute(InputInterface $input, OutputInterface $output): void + protected function execute(InputInterface $input, OutputInterface $output): int { // Fetching the metadata from the Tiqr IDP. $path = $input->getArgument('path'); @@ -68,9 +68,6 @@ protected function execute(InputInterface $input, OutputInterface $output): void throw new RuntimeException('Expected url with tiqrenroll://'); } $url = $matches['url']; - // Route the internal curl request via port 80, the host does not - // listen on port 443 - $url = str_replace('https', 'http', $url); $output->writeln("Fetch metadata endpoint from $url"); $metadataResponse = $this->client->get($url); @@ -83,7 +80,7 @@ protected function execute(InputInterface $input, OutputInterface $output): void if ($metadata === false) { $output->writeln('Metadata has expired'); - return; + return 1; } // Doing the actual registration. @@ -101,9 +98,7 @@ protected function execute(InputInterface $input, OutputInterface $output): void ), $this->decorateResult(json_encode($registrationBody, JSON_PRETTY_PRINT)), ]); - // Route the internal curl request via port 80, the host does not - // listen on port 443 - $metadata->service->enrollmentUrl = str_replace('https', 'http', (string) $metadata->service->enrollmentUrl); + $result = $this->client->post($metadata->service->enrollmentUrl, ['form_params' => $registrationBody]); $resultBody = $result->getBody()->getContents(); $output->writeln([ @@ -114,12 +109,13 @@ protected function execute(InputInterface $input, OutputInterface $output): void if ($resultBody !== 'OK' || $result->getStatusCode() !== 200) { $output->writeln('Enrollment failed'); - return; + return 1; } $output->writeln('Enrollment succeeded'); // Storing result as a new identity. $this->storeIdentity($metadata, $secret, $output); + return 0; } protected function decorateResult($text): string From 3f2de038b51a3eb7d256f8e8f5559336aa1f29a4 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 9 Jan 2024 10:52:12 +0100 Subject: [PATCH 17/52] Repair post upgrade defects --- composer.lock | 6821 ++++++++++++++--------- config/packages/twig.yaml | 2 +- dev/Controller/SPController.php | 21 +- src/Controller/TiqrAppApiController.php | 5 +- 4 files changed, 4141 insertions(+), 2708 deletions(-) diff --git a/composer.lock b/composer.lock index fee7d320..c8c41986 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9713a8728e01c9d8662b77e2b7357ed0", + "content-hash": "07b091fbb274a45d27539393ef43c130", "packages": [ { "name": "beberlei/assert", @@ -134,40 +134,695 @@ "time": "2021-08-15T20:50:18+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.3", + "name": "chillerlan/php-qrcode", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "url": "https://github.com/chillerlan/php-qrcode.git", + "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/468603b687a5fe75c1ff33857a45f1726c7b95a9", + "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "chillerlan/php-settings-container": "^1.2.2", + "ext-mbstring": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phan/phan": "^3.2.2", + "phpunit/phpunit": "^8.5", + "setasign/fpdf": "^1.8.2" + }, + "suggest": { + "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", + "setasign/fpdf": "Required to use the QR FPDF output." + }, + "type": "library", + "autoload": { + "psr-4": { + "chillerlan\\QRCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kazuhiko Arase", + "homepage": "https://github.com/kazuhikoarase" + }, + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + }, + { + "name": "Contributors", + "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors" + } + ], + "description": "A QR code generator. PHP 7.2+", + "homepage": "https://github.com/chillerlan/php-qrcode", + "keywords": [ + "phpqrcode", + "qr", + "qr code", + "qrcode", + "qrcode-generator" + ], + "support": { + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode/tree/3.4.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", + "type": "custom" + }, + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], + "time": "2021-09-03T17:54:45+00:00" + }, + { + "name": "chillerlan/php-settings-container", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/chillerlan/php-settings-container.git", + "reference": "92636df53ad1bc903521d29993de0631e07ca931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/92636df53ad1bc903521d29993de0631e07ca931", + "reference": "92636df53ad1bc903521d29993de0631e07ca931", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "chillerlan\\Settings\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + } + ], + "description": "A container class for immutable settings objects. Not a DI container. PHP 7.2+", + "homepage": "https://github.com/chillerlan/php-settings-container", + "keywords": [ + "PHP7", + "Settings", + "container", + "helper" + ], + "support": { + "issues": "https://github.com/chillerlan/php-settings-container/issues", + "source": "https://github.com/chillerlan/php-settings-container" + }, + "funding": [ + { + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", + "type": "custom" + }, + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], + "time": "2023-12-12T13:50:01+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "72328a11443a0de79967104ad36ba7b30bded134" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/72328a11443a0de79967104ad36ba7b30bded134", + "reference": "72328a11443a0de79967104ad36ba7b30bded134", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.1.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2023-10-03T09:22:33+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-10-09T11:47:59+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.7.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.42", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.13", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4|^6.0", + "symfony/console": "^4.4|^5.4|^6.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.7.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2023-11-19T08:06:58+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + }, + "time": "2023-09-27T20:04:15+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:59:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -196,95 +851,326 @@ "email": "schmittjoh@gmail.com" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ - "annotations", - "docblock", - "parser" + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, - "time": "2023-02-01T09:20:38+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" }, { - "name": "doctrine/deprecations", - "version": "1.1.3", + "name": "doctrine/instantiator", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-14T08:49:07+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.17.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/393679a4795e49b0b3ac317dce84d0f8888f2b77", + "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5 || ^2.1", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^2", + "doctrine/persistence": "^2.4 || ^3", + "ext-ctype": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.13 || ^2", + "doctrine/coding-standard": "^9.0.2 || ^12.0", + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/phpstan": "~1.4.10 || 1.10.35", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "4.30.0 || 5.16.0" }, "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, + "bin": [ + "bin/doctrine" + ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Doctrine\\ORM\\": "lib/Doctrine/ORM" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.17.2" }, - "time": "2024-01-30T19:34:25+00:00" + "time": "2023-12-20T21:47:52+00:00" }, { - "name": "doctrine/lexer", - "version": "2.1.1", + "name": "doctrine/persistence", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + "url": "https://github.com/doctrine/persistence.git", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/63fee8c33bef740db6730eb2a750cd3da6495603", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.21" + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.3.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Doctrine\\Persistence\\": "src/Persistence" } }, "notification-url": "https://packagist.org/downloads/", @@ -300,23 +1186,35 @@ "name": "Roman Borschel", "email": "roman@code-factory.org" }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "mapper", + "object", + "odm", + "orm", + "persistence" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.1" + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.2.0" }, "funding": [ { @@ -328,24 +1226,24 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", "type": "tidelift" } ], - "time": "2024-02-05T11:35:39+00:00" + "time": "2023-05-17T18:32:04+00:00" }, { "name": "edamov/pushok", - "version": "0.14.1", + "version": "0.14.3", "source": { "type": "git", "url": "https://github.com/edamov/pushok.git", - "reference": "1e87abbeb7001d3d0de20ab21b59ad6727b76db3" + "reference": "fe05cba22c93703cf715ccac42ab4d151172ef4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/edamov/pushok/zipball/1e87abbeb7001d3d0de20ab21b59ad6727b76db3", - "reference": "1e87abbeb7001d3d0de20ab21b59ad6727b76db3", + "url": "https://api.github.com/repos/edamov/pushok/zipball/fe05cba22c93703cf715ccac42ab4d151172ef4f", + "reference": "fe05cba22c93703cf715ccac42ab4d151172ef4f", "shasum": "" }, "require": { @@ -356,7 +1254,7 @@ "ext-xml": "*", "lib-curl": ">=7.46.0", "lib-openssl": ">=1.0.2.5", - "php": "^7.2|^8.0", + "php": "^8.0", "web-token/jwt-key-mgmt": "^2.0", "web-token/jwt-signature-algorithm-ecdsa": "^2.0" }, @@ -383,7 +1281,7 @@ ], "authors": [ { - "name": "Arthur Edamov", + "name": "Artur Edamov", "email": "edamov@gmail.com", "homepage": "https://github.com/edamov", "role": "Developer" @@ -399,9 +1297,9 @@ ], "support": { "issues": "https://github.com/edamov/pushok/issues", - "source": "https://github.com/edamov/pushok/tree/0.14.1" + "source": "https://github.com/edamov/pushok/tree/0.14.3" }, - "time": "2022-06-22T13:21:12+00:00" + "time": "2023-04-14T08:48:42+00:00" }, { "name": "fgrosse/phpasn1", @@ -481,37 +1379,47 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.8", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "6.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -564,19 +1472,20 @@ } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -592,33 +1501,37 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:07+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.3", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -655,7 +1568,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.3" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -671,42 +1584,48 @@ "type": "tidelift" } ], - "time": "2023-05-21T12:31:43+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.9.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } @@ -745,6 +1664,11 @@ "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -760,7 +1684,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.9.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -776,99 +1700,70 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:00:37+00:00" - }, - { - "name": "kairos/phpqrcode", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/kairosagency/phpqrcode.git", - "reference": "6770ecbe0e8c7d806c5779ad38b20c9acf5427d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kairosagency/phpqrcode/zipball/6770ecbe0e8c7d806c5779ad38b20c9acf5427d9", - "reference": "6770ecbe0e8c7d806c5779ad38b20c9acf5427d9", - "shasum": "" - }, - "require": { - "php": ">=4.3.10" - }, - "type": "library", - "autoload": { - "files": [ - "qrlib.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL" - ], - "authors": [ - { - "name": "Kairos Agency" - } - ], - "description": "A PHP class to generate QR Code", - "homepage": "http://github.com/kairosagency/phpqrcode", - "keywords": [ - "php", - "qrcode" - ], - "support": { - "source": "https://github.com/kairosagency/phpqrcode/tree/master" - }, - "abandoned": "chillerlan/php-qrcode", - "time": "2013-03-20T17:48:23+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "monolog/monolog", - "version": "1.27.1", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "904713c5929655dc9b97288b69cfeedad610c9a1" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1", - "reference": "904713c5929655dc9b97288b69cfeedad610c9a1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpstan/phpstan": "^0.12.59", - "phpunit/phpunit": "~4.5", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { "Monolog\\": "src/Monolog" @@ -882,11 +1777,11 @@ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "homepage": "https://seld.be" } ], "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ "log", "logging", @@ -894,7 +1789,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/1.27.1" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -906,39 +1801,40 @@ "type": "tidelift" } ], - "time": "2022-06-09T08:53:42+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "openconext/monitor-bundle", - "version": "2.1.0", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/OpenConext/Monitor-bundle.git", - "reference": "f06e967b702bc5d78d85c39ba4a90219af152a67" + "reference": "5aab82ce7935a0c99901f123e52174db1ca52403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Monitor-bundle/zipball/f06e967b702bc5d78d85c39ba4a90219af152a67", - "reference": "f06e967b702bc5d78d85c39ba4a90219af152a67", + "url": "https://api.github.com/repos/OpenConext/Monitor-bundle/zipball/5aab82ce7935a0c99901f123e52174db1ca52403", + "reference": "5aab82ce7935a0c99901f123e52174db1ca52403", "shasum": "" }, "require": { - "php": ">=5.4,<8.0-dev", - "symfony/dependency-injection": ">=3.4,<5", - "symfony/framework-bundle": ">=3.4,<5", - "webmozart/assert": "^1.2" + "doctrine/orm": "^2.9", + "php": ">=8.2, <9.0-dev", + "symfony/dependency-injection": "^5.4|^6.3|^7.0", + "symfony/framework-bundle": "^5.4|^6.3|^7.0", + "webmozart/assert": "^1.10" }, "require-dev": { - "jakub-onderka/php-parallel-lint": "^0.9.2", - "malukenho/docheader": "^0.1.6", - "matthiasnoback/symfony-config-test": "^2.1", - "mockery/mockery": "~0.9", - "phpdocumentor/reflection-docblock": "3.3.*", + "malukenho/docheader": "^1.0", + "matthiasnoback/symfony-config-test": "^4.3", + "mockery/mockery": "^1.3.5|^1.4.4", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpdocumentor/reflection-docblock": "^5.2", "phpmd/phpmd": "^2.6", - "phpunit/php-token-stream": "1.4.*", - "phpunit/phpunit": "^5.7", - "sebastian/phpcpd": "^3.0", - "squizlabs/php_codesniffer": "^3.1" + "phpunit/php-token-stream": "^3.1.3|^4.0.4", + "phpunit/phpunit": "^9.6|^10.4", + "sebastian/phpcpd": "^4.1|^5.0|^6.0", + "squizlabs/php_codesniffer": "^3.6" }, "type": "symfony-bundle", "autoload": { @@ -950,7 +1846,7 @@ "license": [ "Apache-2.0" ], - "description": "A Symfony 4 bundle that facilitates health and info endpoints to a Symfony application. The bundle is backwards compatible with Symfony 2 projects.", + "description": "A Symfony 5/6/7 bundle that facilitates health and info endpoints to a Symfony application.", "keywords": [ "OpenConext", "health", @@ -960,26 +1856,26 @@ ], "support": { "issues": "https://github.com/OpenConext/Monitor-bundle/issues", - "source": "https://github.com/OpenConext/Monitor-bundle/tree/2.1.0" + "source": "https://github.com/OpenConext/Monitor-bundle/tree/4.0.2" }, - "time": "2021-09-28T11:09:57+00:00" + "time": "2023-11-09T10:06:21+00:00" }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -999,7 +1895,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -1009,28 +1905,81 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -1057,9 +2006,59 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-client", @@ -1170,16 +2169,16 @@ }, { "name": "psr/http-message", - "version": "1.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { @@ -1188,7 +2187,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1203,7 +2202,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -1217,36 +2216,36 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1267,9 +2266,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "ralouphie/getallheaders", @@ -1357,129 +2356,45 @@ }, "time": "2020-09-05T13:00:25+00:00" }, - { - "name": "sensio/framework-extra-bundle", - "version": "v5.6.1", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "430d14c01836b77c28092883d195a43ce413ee32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/430d14c01836b77c28092883d195a43ce413ee32", - "reference": "430d14c01836b77c28092883d195a43ce413ee32", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0" - }, - "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1", - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.5", - "nyholm/psr7": "^1.1", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/doctrine-bridge": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/monolog-bridge": "^4.0|^5.0", - "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9", - "symfony/psr-http-message-bridge": "^1.1", - "symfony/security-bundle": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" - }, - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "support": { - "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v5.6.1" - }, - "abandoned": "Symfony", - "time": "2020-08-25T19:10:18+00:00" - }, { "name": "simplesamlphp/saml2", - "version": "v3.2.6", + "version": "v4.6.10", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751" + "reference": "a6c46e8134df2686da9ad44bc9b8f85443c03440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/a56e46ef8e0c5245a4ca7facc3d308b493215751", - "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/a6c46e8134df2686da9ad44bc9b8f85443c03440", + "reference": "a6c46e8134df2686da9ad44bc9b8f85443c03440", "shasum": "" }, "require": { "ext-dom": "*", "ext-openssl": "*", "ext-zlib": "*", - "php": ">=5.4", - "psr/log": "~1.0", - "robrichards/xmlseclibs": "^3.0" + "php": ">=7.1 || ^8.0", + "psr/log": "~1.1 || ^2.0 || ^3.0", + "robrichards/xmlseclibs": "^3.1.1", + "webmozart/assert": "^1.9" }, "require-dev": { - "mockery/mockery": "~0.9", - "phpmd/phpmd": "~1.5", - "phpunit/phpunit": "~4", - "sebastian/phpcpd": "~1.4", - "sensiolabs/security-checker": "~1.1", - "squizlabs/php_codesniffer": "~1.4" + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0", + "simplesamlphp/simplesamlphp-test-framework": "~0.1.0", + "squizlabs/php_codesniffer": "~3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "v3.1.x-dev" + "dev-master": "v4.2.x-dev" } }, "autoload": { - "files": [ - "src/_autoload.php" - ], - "psr-0": { - "SAML2\\": "src/" + "psr-4": { + "SAML2\\": "src/SAML2" } }, "notification-url": "https://packagist.org/downloads/", @@ -1495,9 +2410,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/master" + "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.10" }, - "time": "2018-11-20T11:11:28+00:00" + "time": "2023-05-31T16:03:51+00:00" }, { "name": "spomky-labs/base64url", @@ -1566,45 +2481,54 @@ }, { "name": "surfnet/stepup-bundle", - "version": "4.2.6", + "version": "6.0.10", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-bundle.git", - "reference": "c7239a4bff489cc40ebb0dd34c5326d5dfac5046" + "reference": "1d33328810c7c17ecf574a233cd0239acefd589c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-bundle/zipball/c7239a4bff489cc40ebb0dd34c5326d5dfac5046", - "reference": "c7239a4bff489cc40ebb0dd34c5326d5dfac5046", + "url": "https://api.github.com/repos/OpenConext/Stepup-bundle/zipball/1d33328810c7c17ecf574a233cd0239acefd589c", + "reference": "1d33328810c7c17ecf574a233cd0239acefd589c", "shasum": "" }, "require": { "ext-gmp": "*", "ext-json": "*", "ext-openssl": "*", - "guzzlehttp/guzzle": "^6.0", - "monolog/monolog": "~1.11", - "php": "^7.2", - "sensio/framework-extra-bundle": "^5.4", - "surfnet/stepup-saml-bundle": "^4.1.8", - "symfony/config": "^4.4", - "symfony/dependency-injection": "^4.4", - "symfony/form": "^4.4", - "symfony/framework-bundle": "^4.4", - "symfony/http-kernel": "^4.4", - "symfony/twig-bridge": "^4.4", - "symfony/validator": "^4.4" + "guzzlehttp/guzzle": "^7.8", + "monolog/monolog": "^3", + "php": "^8.2", + "surfnet/stepup-saml-bundle": "^6.0", + "symfony/config": "^5.4|^6.3", + "symfony/dependency-injection": "^5.4|^6.3", + "symfony/form": "^5.4|^6.3", + "symfony/framework-bundle": "^5.4|^6.3", + "symfony/http-kernel": "^5.4|^6.3", + "symfony/twig-bridge": "^5.4|^6.3", + "symfony/validator": "^5.4|^6.3" }, "require-dev": { - "mockery/mockery": "^1.3", - "phpmd/phpmd": "^2.0", - "phpunit/phpunit": "^8.0", - "sebastian/phpcpd": "^4.0", - "sensiolabs/security-checker": "^5.0", - "squizlabs/php_codesniffer": "^3.4", - "symfony/phpunit-bridge": "^4.4" + "mockery/mockery": "^1.5", + "overtrue/phplint": "*", + "phpmd/phpmd": "^2.13", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^9.6", + "sebastian/phpcpd": "^6.0", + "slevomat/coding-standard": "^8.13", + "squizlabs/php_codesniffer": "^3.7.1", + "symfony/phpunit-bridge": "^5.4|^6.3" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "./ci/qa/extension.neon" + ] + } + }, "autoload": { "psr-4": { "Surfnet\\StepupBundle\\": "src" @@ -1614,53 +2538,57 @@ "license": [ "Apache-2.0" ], - "description": "A Symfony 3 bundle (with Symfony 4.3 support) that holds shared code and framework integration for all Step-up applications.", + "description": "A Symfony 5|6 bundle that holds shared code and framework integration for all Step-up applications.", "keywords": [ "stepup", - "suaas", - "surfnet" + "surf", + "surf secure id" ], "support": { "issues": "https://github.com/OpenConext/Stepup-bundle/issues", - "source": "https://github.com/OpenConext/Stepup-bundle/tree/4.2.6" + "source": "https://github.com/OpenConext/Stepup-bundle/tree/6.0.10" }, - "time": "2023-02-16T15:19:16+00:00" + "time": "2024-01-09T10:11:10+00:00" }, { "name": "surfnet/stepup-gssp-bundle", - "version": "4.0.2", + "version": "5.0.12", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-gssp-bundle.git", - "reference": "cfe21c9d922146ecf193e490307fdb1a4beeaaba" + "reference": "466cf5b03a76165b67f940d4d146ea6ce4007e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-gssp-bundle/zipball/cfe21c9d922146ecf193e490307fdb1a4beeaaba", - "reference": "cfe21c9d922146ecf193e490307fdb1a4beeaaba", + "url": "https://api.github.com/repos/OpenConext/Stepup-gssp-bundle/zipball/466cf5b03a76165b67f940d4d146ea6ce4007e08", + "reference": "466cf5b03a76165b67f940d4d146ea6ce4007e08", "shasum": "" }, "require": { "beberlei/assert": "^3", "ext-openssl": "*", - "php": "~7.2", - "sensio/framework-extra-bundle": "^5.4", - "surfnet/stepup-saml-bundle": "^4.2.0", - "symfony/dependency-injection": "^4.4", - "symfony/framework-bundle": "^4.4", - "symfony/monolog-bundle": "^3.6.0" + "php": "^8.2", + "surfnet/stepup-saml-bundle": "^6.0", + "symfony/dependency-injection": "^5.4|^6.4", + "symfony/framework-bundle": "^5.4|^6.4", + "symfony/monolog-bundle": "^3.8" }, "require-dev": { - "behat/behat": "^3.5", + "behat/behat": "^3.13", "jakub-onderka/php-parallel-lint": "^1", "malukenho/docheader": "^0", - "mockery/mockery": "^1", - "phpmd/phpmd": "^2", - "phpunit/phpcov": "^6", - "phpunit/phpunit": "^8", - "sebastian/phpcpd": "^4", - "squizlabs/php_codesniffer": "^3", - "symfony/phpunit-bridge": "~4" + "mockery/mockery": "^1.5", + "overtrue/phplint": "*", + "phpmd/phpmd": "^2.13", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpcov": "^8.2", + "phpunit/phpunit": "^9.6", + "rector/rector": "^0.18.5", + "sebastian/phpcpd": "^6.0", + "slevomat/coding-standard": "^8.13", + "squizlabs/php_codesniffer": "^3.7.1", + "symfony/phpunit-bridge": "^5.4|^6.4" }, "type": "symfony-bundle", "autoload": { @@ -1672,50 +2600,62 @@ "license": [ "Apache-2.0" ], - "description": "A Symfony 3 bundle (with SF 4 support) to aid the creation of GSSP (Generic SAML Step-up Provider) device support.", + "description": "A Symfony 5|6 bundle to aid the creation of GSSP (Generic SAML Step-up Provider) device support.", "support": { "issues": "https://github.com/OpenConext/Stepup-gssp-bundle/issues", - "source": "https://github.com/OpenConext/Stepup-gssp-bundle/tree/4.0.2" + "source": "https://github.com/OpenConext/Stepup-gssp-bundle/tree/5.0.12" }, - "time": "2021-11-23T10:34:16+00:00" + "time": "2023-12-06T09:58:41+00:00" }, { "name": "surfnet/stepup-saml-bundle", - "version": "4.4.3", + "version": "6.0.11", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-saml-bundle.git", - "reference": "e3f2bc55e876bbd4c40caa9235eb78a79a8d9651" + "reference": "eb76841769878f10f83342d1ca515bd71b2fdc97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/e3f2bc55e876bbd4c40caa9235eb78a79a8d9651", - "reference": "e3f2bc55e876bbd4c40caa9235eb78a79a8d9651", + "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/eb76841769878f10f83342d1ca515bd71b2fdc97", + "reference": "eb76841769878f10f83342d1ca515bd71b2fdc97", "shasum": "" }, "require": { "ext-dom": "*", "ext-openssl": "*", - "php": ">=7.2,<8.0-dev", - "robrichards/xmlseclibs": "^3.0.4", - "simplesamlphp/saml2": "3.2.*", - "symfony/dependency-injection": "^4.4", - "symfony/framework-bundle": "^4.4", - "symfony/templating": "^4.4", - "twig/twig": "^2" + "php": "^8.1", + "robrichards/xmlseclibs": "^3.1.1", + "simplesamlphp/saml2": "^4.6", + "symfony/dependency-injection": "^6.3", + "symfony/framework-bundle": "^6.3", + "symfony/security-bundle": "^6.3", + "symfony/templating": "^6.3", + "twig/twig": "^3" }, "require-dev": { - "jasny/phpunit-xsdvalidation": "^1.0", - "mockery/mockery": "~0.9", + "ext-zlib": "*", + "mbhsoft/phpunit-xsdvalidation": "^3.0", + "mockery/mockery": "^1.5", + "overtrue/phplint": "*", "phpmd/phpmd": "^2.6", - "phpunit/phpunit": "^5.7", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", "psr/log": "~1.0", - "sebastian/exporter": "~2.0", - "sebastian/phpcpd": "^2.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.4" + "sebastian/exporter": "^4.0.5", + "sebastian/phpcpd": "^6.0", + "squizlabs/php_codesniffer": "^3.7.1", + "symfony/phpunit-bridge": "^6.3" }, "type": "symfony-bundle", + "extra": { + "phpstan": { + "includes": [ + "./ci/qa/extension.neon" + ] + } + }, "autoload": { "psr-4": { "Surfnet\\SamlBundle\\": "src" @@ -1725,7 +2665,7 @@ "license": [ "Apache-2.0" ], - "description": "A Symfony 4 bundle that integrates the simplesamlphp\\saml2 library with Symfony.", + "description": "A Symfony 6 bundle that integrates the simplesamlphp\\saml2 library with Symfony.", "keywords": [ "SAML2", "saml", @@ -1735,34 +2675,34 @@ ], "support": { "issues": "https://github.com/OpenConext/Stepup-saml-bundle/issues", - "source": "https://github.com/OpenConext/Stepup-saml-bundle/tree/4.4.3" + "source": "https://github.com/OpenConext/Stepup-saml-bundle/tree/6.0.11" }, - "time": "2023-05-15T08:05:57+00:00" + "time": "2023-10-31T13:31:24+00:00" }, { "name": "symfony/asset", - "version": "v4.4.46", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "6ef0f9f352f90c469e8b363ebc038d81a7198873" + "reference": "c1108eb27a61ef4ac29504ef61c028648308036c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/6ef0f9f352f90c469e8b363ebc038d81a7198873", - "reference": "6ef0f9f352f90c469e8b363ebc038d81a7198873", + "url": "https://api.github.com/repos/symfony/asset/zipball/c1108eb27a61ef4ac29504ef61c028648308036c", + "reference": "c1108eb27a61ef4ac29504ef61c028648308036c", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, - "require-dev": { - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "conflict": { + "symfony/http-foundation": "<5.4" }, - "suggest": { - "symfony/http-foundation": "" + "require-dev": { + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -1790,7 +2730,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v4.4.46" + "source": "https://github.com/symfony/asset/tree/v6.4.0" }, "funding": [ { @@ -1806,62 +2746,61 @@ "type": "tidelift" } ], - "time": "2022-08-30T22:05:24+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/cache", - "version": "v5.4.35", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", + "url": "https://api.github.com/repos/symfony/cache/zipball/14a75869bbb41cb35bc5d9d322473928c6f3f978", + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" }, "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "classmap": [ + "Traits/ValueWrapper.php" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -1887,7 +2826,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.35" + "source": "https://github.com/symfony/cache/tree/v6.4.2" }, "funding": [ { @@ -1903,33 +2842,30 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + "reference": "1d74b127da04ffa87aa940abe15446fa89653778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony/cache-implementation": "" + "php": ">=8.1", + "psr/cache": "^3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -1966,7 +2902,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" }, "funding": [ { @@ -1982,46 +2918,37 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { - "name": "symfony/config", - "version": "v4.4.44", + "name": "symfony/clock", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658" + "url": "https://github.com/symfony/clock.git", + "reference": "0639710e65f73cc504167958ea29be6de5c7177a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658", - "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658", + "url": "https://api.github.com/repos/symfony/clock/zipball/0639710e65f73cc504167958ea29be6de5c7177a", + "reference": "0639710e65f73cc504167958ea29be6de5c7177a", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" - }, - "conflict": { - "symfony/finder": "<3.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "provide": { + "psr/clock-implementation": "1.0" }, "type": "library", "autoload": { + "files": [ + "Resources/now.php" + ], "psr-4": { - "Symfony\\Component\\Config\\": "" + "Symfony\\Component\\Clock\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -2033,18 +2960,23 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "description": "Decouples applications from the system clock", "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], "support": { - "source": "https://github.com/symfony/config/tree/v4.4.44" + "source": "https://github.com/symfony/clock/tree/v6.4.2" }, "funding": [ { @@ -2060,58 +2992,43 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2023-12-27T00:32:33+00:00" }, { - "name": "symfony/console", - "version": "v4.4.49", + "name": "symfony/config", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9" + "url": "https://github.com/symfony/config.git", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", + "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\Config\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -2131,10 +3048,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v4.4.49" + "source": "https://github.com/symfony/config/tree/v6.4.0" }, "funding": [ { @@ -2150,36 +3067,56 @@ "type": "tidelift" } ], - "time": "2022-11-05T17:10:16+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { - "name": "symfony/debug", - "version": "v4.4.44", + "name": "symfony/console", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "1a692492190773c5310bc7877cb590c04c2f05be" + "url": "https://github.com/symfony/console.git", + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be", - "reference": "1a692492190773c5310bc7877cb590c04c2f05be", + "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2|^3" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "symfony/http-kernel": "<3.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -2199,10 +3136,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to ease debugging PHP code", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.44" + "source": "https://github.com/symfony/console/tree/v6.4.2" }, "funding": [ { @@ -2218,50 +3161,44 @@ "type": "tidelift" } ], - "abandoned": "symfony/error-handler", - "time": "2022-07-28T16:29:46+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.49", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "9065fe97dbd38a897e95ea254eb5ddfe1310f734" + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9065fe97dbd38a897e95ea254eb5ddfe1310f734", - "reference": "9065fe97dbd38a897e95ea254eb5ddfe1310f734", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/container": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10|^7.0" }, "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<4.4.26" + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" }, "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^4.4.26|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2289,7 +3226,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v4.4.49" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.2" }, "funding": [ { @@ -2305,29 +3242,29 @@ "type": "tidelift" } ], - "time": "2022-11-16T16:18:09+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2356,7 +3293,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -2372,32 +3309,39 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.44", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "be731658121ef2d8be88f3a1ec938148a9237291" + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291", - "reference": "be731658121ef2d8be88f3a1ec938148a9237291", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/debug": "^4.4.5", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { @@ -2424,7 +3368,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v4.4.44" + "source": "https://github.com/symfony/error-handler/tree/v6.4.0" }, "funding": [ { @@ -2440,47 +3384,43 @@ "type": "tidelift" } ], - "time": "2022-07-28T16:29:46+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.44", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" + "reference": "e95216850555cd55e71b857eb9d6c2674124603a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", + "reference": "e95216850555cd55e71b857eb9d6c2674124603a", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2508,7 +3448,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.2" }, "funding": [ { @@ -2524,33 +3464,30 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.10.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", - "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2587,7 +3524,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -2603,27 +3540,26 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.35", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -2651,7 +3587,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.35" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -2667,26 +3603,27 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/finder", - "version": "v5.4.35", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -2714,7 +3651,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.35" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -2730,32 +3667,32 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/flex", - "version": "v1.21.5", + "version": "v2.4.3", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "6b46a001639f810d01f4f1b39be1291192a711d4" + "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/6b46a001639f810d01f4f1b39be1291192a711d4", - "reference": "6b46a001639f810d01f4f1b39be1291192a711d4", + "url": "https://api.github.com/repos/symfony/flex/zipball/6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", + "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": ">=7.1" + "composer-plugin-api": "^2.1", + "php": ">=8.0" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/dotenv": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" + "composer/composer": "^2.1", + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "type": "composer-plugin", "extra": { @@ -2779,7 +3716,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.21.5" + "source": "https://github.com/symfony/flex/tree/v2.4.3" }, "funding": [ { @@ -2795,61 +3732,60 @@ "type": "tidelift" } ], - "time": "2024-02-05T18:04:39+00:00" + "time": "2024-01-02T11:08:32+00:00" }, { "name": "symfony/form", - "version": "v4.4.48", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "e1d137b13e0ec2cb5c5e38debca7a510c6f858c6" + "reference": "10649ab710b58a04bcf1886f005ccab58d9cf0a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/e1d137b13e0ec2cb5c5e38debca7a510c6f858c6", - "reference": "e1d137b13e0ec2cb5c5e38debca7a510c6f858c6", + "url": "https://api.github.com/repos/symfony/form/zipball/10649ab710b58a04bcf1886f005ccab58d9cf0a4", + "reference": "10649ab710b58a04bcf1886f005ccab58d9cf0a4", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher": "^4.3", - "symfony/intl": "^4.4|^5.0", - "symfony/options-resolver": "~4.3|^5.0", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/options-resolver": "^5.4|^6.0|^7.0", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/property-access": "^3.4.40|^4.4.8|^5.0.8", - "symfony/service-contracts": "^1.1|^2" + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<4.3", - "symfony/dependency-injection": "<3.4", - "symfony/doctrine-bridge": "<3.4", - "symfony/framework-bundle": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/intl": "<4.3", - "symfony/translation": "<4.2", - "symfony/twig-bridge": "<3.4.5|<4.0.5,>=4.0" + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", + "symfony/error-handler": "<5.4", + "symfony/framework-bundle": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.3" }, "require-dev": { - "doctrine/collections": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^4.3|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/security-csrf": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/validator": "^4.4.17|^5.1.9", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "symfony/security-csrf": "For protecting forms against CSRF attacks.", - "symfony/twig-bridge": "For templating with Twig.", - "symfony/validator": "For form validation." + "doctrine/collections": "^1.0|^2.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2877,7 +3813,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v4.4.48" + "source": "https://github.com/symfony/form/tree/v6.4.1" }, "funding": [ { @@ -2893,109 +3829,111 @@ "type": "tidelift" } ], - "time": "2022-10-22T05:50:33+00:00" + "time": "2023-11-30T11:08:34+00:00" }, { "name": "symfony/framework-bundle", - "version": "v4.4.51", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "8f1698ff2a97be8442fb202ac93111f7b6b40781" + "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8f1698ff2a97be8442fb202ac93111f7b6b40781", - "reference": "8f1698ff2a97be8442fb202ac93111f7b6b40781", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c26a221e0462027d1f9d4a802ed63f8ab07a43d0", + "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=7.1.3", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.4.11|~5.0.11|^5.1.3", - "symfony/dependency-injection": "^4.4.38|^5.0.1", - "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4", + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.1|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/routing": "^4.4.12|^5.1.4" + "symfony/routing": "^6.4|^7.0" }, "conflict": { + "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", - "phpdocumentor/type-resolver": "<0.3.0|1.3.*", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.4", - "symfony/browser-kit": "<4.3", - "symfony/console": "<4.4.21", - "symfony/dom-crawler": "<4.3", - "symfony/dotenv": "<4.3.6", - "symfony/form": "<4.3.5", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", - "symfony/messenger": "<4.4", - "symfony/mime": "<4.4", - "symfony/property-info": "<3.4", - "symfony/security-bundle": "<4.4", - "symfony/serializer": "<4.4", - "symfony/stopwatch": "<3.4", - "symfony/translation": "<4.4", - "symfony/twig-bridge": "<4.1.1", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.3.6" + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<5.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.3", + "symfony/console": "<5.4|>=7.0", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<6.3", + "symfony/lock": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<6.3", + "symfony/mime": "<6.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/scheduler": "<6.4", + "symfony/security-core": "<5.4", + "symfony/security-csrf": "<5.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<5.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", + "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", - "paragonie/sodium_compat": "^1.8", + "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/console": "^4.4.42|^5.4.9", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dom-crawler": "^4.4.30|^5.3.7", - "symfony/dotenv": "^4.3.6|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.3.5|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-client": "^6.3|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.3|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/security-core": "^3.4|^4.4|^5.2", - "symfony/security-csrf": "^3.4|^4.0|^5.0", - "symfony/security-http": "^3.4|^4.0|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.3.6|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/scheduler": "^6.4|^7.0", + "symfony/security-bundle": "^5.4|^6.0|^7.0", + "symfony/semaphore": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.10|^3.0" }, "type": "symfony-bundle", "autoload": { @@ -3023,85 +3961,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v4.4.51" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-05T15:42:31+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", - "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.2" }, "funding": [ { @@ -3117,39 +3977,40 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.35", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-php83": "^1.27" }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "conflict": { + "symfony/cache": "<6.3" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -3177,7 +4038,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" }, "funding": [ { @@ -3193,67 +4054,76 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.51", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7" + "reference": "13e8387320b5942d0dc408440c888e2d526efef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7", - "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/13e8387320b5942d0dc408440c888e2d526efef4", + "reference": "13e8387320b5942d0dc408440c888e2d526efef4", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4.30|^5.3.7", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.43|<2.13,>=2" + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.43|^2.13|^3.0.4" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" }, "type": "library", "autoload": { @@ -3270,107 +4140,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.51" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-11-10T13:31:29+00:00" - }, - { - "name": "symfony/intl", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/intl.git", - "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/2fb503f81cd8032a624c55764d1fbaf893aa3cf4", - "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/var-exporter": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Intl\\": "" - }, - "classmap": [ - "Resources/stubs" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Eriksen Costa", - "email": "eriksen.costa@infranology.com.br" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", - "keywords": [ - "i18n", - "icu", - "internationalization", - "intl", - "l10n", - "localization" - ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.35" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.2" }, "funding": [ { @@ -3386,46 +4167,42 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-30T15:31:44+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.2.12", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "2c3943d7c0100983f9c0a82807555273353e3539" + "reference": "c262c2f54ce7e160a231808817f306f880c32750" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/2c3943d7c0100983f9c0a82807555273353e3539", - "reference": "2c3943d7c0100983f9c0a82807555273353e3539", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/c262c2f54ce7e160a231808817f306f880c32750", + "reference": "c262c2f54ce7e160a231808817f306f880c32750", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2", - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "monolog/monolog": "^1.25.1|^2|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<4.4", - "symfony/http-foundation": "<4.4" + "symfony/console": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/security-core": "<6.0" }, "require-dev": { - "symfony/console": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", - "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -3453,7 +4230,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.12" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.0" }, "funding": [ { @@ -3469,34 +4246,34 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:54:19+00:00" + "time": "2023-10-31T08:18:17+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v3.8.0", + "version": "v3.10.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d" + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d", - "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", "shasum": "" }, "require": { - "monolog/monolog": "^1.22 || ^2.0 || ^3.0", - "php": ">=7.1.3", - "symfony/config": "~4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0", - "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0" + "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", + "php": ">=7.2.5", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "symfony/console": "~4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.2 || ^6.0", - "symfony/yaml": "~4.4 || ^5.0 || ^6.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -3534,7 +4311,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.8.0" + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" }, "funding": [ { @@ -3550,27 +4327,25 @@ "type": "tidelift" } ], - "time": "2022-05-10T14:24:36+00:00" + "time": "2023-11-06T17:08:13+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.21", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + "reference": "22301f0e7fdeaacc14318928612dee79be99860e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", - "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -3603,7 +4378,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" }, "funding": [ { @@ -3619,45 +4394,40 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-08-08T10:16:24+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "name": "symfony/password-hasher", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "url": "https://github.com/symfony/password-hasher.git", + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/e001f752338a49d644ee0523fd7891aabaccb7e2", + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, - "provide": { - "ext-ctype": "*" + "conflict": { + "symfony/security-core": "<5.4" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3665,24 +4435,22 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Provides password hashing utilities", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "hashing", + "password" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.0" }, "funding": [ { @@ -3698,30 +4466,36 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { - "ext-intl": "For best performance" + "ext-ctype": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3732,7 +4506,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3741,26 +4515,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", + "ctype", "polyfill", - "portable", - "shim" + "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -3776,32 +4548,33 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3812,7 +4585,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3821,30 +4594,26 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "idn", + "grapheme", "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -3860,30 +4629,33 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "name": "symfony/polyfill-intl-icu", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "e46b4da57951a16053cd751f63f4a24292788157" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", + "reference": "e46b4da57951a16053cd751f63f4a24292788157", "shasum": "" }, "require": { "php": ">=7.1" }, "suggest": { - "ext-intl": "For best performance" + "ext-intl": "For best performance and support of other locales than \"en\"" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3894,10 +4666,13 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Polyfill\\Intl\\Icu\\": "" }, "classmap": [ "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3914,18 +4689,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill for intl's ICU-related data and classes", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "icu", "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" }, "funding": [ { @@ -3941,33 +4716,33 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-03-21T17:27:24+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-mbstring": "*" - }, "suggest": { - "ext-mbstring": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3978,8 +4753,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3995,17 +4773,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", + "intl", + "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -4021,27 +4800,36 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4052,7 +4840,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4069,16 +4857,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -4094,20 +4883,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "name": "symfony/polyfill-php72", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -4115,6 +4904,9 @@ }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4125,11 +4917,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4145,7 +4934,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4154,7 +4943,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -4170,20 +4959,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -4191,6 +4980,9 @@ }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4234,7 +5026,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -4250,27 +5042,31 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "name": "symfony/polyfill-php83", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4281,7 +5077,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -4301,7 +5097,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4310,7 +5106,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -4326,33 +5122,29 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.35", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" + "reference": "75f6990ae8e8040dd587162f3f1863f755957129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", + "url": "https://api.github.com/repos/symfony/property-access/zipball/75f6990ae8e8040dd587162f3f1863f755957129", + "reference": "75f6990ae8e8040dd587162f3f1863f755957129", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/property-info": "^5.2|^6.0" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/cache": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." + "symfony/cache": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4391,7 +5183,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.35" + "source": "https://github.com/symfony/property-access/tree/v6.4.0" }, "funding": [ { @@ -4407,46 +5199,38 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.35", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", + "url": "https://api.github.com/repos/symfony/property-info/zipball/288be71bae2ebc88676f5d3a03d23f70b278fcc1", + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/string": "^5.1|^6.0" + "php": ">=8.1", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<4.4" + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<5.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" - }, - "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4482,7 +5266,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.35" + "source": "https://github.com/symfony/property-info/tree/v6.4.0" }, "funding": [ { @@ -4498,46 +5282,40 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:43:50+00:00" + "time": "2023-11-25T16:57:46+00:00" }, { "name": "symfony/routing", - "version": "v4.4.44", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae" + "reference": "98eab13a07fddc85766f1756129c69f207ffbc21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/f7751fd8b60a07f3f349947a309b5bdfce22d6ae", - "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae", + "url": "https://api.github.com/repos/symfony/routing/zipball/98eab13a07fddc85766f1756129c69f207ffbc21", + "reference": "98eab13a07fddc85766f1756129c69f207ffbc21", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4571,7 +5349,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v4.4.44" + "source": "https://github.com/symfony/routing/tree/v6.4.2" }, "funding": [ { @@ -4587,64 +5365,44 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { - "name": "symfony/security-bundle", - "version": "v4.4.50", + "name": "symfony/runtime", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/security-bundle.git", - "reference": "076fd2088ada33d760758d98ff07ddedbf567946" + "url": "https://github.com/symfony/runtime.git", + "reference": "86539231fadfdc7f7e9911d6fa7ed84a606e7d34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/076fd2088ada33d760758d98ff07ddedbf567946", - "reference": "076fd2088ada33d760758d98ff07ddedbf567946", + "url": "https://api.github.com/repos/symfony/runtime/zipball/86539231fadfdc7f7e9911d6fa7ed84a606e7d34", + "reference": "86539231fadfdc7f7e9911d6fa7ed84a606e7d34", "shasum": "" }, "require": { - "ext-xml": "*", - "php": ">=7.1.3", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/polyfill-php80": "^1.16", - "symfony/security-core": "^4.4", - "symfony/security-csrf": "^4.2|^5.0", - "symfony/security-guard": "^4.2|^5.0", - "symfony/security-http": "^4.4.50" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.1" }, "conflict": { - "symfony/browser-kit": "<4.2", - "symfony/console": "<3.4", - "symfony/framework-bundle": "<4.4", - "symfony/ldap": "<4.4", - "symfony/twig-bundle": "<4.4" + "symfony/dotenv": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/browser-kit": "^4.2|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^3.4|^4.0|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/translation": "^3.4|^4.0|^5.0", - "symfony/twig-bridge": "^3.4|^4.0|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" }, - "type": "symfony-bundle", "autoload": { "psr-4": { - "Symfony\\Bundle\\SecurityBundle\\": "" + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" }, "exclude-from-classmap": [ "/Tests/" @@ -4656,18 +5414,21 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "description": "Enables decoupling PHP applications from global state", "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], "support": { - "source": "https://github.com/symfony/security-bundle/tree/v4.4.50" + "source": "https://github.com/symfony/runtime/tree/v6.4.0" }, "funding": [ { @@ -4683,55 +5444,80 @@ "type": "tidelift" } ], - "time": "2023-01-24T10:39:54+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { - "name": "symfony/security-core", - "version": "v4.4.48", + "name": "symfony/security-bundle", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "423ccb332784b236dfe6c5f396d0ac49db57c914" + "url": "https://github.com/symfony/security-bundle.git", + "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/423ccb332784b236dfe6c5f396d0ac49db57c914", - "reference": "423ccb332784b236dfe6c5f396d0ac49db57c914", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/97d4fb6dbee700937738036ec54b0fcb0641d7d6", + "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1|^2", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.1", + "symfony/clock": "^6.3|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.2", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^6.3.6|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/ldap": "<4.4", - "symfony/security-guard": "<4.3" + "symfony/browser-kit": "<5.4", + "symfony/console": "<5.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-client": "<5.4", + "symfony/ldap": "<5.4", + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4" }, "require-dev": { - "psr/container": "^1.0|^2.0", - "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/ldap": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^3.4.31|^4.3.4|^5.0" - }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1", + "web-token/jwt-signature-algorithm-eddsa": "^3.1", + "web-token/jwt-signature-algorithm-hmac": "^3.1", + "web-token/jwt-signature-algorithm-none": "^3.1", + "web-token/jwt-signature-algorithm-rsa": "^3.1" }, - "type": "library", + "type": "symfony-bundle", "autoload": { "psr-4": { - "Symfony\\Component\\Security\\Core\\": "" + "Symfony\\Bundle\\SecurityBundle\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4751,10 +5537,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Security Component - Core Library", + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v4.4.48" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.2" }, "funding": [ { @@ -4770,41 +5556,53 @@ "type": "tidelift" } ], - "time": "2022-10-22T05:50:33+00:00" + "time": "2023-12-24T09:11:31+00:00" }, { - "name": "symfony/security-csrf", - "version": "v5.4.35", + "name": "symfony/security-core", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/security-csrf.git", - "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b" + "url": "https://github.com/symfony/security-core.git", + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", - "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9e24a7199744d944c03fc1448276dc57f6237a33", + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/security-core": "^4.4|^5.0|^6.0" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/http-foundation": "<5.3" + "symfony/event-dispatcher": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/ldap": "<5.4", + "symfony/security-guard": "<5.4", + "symfony/validator": "<5.4" }, "require-dev": { - "symfony/http-foundation": "^5.3|^6.0" - }, - "suggest": { - "symfony/http-foundation": "For using the class SessionTokenStorage." + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.1|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Security\\Csrf\\": "" + "Symfony\\Component\\Security\\Core\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4824,10 +5622,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Security Component - CSRF Library", + "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v5.4.35" + "source": "https://github.com/symfony/security-core/tree/v6.4.0" }, "funding": [ { @@ -4843,34 +5641,36 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-11-06T17:20:05+00:00" }, { - "name": "symfony/security-guard", - "version": "v4.4.46", + "name": "symfony/security-csrf", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/security-guard.git", - "reference": "f199eb1b19db11ce254b891580728c45a7ccacfd" + "url": "https://github.com/symfony/security-csrf.git", + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-guard/zipball/f199eb1b19db11ce254b891580728c45a7ccacfd", - "reference": "f199eb1b19db11ce254b891580728c45a7ccacfd", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/b28413496ebfce2f98afbb990ad0ce0ba3586638", + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/security-core": "^3.4.22|^4.2.3|^5.0", - "symfony/security-http": "^4.4.1" + "php": ">=8.1", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<5.4" }, "require-dev": { - "psr/log": "^1|^2|^3" + "symfony/http-foundation": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Security\\Guard\\": "" + "Symfony\\Component\\Security\\Csrf\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4890,10 +5690,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Security Component - Guard", + "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-guard/tree/v4.4.46" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.0" }, "funding": [ { @@ -4909,42 +5709,51 @@ "type": "tidelift" } ], - "time": "2022-09-23T06:06:49+00:00" + "time": "2023-08-25T16:27:31+00:00" }, { "name": "symfony/security-http", - "version": "v4.4.50", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "7fa4a0cac16f02cb534a6e9adcdb17385f94004f" + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/7fa4a0cac16f02cb534a6e9adcdb17385f94004f", - "reference": "7fa4a0cac16f02cb534a6e9adcdb17385f94004f", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1b49ad8e9f2c3ceec011d67ac09e774e4107416b", + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/http-foundation": "^3.4.40|^4.4.7|^5.0.7", - "symfony/http-kernel": "^4.4", - "symfony/polyfill-php80": "^1.16", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/security-core": "^4.4.8" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/event-dispatcher": ">=5", - "symfony/security-csrf": "<3.4.11|~4.0,<4.0.11" + "symfony/clock": "<6.3", + "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/http-client-contracts": "<3.0", + "symfony/security-bundle": "<5.4", + "symfony/security-csrf": "<5.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/security-csrf": "^3.4.11|^4.0.11|^5.0" - }, - "suggest": { - "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", - "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.3|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^3.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1" }, "type": "library", "autoload": { @@ -4972,7 +5781,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v4.4.50" + "source": "https://github.com/symfony/security-http/tree/v6.4.0" }, "funding": [ { @@ -4988,37 +5797,33 @@ "type": "tidelift" } ], - "time": "2023-01-24T10:39:54+00:00" + "time": "2023-11-24T21:18:21+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5028,7 +5833,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5055,7 +5863,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" }, "funding": [ { @@ -5071,38 +5879,38 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/string", - "version": "v5.4.35", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", + "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5141,7 +5949,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.35" + "source": "https://github.com/symfony/string/tree/v6.4.2" }, "funding": [ { @@ -5157,32 +5965,30 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/templating", - "version": "v4.4.44", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/templating.git", - "reference": "2bfe94a5ebe0176612186e5f6b6a08a480c9e1f9" + "reference": "c3928c27fe1880095841d8b8ca1860f60b77d566" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/templating/zipball/2bfe94a5ebe0176612186e5f6b6a08a480c9e1f9", - "reference": "2bfe94a5ebe0176612186e5f6b6a08a480c9e1f9", + "url": "https://api.github.com/repos/symfony/templating/zipball/c3928c27fe1880095841d8b8ca1860f60b77d566", + "reference": "c3928c27fe1880095841d8b8ca1860f60b77d566", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8" }, "require-dev": { "psr/log": "^1|^2|^3" }, - "suggest": { - "psr/log-implementation": "For using debug logging in loaders" - }, "type": "library", "autoload": { "psr-4": { @@ -5209,7 +6015,7 @@ "description": "Provides all the tools needed to build any kind of template system", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/templating/tree/v4.4.44" + "source": "https://github.com/symfony/templating/tree/v6.4.0" }, "funding": [ { @@ -5225,55 +6031,61 @@ "type": "tidelift" } ], - "time": "2022-06-27T13:16:42+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { "name": "symfony/translation", - "version": "v4.4.47", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94" + "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/45036b1d53accc48fe9bab71ccd86d57eba0dd94", - "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94", + "url": "https://api.github.com/repos/symfony/translation/zipball/a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", + "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1.6|^2" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/yaml": "<3.4" + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "symfony/translation-implementation": "1.0|2.0" + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/finder": "~2.8|~3.0|~4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Symfony\\Component\\Translation\\": "" }, @@ -5298,7 +6110,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v4.4.47" + "source": "https://github.com/symfony/translation/tree/v6.4.2" }, "funding": [ { @@ -5314,32 +6126,29 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:11+00:00" + "time": "2023-12-18T09:25:29+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.2", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + "reference": "06450585bf65e978026bda220cdebca3f867fde7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", + "reference": "06450585bf65e978026bda220cdebca3f867fde7", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5349,7 +6158,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5376,7 +6188,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" }, "funding": [ { @@ -5392,81 +6204,73 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/twig-bridge", - "version": "v4.4.51", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "83b021cd395053ed30327b9ee5d3fd60631f73f5" + "reference": "97af829e4733125ee70e806694d56165c60b4ee1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/83b021cd395053ed30327b9ee5d3fd60631f73f5", - "reference": "83b021cd395053ed30327b9ee5d3fd60631f73f5", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/97af829e4733125ee70e806694d56165c60b4ee1", + "reference": "97af829e4733125ee70e806694d56165c60b4ee1", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.43|^2.13|^3.0.4" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/console": "<3.4", - "symfony/form": "<4.4", - "symfony/http-foundation": "<4.3", - "symfony/translation": "<4.2", - "symfony/workflow": "<4.3" + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<5.4", + "symfony/form": "<6.3", + "symfony/http-foundation": "<5.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.2", + "symfony/serializer": "<6.4", + "symfony/translation": "<5.4", + "symfony/workflow": "<5.4" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/form": "^4.4.17", - "symfony/http-foundation": "^4.3|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^4.4|^5.0", - "symfony/mime": "^4.3|^5.0", + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^3.0|^4.0|^5.0", - "symfony/security-csrf": "^3.4|^4.0|^5.0", - "symfony/security-http": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2.1|^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.3|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0", + "symfony/security-core": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.1|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", "twig/cssinliner-extra": "^2.12|^3", "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/templating": "For using the TwigEngine", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, "type": "symfony-bridge", "autoload": { "psr-4": { @@ -5493,7 +6297,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v4.4.51" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.2" }, "funding": [ { @@ -5509,51 +6313,47 @@ "type": "tidelift" } ], - "time": "2023-11-09T21:17:38+00:00" + "time": "2023-12-15T12:36:48+00:00" }, { "name": "symfony/twig-bundle", - "version": "v4.4.41", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "164c1edc69f2c7ee337323efc78a8a8a263f45ff" + "reference": "35d84393e598dfb774e6a2bf49e5229a8a6dbe4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/164c1edc69f2c7ee337323efc78a8a8a263f45ff", - "reference": "164c1edc69f2c7ee337323efc78a8a8a263f45ff", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/35d84393e598dfb774e6a2bf49e5229a8a6dbe4c", + "reference": "35d84393e598dfb774e6a2bf49e5229a8a6dbe4c", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/http-foundation": "^4.3|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/twig-bridge": "^4.4|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" + "composer-runtime-api": ">=2.1", + "php": ">=8.1", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.2", + "symfony/twig-bridge": "^6.4", + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/dependency-injection": "<4.1", - "symfony/framework-bundle": "<4.4", - "symfony/translation": "<4.2" + "symfony/framework-bundle": "<5.4", + "symfony/translation": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", - "symfony/asset": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.2.5|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/form": "^3.4|^4.0|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/web-link": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -5581,7 +6381,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v4.4.41" + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.0" }, "funding": [ { @@ -5597,69 +6397,59 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:19:55+00:00" + "time": "2023-11-07T14:57:07+00:00" }, { "name": "symfony/validator", - "version": "v4.4.48", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "54781a4c41efbd283b779110bf8ae7f263737775" + "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/54781a4c41efbd283b779110bf8ae7f263737775", - "reference": "54781a4c41efbd283b779110bf8ae7f263737775", + "url": "https://api.github.com/repos/symfony/validator/zipball/15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", + "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1|^2" + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" }, "conflict": { + "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/intl": "<4.3", - "symfony/translation": ">=5.0", - "symfony/yaml": "<3.4" + "symfony/dependency-injection": "<5.4", + "symfony/expression-language": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/intl": "<5.4", + "symfony/property-info": "<5.4", + "symfony/translation": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", - "egulias/email-validator": "^2.1.10|^3", - "symfony/cache": "^3.4|^4.0|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/http-foundation": "^4.1|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^4.3|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader.", - "egulias/email-validator": "Strict (RFC compliant) email validation", - "psr/cache-implementation": "For using the mapping cache.", - "symfony/config": "", - "symfony/expression-language": "For using the Expression validator", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/property-access": "For accessing properties within comparison constraints", - "symfony/property-info": "To automatically add NotNull and Type constraints", - "symfony/translation": "For translating validation errors.", - "symfony/yaml": "" + "doctrine/annotations": "^1.13|^2", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5687,7 +6477,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v4.4.48" + "source": "https://github.com/symfony/validator/tree/v6.4.2" }, "funding": [ { @@ -5703,43 +6493,39 @@ "type": "tidelift" } ], - "time": "2022-10-25T13:54:11+00:00" + "time": "2023-12-29T16:34:12+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.35", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ce4685b30e47d94dfc990c5566285ff99ddf012b" + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ce4685b30e47d94dfc990c5566285ff99ddf012b", - "reference": "ce4685b30e47d94dfc990c5566285ff99ddf012b", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -5776,7 +6562,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.35" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" }, "funding": [ { @@ -5792,28 +6578,28 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:28:09+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.35", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7" + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5846,10 +6632,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" }, "funding": [ { @@ -5865,37 +6653,35 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-27T08:18:35+00:00" }, { "name": "symfony/webpack-encore-bundle", - "version": "v1.17.2", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "471ebbc03072dad6e31840dc317bc634a32785f5" + "reference": "75cb918df3f65e28cf0d4bc03042bc45ccb19dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/471ebbc03072dad6e31840dc317bc634a32785f5", - "reference": "471ebbc03072dad6e31840dc317bc634a32785f5", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/75cb918df3f65e28cf0d4bc03042bc45ccb19dd0", + "reference": "75cb918df3f65e28cf0d4bc03042bc45ccb19dd0", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/asset": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25.0", - "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0" + "php": ">=8.1.0", + "symfony/asset": "^5.4 || ^6.2 || ^7.0", + "symfony/config": "^5.4 || ^6.2 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.2 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.2 || ^7.0", + "symfony/service-contracts": "^1.1.9 || ^2.1.3 || ^3.0" }, "require-dev": { - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.3 || ^6.0", - "symfony/twig-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/web-link": "^4.4 || ^5.0 || ^6.0" + "symfony/framework-bundle": "^5.4 || ^6.2 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.2 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.2 || ^7.0", + "symfony/web-link": "^5.4 || ^6.2 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -5922,7 +6708,7 @@ "description": "Integration with your Symfony app & Webpack Encore!", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.2" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.1.1" }, "funding": [ { @@ -5938,35 +6724,36 @@ "type": "tidelift" } ], - "time": "2023-09-26T14:36:28+00:00" + "time": "2023-10-22T18:53:08+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.45", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", - "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<3.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^5.4|^6.0|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { @@ -5993,7 +6780,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.45" + "source": "https://github.com/symfony/yaml/tree/v6.4.0" }, "funding": [ { @@ -6009,42 +6796,45 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:47:23+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "tiqr/tiqr-server-libphp", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/Tiqr/tiqr-server-libphp.git", - "reference": "011155313ad4aac54c886d9892763c3dd70cd7a3" + "reference": "b6caf88c4202a42b292e73d378cda416e64c82c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Tiqr/tiqr-server-libphp/zipball/011155313ad4aac54c886d9892763c3dd70cd7a3", - "reference": "011155313ad4aac54c886d9892763c3dd70cd7a3", + "url": "https://api.github.com/repos/Tiqr/tiqr-server-libphp/zipball/b6caf88c4202a42b292e73d378cda416e64c82c8", + "reference": "b6caf88c4202a42b292e73d378cda416e64c82c8", "shasum": "" }, "require": { + "chillerlan/php-qrcode": "^3.4", "edamov/pushok": "^0.14.0", "ext-curl": "*", "ext-gd": "*", "ext-json": "*", "ext-openssl": "*", - "kairos/phpqrcode": "~1.0", "php": ">=7.2", - "psr/log": "^1.1", - "zendframework/zendframework1": "~1.12" + "psr/log": "^3.0" }, "require-dev": { "ext-pdo_sqlite": "*", "mockery/mockery": "^1.3", "phpmd/phpmd": "^2.12", "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^2.9.2", - "zendframework/zend-coding-standard": "^1.0" + "squizlabs/php_codesniffer": "^2.9.2" }, "type": "library", + "autoload": { + "classmap": [ + "library/tiqr/Tiqr" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -6052,44 +6842,110 @@ "description": "php library for tiqr authentication.", "support": { "issues": "https://github.com/Tiqr/tiqr-server-libphp/issues", - "source": "https://github.com/Tiqr/tiqr-server-libphp/tree/3.0.2" + "source": "https://github.com/Tiqr/tiqr-server-libphp/tree/4.0.1" + }, + "time": "2023-12-21T12:43:27+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/32807183753de0388c8e59f7ac2d13bb47311140", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "twig/twig": "^3.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "twig/cache-extra": "^3.0", + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0", + "twig/string-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.8.0" }, - "time": "2023-02-07T12:09:26+00:00" + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T14:02:01+00:00" }, { "name": "twig/twig", - "version": "v2.16.0", + "version": "v3.8.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623" + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/0c9cc7ef2e0ec6d20c5af1200522a89ba101f623", - "reference": "0c9cc7ef2e0ec6d20c5af1200522a89ba101f623", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.8" + "symfony/polyfill-php80": "^1.22" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.16-dev" - } - }, "autoload": { - "psr-0": { - "Twig_": "lib/" - }, "psr-4": { "Twig\\": "src/" } @@ -6122,7 +6978,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.16.0" + "source": "https://github.com/twigphp/Twig/tree/v3.8.0" }, "funding": [ { @@ -6134,7 +6990,7 @@ "type": "tidelift" } ], - "time": "2023-12-22T07:22:15+00:00" + "time": "2023-11-21T18:54:41+00:00" }, { "name": "web-token/jwt-core", @@ -6491,73 +7347,21 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "zendframework/zendframework1", - "version": "1.12.20", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zf1.git", - "reference": "737ef159654fbbef37cf9af742b2c8f9690c2ece" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zf1/zipball/737ef159654fbbef37cf9af742b2c8f9690c2ece", - "reference": "737ef159654fbbef37cf9af742b2c8f9690c2ece", - "shasum": "" - }, - "require": { - "php": ">=5.2.11" - }, - "require-dev": { - "phpunit/dbunit": "1.3.*", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.12.x-dev" - } - }, - "autoload": { - "psr-0": { - "Zend_": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "library/" - ], - "license": [ - "BSD-3-Clause" - ], - "description": "Zend Framework 1", - "homepage": "http://framework.zend.com/", - "keywords": [ - "ZF1", - "framework" - ], - "support": { - "issues": "https://github.com/zendframework/zf1/issues", - "source": "https://github.com/zendframework/zf1/tree/release-1.12.20" - }, - "abandoned": "zendframework/zendframework", - "time": "2016-09-08T14:50:34+00:00" } ], "packages-dev": [ { "name": "behat/behat", - "version": "v3.14.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/Behat/Behat.git", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340" + "reference": "9dd7cdb309e464ddeab095cd1a5151c2dccba4ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Behat/zipball/2a3832d9cb853a794af3a576f9e524ae460f3340", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340", + "url": "https://api.github.com/repos/Behat/Behat/zipball/9dd7cdb309e464ddeab095cd1a5151c2dccba4ab", + "reference": "9dd7cdb309e464ddeab095cd1a5151c2dccba4ab", "shasum": "" }, "require": { @@ -6566,18 +7370,18 @@ "ext-mbstring": "*", "php": "^7.2 || ^8.0", "psr/container": "^1.0 || ^2.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/console": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/translation": "^4.4 || ^5.0 || ^6.0 || ^7.0", - "symfony/yaml": "^4.4 || ^5.0 || ^6.0 || ^7.0" + "symfony/config": "^4.4 || ^5.0 || ^6.0", + "symfony/console": "^4.4 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", + "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", + "symfony/translation": "^4.4 || ^5.0 || ^6.0", + "symfony/yaml": "^4.4 || ^5.0 || ^6.0" }, "require-dev": { "herrera-io/box": "~1.6.1", "phpspec/prophecy": "^1.15", "phpunit/phpunit": "^8.5 || ^9.0", - "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/process": "^4.4 || ^5.0 || ^6.0", "vimeo/psalm": "^4.8" }, "suggest": { @@ -6629,9 +7433,9 @@ ], "support": { "issues": "https://github.com/Behat/Behat/issues", - "source": "https://github.com/Behat/Behat/tree/v3.14.0" + "source": "https://github.com/Behat/Behat/tree/v3.13.0" }, - "time": "2023-12-09T13:55:02+00:00" + "time": "2023-04-18T15:40:53+00:00" }, { "name": "behat/gherkin", @@ -6698,31 +7502,31 @@ }, { "name": "behat/mink", - "version": "v1.9.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "e35f4695de8800fc776af34ebf665ad58ebdd996" + "reference": "d8527fdf8785aad38455fb426af457ab9937aece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/e35f4695de8800fc776af34ebf665ad58ebdd996", - "reference": "e35f4695de8800fc776af34ebf665ad58ebdd996", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/d8527fdf8785aad38455fb426af457ab9937aece", + "reference": "d8527fdf8785aad38455fb426af457ab9937aece", "shasum": "" }, "require": { - "php": ">=5.4", - "symfony/css-selector": "^2.7|^3.0|^4.0|^5.0" + "php": ">=7.2", + "symfony/css-selector": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5 || ^9.5", - "symfony/debug": "^2.7|^3.0|^4.0|^5.0", - "symfony/phpunit-bridge": "^3.4.38 || ^4.4 || ^5.0.5", - "yoast/phpunit-polyfills": "^1.0" + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^8.5.22 || ^9.5.11", + "symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, "suggest": { - "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)", - "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation", + "behat/mink-browserkit-driver": "fast headless driver for any app without JS emulation", "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)", "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)", "dmore/chrome-mink-driver": "fast and JS-enabled driver for any app (requires chromium or google chrome)" @@ -6758,41 +7562,46 @@ ], "support": { "issues": "https://github.com/minkphp/Mink/issues", - "source": "https://github.com/minkphp/Mink/tree/v1.9.0" + "source": "https://github.com/minkphp/Mink/tree/v1.11.0" }, - "time": "2021-10-11T11:58:47+00:00" + "time": "2023-12-09T11:23:23+00:00" }, { "name": "behat/mink-browserkit-driver", - "version": "v1.4.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/minkphp/MinkBrowserKitDriver.git", - "reference": "057926c9da452bac5bfcffb92eb4f3e1ce74dae9" + "reference": "16d53476e42827ed3aafbfa4fde17a1743eafd50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/057926c9da452bac5bfcffb92eb4f3e1ce74dae9", - "reference": "057926c9da452bac5bfcffb92eb4f3e1ce74dae9", + "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/16d53476e42827ed3aafbfa4fde17a1743eafd50", + "reference": "16d53476e42827ed3aafbfa4fde17a1743eafd50", "shasum": "" }, "require": { - "behat/mink": "^1.7.1@dev", - "php": ">=5.4", - "symfony/browser-kit": "~2.3|~3.0|~4.0", - "symfony/dom-crawler": "~2.3|~3.0|~4.0" + "behat/mink": "^1.11.0@dev", + "ext-dom": "*", + "php": ">=7.2", + "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/dom-crawler": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "mink/driver-testsuite": "dev-master", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.18 || ^8.5 || ^9.5", - "symfony/debug": "^2.7|^3.0|^4.0", - "symfony/http-kernel": "~2.3|~3.0|~4.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/http-client": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0 || ^7.0", + "symfony/mime": "^4.4 || ^5.0 || ^6.0 || ^7.0", "yoast/phpunit-polyfills": "^1.0" }, "type": "mink-driver", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -6821,31 +7630,36 @@ ], "support": { "issues": "https://github.com/minkphp/MinkBrowserKitDriver/issues", - "source": "https://github.com/minkphp/MinkBrowserKitDriver/tree/v1.4.1" + "source": "https://github.com/minkphp/MinkBrowserKitDriver/tree/v2.2.0" }, - "time": "2021-12-10T14:17:06+00:00" + "time": "2023-12-09T11:30:50+00:00" }, { - "name": "behat/mink-goutte-driver", - "version": "v1.3.0", + "name": "behat/mink-selenium2-driver", + "version": "v1.7.0", "source": { "type": "git", - "url": "https://github.com/minkphp/MinkGoutteDriver.git", - "reference": "8139f520f417c81bf9d2f9a171fff400f6adc9ea" + "url": "https://github.com/minkphp/MinkSelenium2Driver.git", + "reference": "4ca4083f305de7dff4434ac402dc4e3f39c0866a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkGoutteDriver/zipball/8139f520f417c81bf9d2f9a171fff400f6adc9ea", - "reference": "8139f520f417c81bf9d2f9a171fff400f6adc9ea", + "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/4ca4083f305de7dff4434ac402dc4e3f39c0866a", + "reference": "4ca4083f305de7dff4434ac402dc4e3f39c0866a", "shasum": "" }, "require": { - "behat/mink-browserkit-driver": "~1.2@dev", - "fabpot/goutte": "~1.0.4|~2.0|~3.1", - "php": ">=5.4" + "behat/mink": "^1.11@dev", + "ext-json": "*", + "instaclick/php-webdriver": "^1.4.14", + "php": ">=7.2" }, "require-dev": { - "mink/driver-testsuite": "dev-master" + "mink/driver-testsuite": "dev-master", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^8.5.22 || ^9.5.11", + "symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "type": "mink-driver", "extra": { @@ -6863,92 +7677,32 @@ "MIT" ], "authors": [ + { + "name": "Pete Otaqui", + "email": "pete@otaqui.com", + "homepage": "https://github.com/pete-otaqui" + }, { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" } ], - "description": "Goutte driver for Mink framework", + "description": "Selenium2 (WebDriver) driver for Mink framework", "homepage": "https://mink.behat.org/", "keywords": [ + "ajax", "browser", - "goutte", - "headless", - "testing" - ], - "support": { - "issues": "https://github.com/minkphp/MinkGoutteDriver/issues", - "source": "https://github.com/minkphp/MinkGoutteDriver/tree/v1.3.0" - }, - "abandoned": "behat/mink-browserkit-driver", - "time": "2021-10-12T11:35:46+00:00" - }, - { - "name": "behat/symfony2-extension", - "version": "2.1.5", - "source": { - "type": "git", - "url": "https://github.com/Behat/Symfony2Extension.git", - "reference": "d7c834487426a784665f9c1e61132274dbf2ea26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Symfony2Extension/zipball/d7c834487426a784665f9c1e61132274dbf2ea26", - "reference": "d7c834487426a784665f9c1e61132274dbf2ea26", - "shasum": "" - }, - "require": { - "behat/behat": "^3.4.3", - "php": ">=5.3.3", - "symfony/framework-bundle": "~2.0|~3.0|~4.0" - }, - "require-dev": { - "behat/mink": "~1.7@dev", - "behat/mink-browserkit-driver": "~1.3@dev", - "behat/mink-extension": "~2.0", - "phpspec/phpspec": "~2.0|~3.0|~4.0", - "phpunit/phpunit": "~4.0|~5.0", - "symfony/symfony": "~2.1|~3.0|~4.0" - }, - "type": "behat-extension", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Behat\\Symfony2Extension": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christophe Coevoet", - "email": "stof@notk.org" - }, - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com" - } - ], - "description": "Symfony2 framework extension for Behat", - "homepage": "http://behat.org", - "keywords": [ - "BDD", - "framework", - "symfony" + "javascript", + "selenium", + "testing", + "webdriver" ], "support": { - "issues": "https://github.com/Behat/Symfony2Extension/issues", - "source": "https://github.com/Behat/Symfony2Extension/tree/master" + "issues": "https://github.com/minkphp/MinkSelenium2Driver/issues", + "source": "https://github.com/minkphp/MinkSelenium2Driver/tree/v1.7.0" }, - "abandoned": "friends-of-behat/symfony-extension", - "time": "2018-04-20T15:48:23+00:00" + "time": "2023-12-09T11:58:45+00:00" }, { "name": "behat/transliterator", @@ -6999,84 +7753,22 @@ }, "time": "2022-03-30T09:27:43+00:00" }, - { - "name": "behatch/contexts", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/Behatch/contexts.git", - "reference": "e45284b1dddb9dce78e186a56683527802bccd47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behatch/contexts/zipball/e45284b1dddb9dce78e186a56683527802bccd47", - "reference": "e45284b1dddb9dce78e186a56683527802bccd47", - "shasum": "" - }, - "require": { - "behat/behat": "^3.0.13", - "friends-of-behat/mink-extension": "^2.3.1", - "justinrainbow/json-schema": "^5.0", - "php": ">=5.5", - "symfony/dom-crawler": "^2.4|^3.0|^4.0|^5.0", - "symfony/http-foundation": "^2.3|^3.0|^4.0|^5.0", - "symfony/property-access": "^2.3|^3.0|^4.0|^5.0" - }, - "replace": { - "sanpi/behatch-contexts": "self.version" - }, - "require-dev": { - "atoum/atoum": "^2.8|^3.0", - "behat/mink-goutte-driver": "^1.1", - "behat/mink-selenium2-driver": "^1.4@dev", - "fabpot/goutte": "^3.2", - "guzzlehttp/guzzle": "^6.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Behatch\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "beerware" - ], - "description": "Behatch contexts", - "keywords": [ - "BDD", - "Behat", - "Context", - "Symfony2" - ], - "support": { - "issues": "https://github.com/Behatch/contexts/issues", - "source": "https://github.com/Behatch/contexts/tree/3.3.0" - }, - "abandoned": true, - "time": "2020-02-27T08:40:50+00:00" - }, { "name": "composer/pcre", - "version": "2.1.1", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "b439557066cd445732fa57cbc8d905394b4db8a0" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b439557066cd445732fa57cbc8d905394b4db8a0", - "reference": "b439557066cd445732fa57cbc8d905394b4db8a0", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", @@ -7086,7 +7778,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -7114,7 +7806,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/2.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -7130,7 +7822,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:10:55+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/xdebug-handler", @@ -7196,37 +7888,122 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" }, { - "name": "doctrine/inflector", - "version": "2.0.9", + "name": "friends-of-behat/mink-extension", + "version": "v2.7.4", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" + "url": "https://github.com/FriendsOfBehat/MinkExtension.git", + "reference": "18d5a53dff3e2c8934c53e2db8b02b7ea345fe85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "url": "https://api.github.com/repos/FriendsOfBehat/MinkExtension/zipball/18d5a53dff3e2c8934c53e2db8b02b7ea345fe85", + "reference": "18d5a53dff3e2c8934c53e2db8b02b7ea345fe85", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "behat/behat": "^3.0.5", + "behat/mink": "^1.5", + "php": ">=7.4", + "symfony/config": "^4.4 || ^5.0 || ^6.0" + }, + "replace": { + "behat/mink-extension": "self.version" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "behat/mink-goutte-driver": "^1.1 || ^2.0", + "phpspec/phpspec": "^6.0 || ^7.0 || 7.1.x-dev" + }, + "type": "behat-extension", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } }, - "type": "library", "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "psr-0": { + "Behat\\MinkExtension": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7235,91 +8012,76 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Christophe Coevoet", + "email": "stof@notk.org" } ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "description": "Mink extension for Behat", + "homepage": "http://extensions.behat.org/mink", "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" + "browser", + "gui", + "test", + "web" ], "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.9" + "source": "https://github.com/FriendsOfBehat/MinkExtension/tree/v2.7.4" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2024-01-15T18:05:13+00:00" + "time": "2023-10-03T13:15:12+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.5.0", + "name": "friends-of-behat/symfony-extension", + "version": "v2.4.2", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "url": "https://github.com/FriendsOfBehat/SymfonyExtension.git", + "reference": "957df89b214f1575b40203e374bcafcd6d200a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/FriendsOfBehat/SymfonyExtension/zipball/957df89b214f1575b40203e374bcafcd6d200a1d", + "reference": "957df89b214f1575b40203e374bcafcd6d200a1d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "behat/behat": "^3.6.1", + "php": "^7.4 || ^8.0", + "symfony/dependency-injection": "^4.4 || ^5.3 || ^6.0", + "symfony/http-kernel": "^4.4 || ^5.3 || ^6.0", + "symfony/proxy-manager-bridge": "^4.4 || ^5.3 || ^6.0" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "behat/mink": "^1.9", + "behat/mink-browserkit-driver": "^2.0", + "behat/mink-selenium2-driver": "^1.3", + "friends-of-behat/mink-extension": "^2.5", + "friends-of-behat/page-object-extension": "^0.3.2", + "friends-of-behat/service-container-extension": "^1.1", + "sylius-labs/coding-standard": ">=4.1.1, <=4.2.1", + "symfony/browser-kit": "^4.4 || ^5.3 || ^6.0", + "symfony/framework-bundle": "^4.4 || ^5.3 || ^6.0", + "symfony/process": "^4.4 || ^5.3 || ^6.0", + "symfony/yaml": "^4.4 || ^5.3 || ^6.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "behat/mink": "^1.9", + "behat/mink-browserkit-driver": "^2.0", + "friends-of-behat/mink-extension": "^2.5" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "FriendsOfBehat\\SymfonyExtension\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7328,74 +8090,59 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "Kamil Kokot", + "email": "kamil@kokot.me", + "homepage": "https://kamilkokot.com" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], + "description": "Integrates Behat with Symfony.", "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "issues": "https://github.com/FriendsOfBehat/SymfonyExtension/issues", + "source": "https://github.com/FriendsOfBehat/SymfonyExtension/tree/v2.4.2" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2023-12-09T12:17:26+00:00" }, { - "name": "fabpot/goutte", - "version": "v3.2.3", + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.16", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/Goutte.git", - "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8" + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/3f0eaf0a40181359470651f1565b3e07e3dd31b8", - "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.0", - "php": ">=5.5.0", - "symfony/browser-kit": "~2.1|~3.0|~4.0", - "symfony/css-selector": "~2.1|~3.0|~4.0", - "symfony/dom-crawler": "~2.1|~3.0|~4.0" + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" }, "require-dev": { - "symfony/phpunit-bridge": "^3.3 || ^4" + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" }, - "type": "application", + "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.2-dev" + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" } }, "autoload": { "psr-4": { - "Goutte\\": "Goutte" - }, - "exclude-from-classmap": [ - "Goutte/Tests" - ] + "ProxyManager\\": "src/ProxyManager" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7403,58 +8150,102 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" } ], - "description": "A simple PHP Web Scraper", - "homepage": "https://github.com/FriendsOfPHP/Goutte", + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", "keywords": [ - "scraper" + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" ], "support": { - "issues": "https://github.com/FriendsOfPHP/Goutte/issues", - "source": "https://github.com/FriendsOfPHP/Goutte/tree/master" + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" }, - "abandoned": "symfony/browser-kit", - "time": "2018-06-29T15:13:57+00:00" + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2023-05-24T07:17:17+00:00" }, { - "name": "friends-of-behat/mink-extension", - "version": "v2.5.0", + "name": "guzzle/guzzle", + "version": "v3.8.1", "source": { "type": "git", - "url": "https://github.com/FriendsOfBehat/MinkExtension.git", - "reference": "83119aa70be1f2c63061c29dced9d41775cd9db2" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfBehat/MinkExtension/zipball/83119aa70be1f2c63061c29dced9d41775cd9db2", - "reference": "83119aa70be1f2c63061c29dced9d41775cd9db2", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", "shasum": "" }, "require": { - "behat/behat": "^3.0.5", - "behat/mink": "^1.5", - "php": ">=7.2", - "symfony/config": "^3.4 || ^4.4 || ^5.0" + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1" }, "replace": { - "behat/mink-extension": "self.version" + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" }, "require-dev": { - "behat/mink-goutte-driver": "^1.1", - "phpspec/phpspec": "^6.0 || ^7.0" + "doctrine/cache": "*", + "monolog/monolog": "1.*", + "phpunit/phpunit": "3.7.*", + "psr/log": "1.0.*", + "symfony/class-loader": "*", + "zendframework/zend-cache": "<2.3", + "zendframework/zend-log": "<2.3" }, - "type": "behat-extension", + "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.8-dev" } }, "autoload": { "psr-0": { - "Behat\\MinkExtension": "src/" + "Guzzle": "src/", + "Guzzle\\Tests": "tests/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7463,26 +8254,32 @@ ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" }, { - "name": "Christophe Coevoet", - "email": "stof@notk.org" + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" } ], - "description": "Mink extension for Behat", - "homepage": "http://extensions.behat.org/mink", + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", "keywords": [ - "browser", - "gui", - "test", - "web" + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" ], "support": { - "source": "https://github.com/FriendsOfBehat/MinkExtension/tree/v2.5.0" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/master" }, - "time": "2021-01-21T09:27:44+00:00" + "abandoned": "guzzlehttp/guzzle", + "time": "2014-01-28T22:29:15+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7536,57 +8333,67 @@ "time": "2020-07-09T08:09:16+00:00" }, { - "name": "jakub-onderka/php-parallel-lint", - "version": "v1.0.0", + "name": "instaclick/php-webdriver", + "version": "1.4.18", "source": { "type": "git", - "url": "https://github.com/JakubOnderka/PHP-Parallel-Lint.git", - "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8" + "url": "https://github.com/instaclick/php-webdriver.git", + "reference": "a61a8459f86c79dd1f19934ea3929804f2e41f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Parallel-Lint/zipball/04fbd3f5fb1c83f08724aa58a23db90bd9086ee8", - "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8", + "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/a61a8459f86c79dd1f19934ea3929804f2e41f8c", + "reference": "a61a8459f86c79dd1f19934ea3929804f2e41f8c", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-curl": "*", + "php": ">=5.3.2" }, "require-dev": { - "jakub-onderka/php-console-highlighter": "~0.3", - "nette/tester": "~1.3", - "squizlabs/php_codesniffer": "~2.7" - }, - "suggest": { - "jakub-onderka/php-console-highlighter": "Highlight syntax in code snippet" + "phpunit/phpunit": "^8.5 || ^9.5", + "satooshi/php-coveralls": "^1.0 || ^2.0" }, - "bin": [ - "parallel-lint" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, "autoload": { - "classmap": [ - "./" - ] + "psr-0": { + "WebDriver": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-2-Clause" + "Apache-2.0" ], "authors": [ { - "name": "Jakub Onderka", - "email": "ahoj@jakubonderka.cz" + "name": "Justin Bishop", + "email": "jubishop@gmail.com", + "role": "Developer" + }, + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "role": "Fork Maintainer" } ], - "description": "This tool check syntax of PHP files about 20x faster than serial check.", - "homepage": "https://github.com/JakubOnderka/PHP-Parallel-Lint", + "description": "PHP WebDriver for Selenium 2", + "homepage": "http://instaclick.com/", + "keywords": [ + "browser", + "selenium", + "webdriver", + "webtest" + ], "support": { - "issues": "https://github.com/JakubOnderka/PHP-Parallel-Lint/issues", - "source": "https://github.com/JakubOnderka/PHP-Parallel-Lint/tree/master" + "issues": "https://github.com/instaclick/php-webdriver/issues", + "source": "https://github.com/instaclick/php-webdriver/tree/1.4.18" }, - "abandoned": "php-parallel-lint/php-parallel-lint", - "time": "2018-02-24T15:31:20+00:00" + "time": "2023-12-08T07:11:19+00:00" }, { "name": "justinrainbow/json-schema", @@ -7660,25 +8467,26 @@ }, { "name": "khanamiryan/qrcode-detector-decoder", - "version": "1.0.6", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git", - "reference": "45326fb83a2a375065dbb3a134b5b8a5872da569" + "reference": "8d53cbecaa32f1e56a3be58bb3055ac31774ecd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/45326fb83a2a375065dbb3a134b5b8a5872da569", - "reference": "45326fb83a2a375065dbb3a134b5b8a5872da569", + "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/8d53cbecaa32f1e56a3be58bb3055ac31774ecd0", + "reference": "8d53cbecaa32f1e56a3be58bb3055ac31774ecd0", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^5.7 | ^7.5 | ^8.0 | ^9.0", + "phpunit/phpunit": "^7.5 | ^8.0 | ^9.0", "rector/rector": "^0.13.6", - "symplify/easy-coding-standard": "^11.0" + "symplify/easy-coding-standard": "^11.0", + "vimeo/psalm": "^4.24" }, "type": "library", "autoload": { @@ -7711,39 +8519,120 @@ ], "support": { "issues": "https://github.com/khanamiryan/php-qrcode-detector-decoder/issues", - "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/1.0.6" + "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/2.0.2" + }, + "time": "2022-11-17T10:54:53+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-stdlib": "^3.17.0", + "phpunit/phpunit": "^10.3.3", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.15.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" }, - "time": "2022-06-29T09:25:13+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-18T10:00:55+00:00" }, { "name": "league/csv", - "version": "8.2.3", + "version": "9.14.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "d2aab1e7bde802582c3879acf03d92716577c76d" + "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/d2aab1e7bde802582c3879acf03d92716577c76d", - "reference": "d2aab1e7bde802582c3879acf03d92716577c76d", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/34bf0df7340b60824b9449b5c526fcc3325070d5", + "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5", "shasum": "" }, "require": { + "ext-filter": "*", + "ext-json": "*", "ext-mbstring": "*", - "php": ">=5.5.0" + "php": "^8.1.2" + }, + "require-dev": { + "doctrine/collections": "^2.1.4", + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^v3.22.0", + "phpbench/phpbench": "^1.2.15", + "phpstan/phpstan": "^1.10.50", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpstan/phpstan-strict-rules": "^1.5.2", + "phpunit/phpunit": "^10.5.3", + "symfony/var-dumper": "^6.4.0" }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.9", - "phpunit/phpunit": "^4.0" + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "8.2-dev" + "dev-master": "9.x-dev" } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { "League\\Csv\\": "src" } @@ -7760,46 +8649,56 @@ "role": "Developer" } ], - "description": "Csv data manipulation made easy in PHP", - "homepage": "http://csv.thephpleague.com", + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", "keywords": [ + "convert", "csv", "export", "filter", "import", "read", + "transform", "write" ], "support": { - "forum": "https://groups.google.com/forum/#!forum/thephpleague", + "docs": "https://csv.thephpleague.com", "issues": "https://github.com/thephpleague/csv/issues", - "source": "https://github.com/thephpleague/csv/tree/8.x" + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" }, - "time": "2018-02-06T08:27:03+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2023-12-29T07:34:53+00:00" }, { "name": "malukenho/docheader", - "version": "0.1.8", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/malukenho/docheader.git", - "reference": "a15c22ba8a44add72a2b2bca5e40af244a53497c" + "reference": "8d3a4c2f7717c2502b71a9bccad638c4dda0b4de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/malukenho/docheader/zipball/a15c22ba8a44add72a2b2bca5e40af244a53497c", - "reference": "a15c22ba8a44add72a2b2bca5e40af244a53497c", + "url": "https://api.github.com/repos/malukenho/docheader/zipball/8d3a4c2f7717c2502b71a9bccad638c4dda0b4de", + "reference": "8d3a4c2f7717c2502b71a9bccad638c4dda0b4de", "shasum": "" }, "require": { - "php": "^7.1 | ^8.0", - "symfony/console": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0" + "php": "^8.0", + "symfony/console": "^4.4 || ^5.4 || ^6.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0 || ^8.0", - "vimeo/psalm": "^3.3" + "doctrine/coding-standard": "^9.0", + "mikey179/vfsstream": "^1.6.10", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.23" }, "bin": [ "bin/docheader" @@ -7829,41 +8728,111 @@ ], "support": { "issues": "https://github.com/malukenho/docheader/issues", - "source": "https://github.com/malukenho/docheader/tree/master" + "source": "https://github.com/malukenho/docheader/tree/1.0.0" }, - "time": "2019-11-22T07:32:36+00:00" + "time": "2022-07-12T09:10:09+00:00" }, { - "name": "mockery/mockery", - "version": "1.3.6", + "name": "masterminds/html5", + "version": "2.8.1", "source": { "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0" + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/dc206df4fa314a50bbb81cf72239a305c5bbd5c0", - "reference": "dc206df4fa314a50bbb81cf72239a305c5bbd5c0", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=5.6.0" + "ext-dom": "*", + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^5.7.10|^6.5|^7.5|^8.5|^9.3" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { - "Mockery": "library/" + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + }, + "time": "2023-05-10T11:58:31+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.7", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.10", + "symplify/easy-coding-standard": "^12.0.8" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -7874,12 +8843,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -7897,10 +8874,13 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.3.6" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2022-09-07T15:05:49+00:00" + "time": "2023-12-10T02:24:34+00:00" }, { "name": "myclabs/deep-copy", @@ -7963,25 +8943,27 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -7989,7 +8971,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -8013,9 +8995,99 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" + }, + "time": "2024-01-07T17:17:35+00:00" + }, + { + "name": "overtrue/phplint", + "version": "9.1.0", + "source": { + "type": "git", + "url": "https://github.com/overtrue/phplint.git", + "reference": "6537f697a8e181fd529bdd8f0fdaaa3fe899bea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/6537f697a8e181fd529bdd8f0fdaaa3fe899bea7", + "reference": "6537f697a8e181fd529bdd8f0fdaaa3fe899bea7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/cache": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/finder": "^6.4 || ^7.0", + "symfony/options-resolver": "^6.4 || ^7.0", + "symfony/process": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "brainmaestro/composer-git-hooks": "^2.8.5 || 3.0.0-alpha.1", + "jetbrains/phpstorm-stubs": "^2021.3 || ^2022.3 || ^2023.3", + "php-parallel-lint/php-console-highlighter": "^1.0" + }, + "bin": [ + "bin/phplint" + ], + "type": "library", + "extra": { + "hooks": { + "pre-commit": [ + "composer style:fix", + "composer code:check" + ], + "pre-push": [ + "composer qa:check" + ] + }, + "branch-alias": { + "dev-main": "9.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Overtrue\\PHPLint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + }, + { + "name": "Laurent Laville", + "homepage": "https://github.com/llaville" + } + ], + "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", + "keywords": [ + "check", + "lint", + "phplint", + "static analysis", + "syntax" + ], + "support": { + "issues": "https://github.com/overtrue/phplint/issues", + "source": "https://github.com/overtrue/phplint/tree/9.1.0" }, - "time": "2023-12-10T21:03:43+00:00" + "funding": [ + { + "url": "https://github.com/overtrue", + "type": "github" + } + ], + "time": "2023-12-17T07:05:41+00:00" }, { "name": "pdepend/pdepend", @@ -8274,18 +9346,65 @@ ], "time": "2023-12-11T08:22:20+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.25.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + }, + "time": "2024-01-04T17:06:16+00:00" + }, { "name": "phpstan/phpstan", - "version": "1.10.57", + "version": "1.10.55", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" + "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", + "reference": "9a88f9d18ddf4cf54c922fbeac16c4cb164c5949", "shasum": "" }, "require": { @@ -8334,20 +9453,20 @@ "type": "tidelift" } ], - "time": "2024-01-24T11:51:34+00:00" + "time": "2024-01-08T12:32:40+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.7", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1" + "reference": "34b3c43684834f6a20aa51af8d455480d9de8b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/ef7db637be9b85fa00278fc3477ac66abe8eb7d1", - "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/34b3c43684834f6a20aa51af8d455480d9de8b88", + "reference": "34b3c43684834f6a20aa51af8d455480d9de8b88", "shasum": "" }, "require": { @@ -8404,46 +9523,50 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.7" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.6" }, - "time": "2024-01-10T21:54:42+00:00" + "time": "2023-12-22T11:22:34+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "7.0.15", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "819f92bba8b001d4363065928088de22f25a3a48" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", - "reference": "819f92bba8b001d4363065928088de22f25a3a48", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-xdebug": "^2.7.2" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -8471,7 +9594,131 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:47:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { @@ -8479,32 +9726,32 @@ "type": "github" } ], - "time": "2021-07-26T12:20:09+00:00" + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -8523,15 +9770,14 @@ "role": "lead" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "filesystem", - "iterator" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -8539,26 +9785,34 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -8575,44 +9829,83 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "template" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.3", + "name": "phpunit/phpunit", + "version": "9.6.15", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", "shasum": "" }, "require": { - "php": ">=7.1" + "doctrine/instantiator": "^1.3.1 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.28", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" }, - "require-dev": { - "phpunit/phpunit": "^8.5" + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -8628,48 +9921,58 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "timer" + "phpunit", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" }, "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2023-12-01T16:55:19+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.3", + "name": "sebastian/cli-parser", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -8684,17 +9987,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, "funding": [ { @@ -8702,61 +10003,32 @@ "type": "github" } ], - "abandoned": true, - "time": "2021-07-26T12:15:06+00:00" + "time": "2020-09-28T06:08:49+00:00" }, { - "name": "phpunit/phpunit", - "version": "8.5.36", + "name": "sebastian/code-unit", + "version": "1.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9652df58e06a681429d8cfdaec3c43d6de581d5a", - "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.2", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.4", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.5", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.5", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" + "php": ">=7.3" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", - "phpunit/php-invoker": "To allow enforcing time limits" + "require-dev": { + "phpunit/phpunit": "^9.3" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -8775,58 +10047,44 @@ "role": "lead" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.36" + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" } ], - "time": "2023-12-01T16:52:15+00:00" + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -8848,7 +10106,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -8856,34 +10114,34 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.5", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", - "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -8922,7 +10180,64 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -8930,33 +10245,33 @@ "type": "github" } ], - "time": "2022-09-14T12:31:48+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -8988,7 +10303,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -8996,27 +10311,27 @@ "type": "github" } ], - "time": "2023-05-07T05:30:20+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -9024,7 +10339,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -9051,7 +10366,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -9059,34 +10374,34 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.5", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -9121,14 +10436,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -9136,30 +10451,39 @@ "type": "github" } ], - "time": "2022-09-14T06:00:17+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { - "name": "sebastian/finder-facade", - "version": "1.2.3", + "name": "sebastian/global-state", + "version": "5.0.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/finder-facade.git", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { - "php": "^7.1", - "symfony/finder": "^2.3|^3.0|^4.0|^5.0", - "theseer/fdomdocument": "^1.6" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" }, "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-master": "5.0-dev" + } }, "autoload": { "classmap": [ @@ -9173,49 +10497,51 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", - "homepage": "https://github.com/sebastianbergmann/finder-facade", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], "support": { - "issues": "https://github.com/sebastianbergmann/finder-facade/issues", - "source": "https://github.com/sebastianbergmann/finder-facade/tree/1.2" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, - "abandoned": true, - "time": "2020-01-16T08:08:45+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-02T09:26:13+00:00" }, { - "name": "sebastian/global-state", - "version": "3.0.3", + "name": "sebastian/lines-of-code", + "version": "1.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/66783ce213de415b451b904bfef9dda0cf9aeae0", - "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -9230,17 +10556,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.3" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -9248,34 +10572,34 @@ "type": "github" } ], - "time": "2023-08-02T09:23:32+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -9297,7 +10621,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -9305,32 +10629,32 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -9352,7 +10676,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -9360,29 +10684,29 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/phpcpd", - "version": "4.1.0", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e" + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/0d9afa762f2400de077b2192f4a9d127de0bb78e", - "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", "shasum": "" }, "require": { "ext-dom": "*", - "php": "^7.1", - "phpunit/php-timer": "^2.0", - "sebastian/finder-facade": "^1.1", - "sebastian/version": "^1.0|^2.0", - "symfony/console": "^2.7|^3.0|^4.0" + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0", + "phpunit/php-timer": "^5.0", + "sebastian/cli-parser": "^1.0", + "sebastian/version": "^3.0" }, "bin": [ "phpcpd" @@ -9390,7 +10714,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -9413,35 +10737,41 @@ "homepage": "https://github.com/sebastianbergmann/phpcpd", "support": { "issues": "https://github.com/sebastianbergmann/phpcpd/issues", - "source": "https://github.com/sebastianbergmann/phpcpd/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/phpcpd/tree/6.0.3" }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "abandoned": true, - "time": "2018-09-17T17:17:27+00:00" + "time": "2020-12-07T05:39:23+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -9468,10 +10798,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -9479,29 +10809,32 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -9523,7 +10856,7 @@ "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { @@ -9531,32 +10864,32 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", - "version": "1.1.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -9579,7 +10912,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -9587,29 +10920,29 @@ "type": "github" } ], - "time": "2020-11-30T07:25:11+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -9632,22 +10965,156 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "8.14.1", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/fea1fd6f137cc84f9cba0ae30d549615dbc6a926", + "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.23.1", + "squizlabs/php_codesniffer": "^3.7.1" + }, + "require-dev": { + "phing/phing": "2.17.4", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.10.37", + "phpstan/phpstan-deprecation-rules": "1.1.4", + "phpstan/phpstan-phpunit": "1.3.14", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "8.5.21|9.6.8|10.3.5" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.14.1" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2023-10-08T07:28:08+00:00" + }, + { + "name": "soyuka/contexts", + "version": "v3.3.10", + "source": { + "type": "git", + "url": "https://github.com/soyuka/contexts.git", + "reference": "69041bb61500c41eb969f1f46b63402e9fcccfd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/soyuka/contexts/zipball/69041bb61500c41eb969f1f46b63402e9fcccfd3", + "reference": "69041bb61500c41eb969f1f46b63402e9fcccfd3", + "shasum": "" + }, + "require": { + "behat/behat": "^3.0.13", + "friends-of-behat/mink-extension": "^2.3.1", + "justinrainbow/json-schema": "^5.0", + "php": ">=8.0", + "symfony/dom-crawler": "^2.4|^3.0|^4.0|^5.0|^6.0|^7.0", + "symfony/http-foundation": "^2.3|^3.0|^4.0|^5.0|^6.0|^7.0", + "symfony/property-access": "^2.3|^3.0|^4.0|^5.0|^6.0|^7.0" + }, + "replace": { + "sanpi/behatch-contexts": "self.version" + }, + "require-dev": { + "atoum/atoum": "^4.0", + "atoum/stubs": "^2.6", + "behat/mink-goutte-driver": "^1.1", + "behat/mink-selenium2-driver": "^1.6", + "fabpot/goutte": "^3.2", + "guzzlehttp/guzzle": "^6.3", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Behatch\\": "src/", + "Behatch\\Tests\\Units\\": "tests/units/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "beerware" + ], + "description": "Behatch contexts", + "keywords": [ + "BDD", + "Behat", + "Context", + "Symfony2" + ], + "support": { + "source": "https://github.com/soyuka/contexts/tree/v3.3.10" }, - "time": "2016-10-03T07:35:21+00:00" + "time": "2023-12-06T17:33:41+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.8.1", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "14f5fff1e64118595db5408e946f3a22c75807f7" + "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/14f5fff1e64118595db5408e946f3a22c75807f7", - "reference": "14f5fff1e64118595db5408e946f3a22c75807f7", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7", + "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7", "shasum": "" }, "require": { @@ -9657,11 +11124,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ - "bin/phpcbf", - "bin/phpcs" + "bin/phpcs", + "bin/phpcbf" ], "type": "library", "extra": { @@ -9714,35 +11181,31 @@ "type": "open_collective" } ], - "time": "2024-01-11T20:47:48+00:00" + "time": "2023-12-08T12:32:31+00:00" }, { "name": "symfony/browser-kit", - "version": "v4.4.44", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb" + "reference": "a3bb210e001580ec75e1d02b27fae3452e6bf502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb", - "reference": "2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a3bb210e001580ec75e1d02b27fae3452e6bf502", + "reference": "a3bb210e001580ec75e1d02b27fae3452e6bf502", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/dom-crawler": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/mime": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/process": "" + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9770,7 +11233,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v4.4.44" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.0" }, "funding": [ { @@ -9786,24 +11249,24 @@ "type": "tidelift" } ], - "time": "2022-07-25T12:56:14+00:00" + "time": "2023-10-31T08:18:17+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.47", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33" + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33", - "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -9832,10 +11295,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v3.4.47" + "source": "https://github.com/symfony/css-selector/tree/v6.4.0" }, "funding": [ { @@ -9851,37 +11314,30 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.45", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5" + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4b8daf6c56801e6d664224261cb100b73edc78a5", - "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", "shasum": "" }, "require": { - "php": ">=7.1.3", + "masterminds/html5": "^2.6", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "masterminds/html5": "<2.6" + "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/css-selector": "" + "symfony/css-selector": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9909,7 +11365,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v4.4.45" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.0" }, "funding": [ { @@ -9925,79 +11381,72 @@ "type": "tidelift" } ], - "time": "2022-08-03T12:57:57+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { - "name": "symfony/maker-bundle", - "version": "v1.39.1", + "name": "symfony/phpunit-bridge", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/maker-bundle.git", - "reference": "30c8ac13511f6df7bc9ac088f31d7a48ce6433c6" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "bd0455b7888e4adac29cf175d819c51f88fed942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/30c8ac13511f6df7bc9ac088f31d7a48ce6433c6", - "reference": "30c8ac13511f6df7bc9ac088f31d7a48ce6433c6", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bd0455b7888e4adac29cf175d819c51f88fed942", + "reference": "bd0455b7888e4adac29cf175d819c51f88fed942", "shasum": "" }, "require": { - "doctrine/inflector": "^1.2|^2.0", - "nikic/php-parser": "^4.11", - "php": ">=7.1.3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/deprecation-contracts": "^2.2|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0" + "php": ">=7.1.3" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^1.12.3|^2.0", - "doctrine/orm": "^2.3", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/phpunit-bridge": "^4.4|^5.0|^6.0", - "symfony/polyfill-php80": "^1.16.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/security-core": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^2.0|^3.0" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/polyfill-php81": "^1.27" }, - "type": "symfony-bundle", + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", "extra": { - "branch-alias": { - "dev-main": "1.0-dev" + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Bundle\\MakerBundle\\": "src/" - } + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", - "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", - "keywords": [ - "code generator", - "generator", - "scaffold", - "scaffolding" - ], + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.39.1" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.2" }, "funding": [ { @@ -10013,51 +11462,29 @@ "type": "tidelift" } ], - "time": "2022-09-13T18:14:36+00:00" + "time": "2023-12-19T09:12:31+00:00" }, { - "name": "symfony/phpunit-bridge", - "version": "v5.4.35", + "name": "symfony/process", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "2a0216076da723aeabebef57bbb5009d0ee920f6" + "url": "https://github.com/symfony/process.git", + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2a0216076da723aeabebef57bbb5009d0ee920f6", - "reference": "2a0216076da723aeabebef57bbb5009d0ee920f6", + "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" - } + "php": ">=8.1" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10069,18 +11496,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.35" + "source": "https://github.com/symfony/process/tree/v6.4.2" }, "funding": [ { @@ -10096,30 +11523,35 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-12-22T16:42:54+00:00" }, { - "name": "symfony/stopwatch", - "version": "v5.4.35", + "name": "symfony/proxy-manager-bridge", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "887762aa99ff16f65dc8b48aafead415f942d407" + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/887762aa99ff16f65dc8b48aafead415f942d407", - "reference": "887762aa99ff16f65dc8b48aafead415f942d407", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/801c4590eacf0dc40d73135dbe79ad71effd6d04", + "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=8.1", + "symfony/dependency-injection": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "type": "library", + "require-dev": { + "symfony/config": "^6.1|^7.0" + }, + "type": "symfony-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Bridge\\ProxyManager\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10139,10 +11571,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.35" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.0" }, "funding": [ { @@ -10158,51 +11590,30 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2023-11-01T12:07:38+00:00" }, { - "name": "symfony/web-profiler-bundle", - "version": "v5.0.11", + "name": "symfony/stopwatch", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "3b6dbd2cc76275e117d5c55923c7f511ead22bae" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3b6dbd2cc76275e117d5c55923c7f511ead22bae", - "reference": "3b6dbd2cc76275e117d5c55923c7f511ead22bae", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/form": "<4.4", - "symfony/messenger": "<4.4" - }, - "require-dev": { - "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -10222,10 +11633,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony WebProfilerBundle", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.0.11" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" }, "funding": [ { @@ -10241,55 +11652,89 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { - "name": "theseer/fdomdocument", - "version": "1.6.7", + "name": "symfony/web-profiler-bundle", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/theseer/fDOMDocument.git", - "reference": "5cddd4f9076a9a2b85c5135935bba2dcb3ed7574" + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "38462d16856740ec0d1ba2cb902eebf09100dde2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/5cddd4f9076a9a2b85c5135935bba2dcb3ed7574", - "reference": "5cddd4f9076a9a2b85c5135935bba2dcb3ed7574", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/38462d16856740ec0d1ba2cb902eebf09100dde2", + "reference": "38462d16856740ec0d1ba2cb902eebf09100dde2", "shasum": "" }, "require": { - "ext-dom": "*", - "lib-libxml": "*", - "php": ">=5.3.3" + "php": ">=8.1", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/form": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/twig-bundle": ">=7.0" }, "require-dev": { - "php": ">=7.3" + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, - "type": "library", + "type": "symfony-bundle", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", - "homepage": "https://github.com/theseer/fDOMDocument", + "description": "Provides a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], "support": { - "issues": "https://github.com/theseer/fDOMDocument/issues", - "source": "https://github.com/theseer/fDOMDocument/tree/1.6.7" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.2" }, - "abandoned": true, - "time": "2022-01-25T23:10:35+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-27T08:18:35+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 72f6e0a3..f6f455a8 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -5,4 +5,4 @@ twig: debug: '%kernel.debug%' strict_variables: '%kernel.debug%' globals: - global_view_parameters: "@App\\GlobalViewParameters" + global_view_parameters: '@App\Service\GlobalViewParameters' diff --git a/dev/Controller/SPController.php b/dev/Controller/SPController.php index e4ece4d9..3d9f5bd0 100644 --- a/dev/Controller/SPController.php +++ b/dev/Controller/SPController.php @@ -96,7 +96,6 @@ public function assertionConsumerService(Request $request): \Symfony\Component\H $xmlResponse = $request->request->get('SAMLResponse'); $xml = base64_decode($xmlResponse); try { - /** @var Assertion $response */ $response = $this->postBinding->processResponse($request, $this->identityProvider, $this->serviceProvider); $nameID = $response->getNameId(); @@ -104,10 +103,10 @@ public function assertionConsumerService(Request $request): \Symfony\Component\H return $this->render('dev/acs.html.twig', [ 'requestId' => $response->getId(), 'nameId' => $nameID !== null ? [ - 'value' => $nameID->value, - 'format' => $nameID->Format, + 'value' => $nameID->getValue(), + 'format' => $nameID->getFormat(), ] : [], - 'issuer' => $response->getIssuer(), + 'issuer' => $response->getIssuer()->getValue(), 'relayState' => $request->get(AuthnRequest::PARAMETER_RELAY_STATE, ''), 'authenticatingAuthority' => $response->getAuthenticatingAuthority(), 'xml' => $this->toFormattedXml($xml), @@ -119,7 +118,7 @@ public function assertionConsumerService(Request $request): \Symfony\Component\H 'error' => $e->getMessage(), 'status' => $samlResponse->getStatus(), 'requestId' => $samlResponse->getId(), - 'issuer' => $samlResponse->getIssuer(), + 'issuer' => $samlResponse->getIssuer()->getValue(), 'relayState' => $request->get(AuthnRequest::PARAMETER_RELAY_STATE, ''), 'xml' => $this->toFormattedXml($xml), ]); @@ -128,9 +127,6 @@ public function assertionConsumerService(Request $request): \Symfony\Component\H /** * Formats xml. - * - * - * @return string */ private function toFormattedXml(string|bool $xml): string|false { @@ -144,8 +140,6 @@ private function toFormattedXml(string|bool $xml): string|false /** * Sign AuthnRequest query parameters. - * - * @return string * @throws \Exception */ private function signRequestQuery(array $queryParams): string @@ -166,7 +160,7 @@ private function signRequestQuery(array $queryParams): string * * @throws \Exception */ - private function loadServiceProviderPrivateKey(): \RobRichards\XMLSecLibs\XMLSecurityKey + private function loadServiceProviderPrivateKey(): XMLSecurityKey { $keyLoader = new PrivateKeyLoader(); $privateKey = $keyLoader->loadPrivateKey( @@ -183,12 +177,9 @@ private function loadServiceProviderPrivateKey(): \RobRichards\XMLSecLibs\XMLSec * @return Message * @throws \Exception */ - private function toUnsignedErrorResponse(string $xml): \SAML2\Message + private function toUnsignedErrorResponse(string $xml): Message { - $previous = libxml_disable_entity_loader(true); $asXml = DOMDocumentFactory::fromString($xml); - libxml_disable_entity_loader($previous); - return Response::fromXML($asXml->documentElement); } } diff --git a/src/Controller/TiqrAppApiController.php b/src/Controller/TiqrAppApiController.php index 962ce9e7..9164202a 100644 --- a/src/Controller/TiqrAppApiController.php +++ b/src/Controller/TiqrAppApiController.php @@ -101,13 +101,10 @@ public function metadata(Request $request): Response /** * This is the route where the app authenticates or registers. - * - * - * @return Response */ #[Route(path: '/tiqr.php', name: 'app_identity_registration_authentication', methods: ['POST'])] #[Route(path: '/tiqr/tiqr.php', methods: ['POST'])] - public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $request) + public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $request): Response { $operation = $request->get('operation'); if (empty($operation)) { From 0a94c6204c1e10cc906c8f9922cf2b9ae7db1b46 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 9 Jan 2024 15:58:03 +0100 Subject: [PATCH 18/52] Install and configure incenteev parameters --- composer.json | 18 ++++++++++++++-- composer.lock | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 3651a1ea..d5d5fb0a 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "ext-dom": "*", "ext-libxml": "*", "ext-zlib": "*", + "incenteev/composer-parameter-handler": "*", "openconext/monitor-bundle": "^4.0", "surfnet/stepup-bundle": "^6.0.9", "surfnet/stepup-gssp-bundle": "^5.0", @@ -101,7 +102,15 @@ "auto-scripts": { "cache:clear": "symfony-cmd", "assets:install %PUBLIC_DIR%": "symfony-cmd" - } + }, + "post-install-cmd": [ + "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", + "@auto-scripts" + ], + "post-update-cmd": [ + "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", + "@auto-scripts" + ] }, "config": { "sort-packages": true, @@ -121,7 +130,12 @@ "symfony": { "allow-contrib": false, "require": "6.4.*" - } + }, + "incenteev-parameters": [ + { + "file": "config/openconext/parameters.yaml" + } + ] }, "archive": { "exclude": [ diff --git a/composer.lock b/composer.lock index c8c41986..4e4e7e9d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "07b091fbb274a45d27539393ef43c130", + "content-hash": "041b60dbdec8fe9a3d7586b06e402e5e", "packages": [ { "name": "beberlei/assert", @@ -1702,6 +1702,63 @@ ], "time": "2023-12-03T20:05:35+00:00" }, + { + "name": "incenteev/composer-parameter-handler", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Incenteev/ParameterHandler.git", + "reference": "90bffce926e96b365579a2ef024aab457f4b80c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/90bffce926e96b365579a2ef024aab457f4b80c5", + "reference": "90bffce926e96b365579a2ef024aab457f4b80c5", + "shasum": "" + }, + "require": { + "php": ">=7.4", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "composer/composer": "^2.0@dev", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Incenteev\\ParameterHandler\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + } + ], + "description": "Composer script handling your ignored parameter file", + "homepage": "https://github.com/Incenteev/ParameterHandler", + "keywords": [ + "parameters management" + ], + "support": { + "issues": "https://github.com/Incenteev/ParameterHandler/issues", + "source": "https://github.com/Incenteev/ParameterHandler/tree/v2.2.0" + }, + "time": "2023-12-09T10:31:14+00:00" + }, { "name": "monolog/monolog", "version": "3.5.0", From bc1433ae8f61b5caf71714cfe9d622f925802d11 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 9 Jan 2024 16:13:54 +0100 Subject: [PATCH 19/52] Install Yarn dependencies when running integration tests --- .github/workflows/test-integration.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 88596225..c03e6ae0 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -19,5 +19,8 @@ jobs: - name: Composer install run: composer install + - name: Yarn install + run: yarn + - name: Run QA tests run: composer check From 3e3b49c6ee69f954e7db3684a845c2f360a8b698 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Tue, 9 Jan 2024 16:26:56 +0100 Subject: [PATCH 20/52] Repair code after running PHP CS --- dev/Controller/SPController.php | 7 +++++-- src/Controller/AuthenticationController.php | 10 ++++++++-- src/Controller/TiqrAppApiController.php | 3 +-- src/Features/Context/TiqrContext.php | 4 +++- src/Tiqr/AuthenticationRateLimitService.php | 8 +++++--- src/Tiqr/Legacy/TiqrUser.php | 5 ++--- src/Tiqr/TiqrFactory.php | 3 +-- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/dev/Controller/SPController.php b/dev/Controller/SPController.php index 3d9f5bd0..7058f11d 100644 --- a/dev/Controller/SPController.php +++ b/dev/Controller/SPController.php @@ -45,8 +45,11 @@ */ final class SPController extends AbstractController { - public function __construct(private readonly ServiceProvider $serviceProvider, private readonly IdentityProvider $identityProvider, private readonly PostBinding $postBinding) - { + public function __construct( + private readonly ServiceProvider $serviceProvider, + private readonly IdentityProvider $identityProvider, + private readonly PostBinding $postBinding + ) { } /** diff --git a/src/Controller/AuthenticationController.php b/src/Controller/AuthenticationController.php index d88a4f41..df799c73 100644 --- a/src/Controller/AuthenticationController.php +++ b/src/Controller/AuthenticationController.php @@ -45,8 +45,14 @@ */ class AuthenticationController extends AbstractController { - public function __construct(private readonly AuthenticationService $authenticationService, private readonly StateHandlerInterface $stateHandler, private readonly TiqrServiceInterface $tiqrService, private readonly TiqrUserRepositoryInterface $userRepository, private readonly AuthenticationRateLimitServiceInterface $authenticationRateLimitService, private readonly LoggerInterface $logger) - { + public function __construct( + private readonly AuthenticationService $authenticationService, + private readonly StateHandlerInterface $stateHandler, + private readonly TiqrServiceInterface $tiqrService, + private readonly TiqrUserRepositoryInterface $userRepository, + private readonly AuthenticationRateLimitServiceInterface $authenticationRateLimitService, + private readonly LoggerInterface $logger + ) { } /** diff --git a/src/Controller/TiqrAppApiController.php b/src/Controller/TiqrAppApiController.php index 9164202a..ab071f9f 100644 --- a/src/Controller/TiqrAppApiController.php +++ b/src/Controller/TiqrAppApiController.php @@ -144,8 +144,7 @@ private function registerAction( Request $request, string $notificationType, string $notificationAddress - ): Response - { + ): Response { $enrollmentSecret = $request->get('otp'); // enrollment secret relayed by tiqr app if (empty($enrollmentSecret)) { $this->logger->error('Missing "otp" parameter'); diff --git a/src/Features/Context/TiqrContext.php b/src/Features/Context/TiqrContext.php index bf387d8c..0ad3df20 100644 --- a/src/Features/Context/TiqrContext.php +++ b/src/Features/Context/TiqrContext.php @@ -441,7 +441,9 @@ public function theLogsAre(TableNode $table): void if (preg_match('/^\/.*\/$/', (string) $row['message']) === 1) { Assertion::regex($message, $row['message']); } else { - Assertion::eq($message, $row['message'], + Assertion::eq( + $message, + $row['message'], "\n" . "At row: " . ($index+1) . "\n" . "Expected: " . $row['message'] . "\n" diff --git a/src/Tiqr/AuthenticationRateLimitService.php b/src/Tiqr/AuthenticationRateLimitService.php index 4e71211d..b9eb37ab 100644 --- a/src/Tiqr/AuthenticationRateLimitService.php +++ b/src/Tiqr/AuthenticationRateLimitService.php @@ -36,8 +36,11 @@ * * @throws \Exception */ - public function __construct(private TiqrServiceInterface $tiqrService, private TiqrConfigurationInterface $configuration, private LoggerInterface $logger) - { + public function __construct( + private TiqrServiceInterface $tiqrService, + private TiqrConfigurationInterface $configuration, + private LoggerInterface $logger + ) { } /** @@ -153,7 +156,6 @@ private function handleAuthenticationRejectResponse( $now = new \DateTimeImmutable(); // Just block the user temporarily if we don't got a limit. if (!$this->configuration->hasMaxTemporarilyLoginAttempts()) { - $user->blockTemporarily($now); $logger->notice('Increase temporarily block attempt'); diff --git a/src/Tiqr/Legacy/TiqrUser.php b/src/Tiqr/Legacy/TiqrUser.php index b655a7db..840b5d3c 100644 --- a/src/Tiqr/Legacy/TiqrUser.php +++ b/src/Tiqr/Legacy/TiqrUser.php @@ -42,8 +42,7 @@ public function __construct( * @var string The userId */ private $userId - ) - { + ) { } /** @@ -128,7 +127,7 @@ public function addLoginAttempt(): void { try { // Not this is not transactional and requires two SQL queries when using PDO driver - $this->userStorage->setLoginAttempts($this->userId, $this->getLoginAttempts() + 1); + $this->userStorage->setLoginAttempts($this->userId, $this->getLoginAttempts() + 1); } catch (Exception $e) { // Catch errors from the tiqr-server and up-cycle them to exceptions that are meaningful to our domain throw TiqrServerRuntimeException::fromOriginalException($e); diff --git a/src/Tiqr/TiqrFactory.php b/src/Tiqr/TiqrFactory.php index 9929e2bb..6a07c939 100644 --- a/src/Tiqr/TiqrFactory.php +++ b/src/Tiqr/TiqrFactory.php @@ -59,8 +59,7 @@ public static function createService( public static function createUserRepository( TiqrConfigurationInterface $configuration, LoggerInterface $logger - ): TiqrUserRepository - { + ): TiqrUserRepository { $options = $configuration->getTiqrOptions(); $userStorage = Tiqr_UserStorage::getStorage( $options['userstorage']['type'], From d6a52fdd0eb6bb93e6bba4b863c4e1563d53a704 Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 10 Jan 2024 09:01:30 +0100 Subject: [PATCH 21/52] Repair (non existing) PHP unit tests We have a test folder, but there are no tests. The folder is kept, and PHP Unit is standing by for future development where we might want to utilize PHP unit testing --- ci/qa/phpunit.xml | 68 ++++++++++++++++++++++------------------------- tests/.gitkeep | 0 2 files changed, 32 insertions(+), 36 deletions(-) create mode 100644 tests/.gitkeep diff --git a/ci/qa/phpunit.xml b/ci/qa/phpunit.xml index 1802ac96..2f8d8303 100644 --- a/ci/qa/phpunit.xml +++ b/ci/qa/phpunit.xml @@ -1,44 +1,40 @@ - - - - - - - - - - - - - - tests - - - - - - ../../../src - - - - - - - - - - 0 - - - - - + + + ../../../src + + + + + + + + + + + + + + ../../tests + + + + + + + + + 0 + + + + + diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 00000000..e69de29b From 89bee4d2dd6f64be819973db7537c4de48e2598a Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 10 Jan 2024 09:02:24 +0100 Subject: [PATCH 22/52] Address PHPMD issues --- src/Controller/ExceptionController.php | 3 +++ src/Controller/TiqrAppApiController.php | 11 +++++------ src/Features/Context/ErrorReportContext.php | 2 +- src/Tiqr/AuthenticationRateLimitService.php | 3 ++- src/Tiqr/Legacy/TiqrService.php | 9 +++++---- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Controller/ExceptionController.php b/src/Controller/ExceptionController.php index 4f432a4e..91c48161 100644 --- a/src/Controller/ExceptionController.php +++ b/src/Controller/ExceptionController.php @@ -35,6 +35,9 @@ use Symfony\Contracts\Translation\TranslatorInterface; use Throwable; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ final class ExceptionController extends BaseExceptionController { public function __construct( diff --git a/src/Controller/TiqrAppApiController.php b/src/Controller/TiqrAppApiController.php index ab071f9f..a706da7e 100644 --- a/src/Controller/TiqrAppApiController.php +++ b/src/Controller/TiqrAppApiController.php @@ -134,9 +134,8 @@ public function tiqr(UserAgentMatcherInterface $userAgentMatcher, Request $reque } /** - * @param $notificationType - * @param $notificationAddress - * @return Response + * @SuppressWarnings(PHPMD.NPathComplexity) + * * @throws \InvalidArgumentException */ private function registerAction( @@ -202,13 +201,13 @@ private function registerAction( // Note: historically both uppercase and lowercase hex strings are used // 1. Assert that the secret is a valid hex string - $decoded_secret = hex2bin((string) $secret); - if (false === $decoded_secret) { + $decodedSecret = hex2bin((string) $secret); + if (false === $decodedSecret) { $logger->error('Invalid secret, secret must be a hex string'); return new Response('Invalid secret', Response::HTTP_FORBIDDEN); } // 2. Assert that the secret has a minimum length of 32 bytes. - if (strlen($decoded_secret) < 32) { + if (strlen($decodedSecret) < 32) { $logger->error('Invalid secret, secret must be at least 32 bytes (64 hex digits) long'); return new Response('Invalid secret', Response::HTTP_FORBIDDEN); } diff --git a/src/Features/Context/ErrorReportContext.php b/src/Features/Context/ErrorReportContext.php index 7c3cdc84..b99d1800 100644 --- a/src/Features/Context/ErrorReportContext.php +++ b/src/Features/Context/ErrorReportContext.php @@ -58,7 +58,7 @@ public function gatherContexts(BeforeScenarioScope $scope): void /** * This will print the failed html result. - * + * @SuppressWarnings(PHPMD.ElseExpression) * @AfterStep */ public function dumpInfoAfterFailedStep(AfterStepScope $scope): void diff --git a/src/Tiqr/AuthenticationRateLimitService.php b/src/Tiqr/AuthenticationRateLimitService.php index b9eb37ab..288663d7 100644 --- a/src/Tiqr/AuthenticationRateLimitService.php +++ b/src/Tiqr/AuthenticationRateLimitService.php @@ -25,6 +25,7 @@ use App\Tiqr\Response\RejectedAuthenticationResponse; use App\Tiqr\Response\TemporarilyBlockedAuthenticationResponse; use App\WithContextLogger; +use DateTimeImmutable; use Psr\Log\LoggerInterface; /** @@ -153,7 +154,7 @@ private function handleAuthenticationRejectResponse( return new PermanentlyBlockedAuthenticationResponse(); } - $now = new \DateTimeImmutable(); + $now = new DateTimeImmutable(); // Just block the user temporarily if we don't got a limit. if (!$this->configuration->hasMaxTemporarilyLoginAttempts()) { $user->blockTemporarily($now); diff --git a/src/Tiqr/Legacy/TiqrService.php b/src/Tiqr/Legacy/TiqrService.php index 3dfb4f5f..aa3b332f 100644 --- a/src/Tiqr/Legacy/TiqrService.php +++ b/src/Tiqr/Legacy/TiqrService.php @@ -36,6 +36,7 @@ * Wrapper around the legacy Tiqr service. * * @SuppressWarnings(PHPMD.TooManyPublicMethods) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * It's Legacy. */ final class TiqrService implements TiqrServiceInterface @@ -342,8 +343,8 @@ private function getHashedIdentifier(string $identifier): string public function getSariForSessionIdentifier(string $identifier): string { try { - $hashed_identifier = $this->getHashedIdentifier($identifier); - $res = $this->tiqrStateStorage->getValue('sari_' . $hashed_identifier); + $hashedIdentifier = $this->getHashedIdentifier($identifier); + $res = $this->tiqrStateStorage->getValue('sari_' . $hashedIdentifier); } catch (Exception) { $this->logger->error(sprintf('Error getting SARI for identifier "%s"', substr($identifier, 0, 8))); return ''; @@ -383,8 +384,8 @@ private function setSariForSessionIdentifier(string $identifier, string $sari): sprintf("Setting SARI '%s' for identifier '%s...'", $sari, substr($identifier, 0, 8)) ); try { - $hashed_identifier = $this->getHashedIdentifier($identifier); - $this->tiqrStateStorage->setValue('sari_' . $hashed_identifier, $sari, 60 * 60); + $hashedIdentifier = $this->getHashedIdentifier($identifier); + $this->tiqrStateStorage->setValue('sari_' . $hashedIdentifier, $sari, 60 * 60); } catch (Exception $e) { // Catch errors from the tiqr-server and up-cycle them to exceptions that are meaningful to our domain throw TiqrServerRuntimeException::fromOriginalException($e); From 58e594f6f308998a31d772eed1d5dcbd180686fb Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 10 Jan 2024 09:04:38 +0100 Subject: [PATCH 23/52] Add the missing phpstan.neon file --- ci/qa/phpstan.neon | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 ci/qa/phpstan.neon diff --git a/ci/qa/phpstan.neon b/ci/qa/phpstan.neon new file mode 100644 index 00000000..6ddf4542 --- /dev/null +++ b/ci/qa/phpstan.neon @@ -0,0 +1,7 @@ +includes: + - ./phpstan-baseline.neon + - ../../vendor/phpstan/phpstan-symfony/extension.neon +parameters: + level: 9 + paths: + - ../../src From 2089db3eaf7765af52a4724af3dcdee2fcfae68f Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 10 Jan 2024 09:06:22 +0100 Subject: [PATCH 24/52] Ignore the /coverage folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c268efea..f071871c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /userdb.json /.web-server-pid /config/openconext/parameters.yaml +/coverage/ /var/* !/var/cache /var/cache/* From 9680359dc973585642be0b3595df3ef9de2dfeaa Mon Sep 17 00:00:00 2001 From: Michiel Kodde Date: Wed, 10 Jan 2024 09:10:22 +0100 Subject: [PATCH 25/52] Run the acceptance tests on GHA --- .gitignore | 2 - README.md | 6 +- ci/config/gateway/gateway_gssp_sp.crt | 24 ++ ci/config/readme.md | 5 + ci/config/tiqr/tiqr_idp.crt | 24 ++ ci/config/tiqr/tiqr_idp.key | 40 +++ ci/docker/docker-compose.yml | 23 -- ci/docker/nginx/nginx.conf | 37 --- ci/files/.gitignore | 4 - ci/qa/behat | 3 +- ci/qa/behat.yml | 19 +- ci/qa/phpstan-baseline.neon | 10 - composer.lock | 320 ++++---------------- config/packages/framework.yaml | 4 +- config/packages/monolog.yaml | 22 +- config/services_test.yaml | 7 +- dev/FileLogger.php | 4 +- src/Features/Context/ErrorReportContext.php | 12 +- src/Features/Context/TiqrContext.php | 22 +- src/Features/Context/WebContext.php | 13 +- src/Features/authentication.feature | 20 +- src/Features/metadata.feature | 4 +- src/Features/registration.feature | 13 +- 23 files changed, 200 insertions(+), 438 deletions(-) create mode 100644 ci/config/gateway/gateway_gssp_sp.crt create mode 100644 ci/config/readme.md create mode 100644 ci/config/tiqr/tiqr_idp.crt create mode 100644 ci/config/tiqr/tiqr_idp.key delete mode 100644 ci/docker/docker-compose.yml delete mode 100644 ci/docker/nginx/nginx.conf delete mode 100644 ci/files/.gitignore diff --git a/.gitignore b/.gitignore index f071871c..509faa66 100644 --- a/.gitignore +++ b/.gitignore @@ -67,8 +67,6 @@ ci/qa/phpunit.xml ###< symfony/phpunit-bridge ### local-php-security-checker -tiqr.stepup.example.com.crt -tiqr.stepup.example.com.key ci/qa/.phpcs-cache ###> phpstan/phpstan ### diff --git a/README.md b/README.md index 886e51c3..d2951b0e 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,13 @@ Locale user preference ---------------------- The default locale is based on the user agent. When the user switches its locale the selected preference is stored inside a -browser cookie (stepup_locale). The cookie is set on naked domain of the requested domain (for tiqr.stepup.example.com this is example.com). +browser cookie (stepup_locale). The cookie is set on naked domain of the requested domain (for tiqr.dev.openconext.local this is dev.openconext.local). Authentication and registration flows ------------------------------------- The application provides internal (SpBundle) and a remote service provider. Instructions for this are given -on the homepage of this Tiqr project [Homepage](https://tiqr.stepup.example.com/app_dev.php/). +on the homepage of this Tiqr project [Homepage](https://tiqr.dev.openconext.local/). ![flow](docs/flow.png)