diff --git a/.gitattributes b/.gitattributes index 984fe18712..f26a230f4b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,14 +1,25 @@ -/cache/.gitkeep export-ignore -/config/.gitkeep export-ignore -/metadata/.gitkeep export-ignore -/tests export-ignore -/tools export-ignore +cert/.gitkeep export-ignore +public/assets/.gitkeep export-ignore +tools export-ignore +tests/Utils export-ignore +tests/modules export-ignore +tests/routers export-ignore +tests/src export-ignore +tests/www export-ignore +tests/SigningTestCase.php export-ignore +tests/bootstrap.php export-ignore codecov.yml export-ignore .editorconfig export-ignore .gitattributes export-ignore .gitignore export-ignore psalm.xml export-ignore +psalm-dev.xml export-ignore phpcs.xml export-ignore phpunit.xml export-ignore .github export-ignore .php_cs.dist export-ignore +.markdownlintignore export-ignore +.markdownlint.yml export-ignore +.markdownlintrc export-ignore +*.php.dist linguist-language=php +.phive diff --git a/.github/build/full.json b/.github/build/full.json new file mode 100644 index 0000000000..d82cb92149 --- /dev/null +++ b/.github/build/full.json @@ -0,0 +1,36 @@ +{ + "modules": { + "authorize": { + "repository": "simplesamlphp/simplesamlphp-module-authorize", + "version": "~1.6.2" + }, + "consent": { + "repository": "simplesamlphp/simplesamlphp-module-consent", + "version": "~1.4.2" + }, + "consentadmin": { + "repository": "simplesamlphp/simplesamlphp-module-consentadmin", + "version": "~1.1.0" + }, + "discopower": { + "repository": "simplesamlphp/simplesamlphp-module-discopower", + "version": "~1.5.1" + }, + "ldap": { + "repository": "simplesamlphp/simplesamlphp-module-ldap", + "version": "~2.4.10" + }, + "metarefresh": { + "repository": "simplesamlphp/simplesamlphp-module-metarefresh", + "version": "~1.2.5" + }, + "radius": { + "repository": "simplesamlphp/simplesamlphp-module-radius", + "version": "~2.0.3" + }, + "sqlauth": { + "repository": "simplesamlphp/simplesamlphp-module-sqlauth", + "version": "~1.3.1" + } + } +} diff --git a/.github/build/slim.json b/.github/build/slim.json new file mode 100644 index 0000000000..dd8a073405 --- /dev/null +++ b/.github/build/slim.json @@ -0,0 +1,4 @@ +{ + "modules": { + } +} diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml new file mode 100644 index 0000000000..d8bf605419 --- /dev/null +++ b/.github/workflows/build-release.yml @@ -0,0 +1,123 @@ +--- + +name: Build release + +on: # yamllint disable-line rule:truthy + push: + tags: + - '*' + +jobs: + build: + name: Build release + runs-on: [ubuntu-latest] + strategy: + fail-fast: false + matrix: + version: ['slim', 'full'] + + steps: + - name: Setup PHP, with composer and extensions + id: setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 + with: + # Should match the minimum required version for SimpleSAMLphp + php-version: '8.1' + tools: composer:v2, phive + extensions: mbstring, xml + coverage: none + + - name: Setup problem matchers for PHP + run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" + + - uses: actions/checkout@v4 + + # Store the version, stripping any v-prefix + - name: Write release version + run: | + TAG=${{ github.ref_name }} + { + echo "TAG=$TAG" + echo "COMPOSER_VERSION=$(composer config version)" + echo "VERSION=${TAG#v}" + } >> "$GITHUB_ENV" + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Make sure a version is set in composer.json that matches the tag + if: "${{ env.COMPOSER_VERSION != env.TAG }}" + run: exit 1 + + - name: Install Composer dependencies + run: composer install --no-progress --no-dev --prefer-dist --optimize-autoloader + + - name: Install SimpleSAMLphp modules + env: + FILE: ".github/build/${{ matrix.version }}.json" + run: | + for k in $(jq '.modules | keys | .[]' "$FILE"); do + module=$(jq -r ".modules[$k]" "$FILE"); + if [ -n "$module" ]; + then + repository=$(jq -r '.repository' <<< "$module"); + v=$(jq -r '.version' <<< "$module"); + + composer require "$repository:$v" --update-no-dev --ignore-platform-reqs + fi + done + + - name: Add composer.phar to the release + run: phive --no-progress install --trust-gpg-keys CBB3D576F2A0946F --copy --target ./bin composer + + - name: Clean release + run: | + grep export-ignore .gitattributes | cut -d ' ' -f 1 | while IFS= read -r line + do + rm -rf "$line" + done + rm -rf .git + + - name: Build tarball + run: | + cd .. + cp -R simplesamlphp "simplesamlphp-$VERSION" + tar --owner 0 --group 0 -cvzf "/tmp/simplesamlphp-$VERSION-${{ matrix.version }}.tar.gz" \ + "simplesamlphp-$VERSION" + rm -rf "simplesamlphp-$VERSION" + + - name: Save tarball + uses: actions/upload-artifact@v4 + with: + name: release-${{ matrix.version }} + path: "/tmp/simplesamlphp-${{ env.VERSION }}-${{ matrix.version }}.tar.gz" + retention-days: 1 + + - name: Calculate SHA checksum (${{ matrix.version }}) + run: sha256sum "/tmp/simplesamlphp-$VERSION-${{ matrix.version }}.tar.gz" + + website: + name: Build website + runs-on: [ubuntu-latest] + strategy: + fail-fast: false + + steps: + - name: Run website build + if: | + startsWith(github.ref, 'refs/tags/v') && + contains(github.ref, 'alpha') != true && + contains(github.ref, 'beta') != true + uses: actions/github-script@v7 + with: + # Token has to be generated on a user account that controls the docs-repository. + # The _only_ scope to select is "Access public repositories", nothing more. + github-token: ${{ secrets.PAT_TOKEN }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: 'simplesamlphp', + repo: 'simplesamlphp.github.io', + workflow_id: 'github-pages.yml', + ref: 'release' + }) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 0dd760397b..fb6e2c5760 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,14 +1,17 @@ +--- + name: Documentation -on: +on: # yamllint disable-line rule:truthy push: - branches: [ master, simplesamlphp-* ] + branches: [master, simplesamlphp-*] paths: - '**.md' pull_request: - branches: [ master, simplesamlphp-* ] + branches: [master, simplesamlphp-*] paths: - '**.md' + workflow_dispatch: jobs: quality: @@ -16,14 +19,22 @@ jobs: runs-on: [ubuntu-latest] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Lint markdown files - uses: nosborn/github-action-markdown-cli@v3.1.0 + uses: nosborn/github-action-markdown-cli@v3 with: files: . ignore_path: .markdownlintignore + - name: Perform spell check + uses: codespell-project/actions-codespell@v2 + with: + path: '**/*.md' + check_filenames: true + # Words must be lowercase + ignore_words_list: tekst,widgits + build: name: Build documentation needs: quality @@ -32,7 +43,7 @@ jobs: steps: - name: Run docs build if: github.event_name != 'pull_request' - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: # Token has to be generated on a user account that controls the docs-repository. # The _only_ scope to select is "Access public repositories", nothing more. diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 91f9fcc64e..9c98602a8d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -1,31 +1,58 @@ +--- + name: CI -on: +on: # yamllint disable-line rule:truthy push: - branches: [ '**' ] + branches: ['**'] paths-ignore: - '**.md' pull_request: - branches: [ master, release-* ] + branches: [master, simplesamlphp-*] paths-ignore: - '**.md' jobs: - basic-tests: - name: Syntax and unit tests, PHP ${{ matrix.php-versions }}, ${{ matrix.operating-system }} + phplinter: + name: 'PHP-Linter' + strategy: + fail-fast: false + matrix: + php-version: ['8.1', '8.2', '8.3', '8.4'] + + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.9.2 + with: + php-version: ${{ matrix.php-version }} + + linter: + name: 'Linter' + strategy: + fail-fast: false + + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.9.2 + with: + enable_eslinter: true + enable_jsonlinter: true + enable_stylelinter: true + enable_yamllinter: true + + unit-tests-linux: + name: "Syntax and unit tests, PHP ${{ matrix.php-versions }}, ${{ matrix.operating-system }}" runs-on: ${{ matrix.operating-system }} + needs: [phplinter, linter] strategy: fail-fast: false matrix: - operating-system: [ubuntu-latest, windows-latest] - php-versions: ['7.4', '8.0', '8.1'] + operating-system: [ubuntu-latest] + php-versions: ['8.1', '8.2', '8.3'] steps: - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} - extensions: intl, mbstring, mysql, pdo, pdo_sqlite, xml + extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, xml tools: composer:v2 ini-values: error_reporting=E_ALL coverage: xdebug @@ -41,171 +68,241 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Copy config.php.dist to config.php + run: cp config/config.php.dist config/config.php + + - name: Create SimpleSAMLphp cache directory + run: sudo mkdir -p /var/cache/simplesamlphp && sudo chmod 777 /var/cache/simplesamlphp - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v1 + uses: actions/cache@v4 with: - path: ${{ steps.composer-cache.outputs.dir }} + path: $COMPOSER_CACHE key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- - - name: Validate composer.json and composer.lock - run: composer validate - - name: Install Composer dependencies run: composer install --no-progress --prefer-dist --optimize-autoloader - - name: Syntax check PHP - run: bash vendor/bin/check-syntax-php.sh - - - name: Decide whether to run code coverage or not - if: ${{ matrix.php-versions != '7.4' || matrix.operating-system != 'ubuntu-latest' }} - run: | - echo "NO_COVERAGE=--no-coverage" >> $GITHUB_ENV + - name: Run unit tests with coverage + if: ${{ matrix.php-versions == '8.1' }} + run: ./vendor/bin/phpunit - - name: Run unit tests - run: | - echo $NO_COVERAGE - ./vendor/bin/phpunit $NO_COVERAGE + - name: Run unit tests (no coverage) + if: ${{ matrix.php-versions != '8.1' }} + run: ./vendor/bin/phpunit --no-coverage - name: Save coverage data - if: ${{ matrix.php-versions == '7.4' && matrix.operating-system == 'ubuntu-latest' }} - uses: actions/upload-artifact@v3 + if: ${{ matrix.php-versions == '8.1' }} + uses: actions/upload-artifact@v4 with: - name: build-data - path: ${{ github.workspace }}/build + name: coverage-data + path: ${{ github.workspace }}/build + + unit-tests-windows: + name: "Syntax and unit tests, PHP ${{ matrix.php-versions }}, ${{ matrix.operating-system }}" + runs-on: ${{ matrix.operating-system }} + needs: [phplinter, linter] + strategy: + fail-fast: true + matrix: + operating-system: [windows-latest] + php-versions: ['8.1', '8.2', '8.3'] - security: - name: Security checks - runs-on: [ubuntu-latest] steps: - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 with: - php-version: '7.4' - extensions: mbstring, xml - tools: composer:v2 - coverage: none + php-version: ${{ matrix.php-versions }} + extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, xml + tools: composer:v2 + ini-values: error_reporting=E_ALL + coverage: none - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v3 + - name: Setup problem matchers for PHPUnit + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Set git to use LF + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - uses: actions/checkout@v4 - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$env:GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v1 + uses: actions/cache@v4 with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- + path: $COMPOSER_CACHE + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader - - - name: Security check for locked dependencies - uses: symfonycorp/security-checker-action@v3 + run: composer install --no-progress --prefer-dist --optimize-autoloader --no-scripts - - name: Update Composer dependencies - run: composer update --no-progress --prefer-dist --optimize-autoloader - - - name: Security check for updated dependencies - uses: symfonycorp/security-checker-action@v3 + - name: Run unit tests + run: ./vendor/bin/phpunit --no-coverage - sanity-check: - name: Sanity checks + quality: + name: Quality control + needs: [unit-tests-linux] runs-on: [ubuntu-latest] steps: - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php + id: setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 with: - php-version: '7.4' - extensions: mbstring, xml - tools: composer:v2 + php-version: '8.3' + tools: composer, phpcs, psalm + extensions: mbstring, soap, xml coverage: none - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Copy config.php.dist to config.php + run: cp config/config.php.dist config/config.php + + - name: Create SimpleSAMLphp cache directory + run: sudo mkdir -p /var/cache/simplesamlphp && sudo chmod 777 /var/cache/simplesamlphp - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v1 + uses: actions/cache@v4 with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- + path: $COMPOSER_CACHE + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Validate composer.json and composer.lock + run: composer validate - name: Install Composer dependencies run: composer install --no-progress --prefer-dist --optimize-autoloader - - name: Syntax check YAML / XML / JSON + - name: PHP Code Sniffer + run: phpcs + + - name: Psalm + continue-on-error: true run: | - bash vendor/bin/check-syntax-yaml.sh - bash vendor/bin/check-syntax-xml.sh - bash vendor/bin/check-syntax-json.sh + psalm \ + -c psalm.xml \ + --show-info=true \ + --shepherd \ + --php-version=${{ steps.setup-php.outputs.php-version }} - quality: - name: Quality control - runs-on: [ubuntu-latest] - needs: [basic-tests] + - name: Psalm (testsuite) + continue-on-error: true + run: | + psalm \ + -c psalm-dev.xml \ + --show-info=true \ + --shepherd \ + --php-version=${{ steps.setup-php.outputs.php-version }} + + - name: Psalter + run: | + psalm --alter \ + --issues=UnnecessaryVarAnnotation \ + --dry-run \ + --php-version=${{ steps.setup-php.outputs.php-version }} + + - name: Check for unused translations + continue-on-error: true + run: composer translations:unused + security: + name: Security checks + needs: [unit-tests-linux] + runs-on: [ubuntu-latest] steps: - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 with: - php-version: '7.4' + php-version: '8.1' + extensions: mbstring, soap, xml tools: composer:v2 - extensions: mbstring, xml + coverage: none - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Copy config.php.dist to config.php + run: cp config/config.php.dist config/config.php + + - name: Create SimpleSAMLphp cache directory + run: sudo mkdir -p /var/cache/simplesamlphp && sudo chmod 777 /var/cache/simplesamlphp - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v1 + uses: actions/cache@v4 with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- + path: $COMPOSER_CACHE + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies run: composer install --no-progress --prefer-dist --optimize-autoloader - - uses: actions/download-artifact@v3 + - name: Security check for locked dependencies + run: composer audit + + - name: Update Composer dependencies + run: composer update --no-progress --prefer-dist --optimize-autoloader + + - name: Security check for updated dependencies + run: composer audit + + coverage: + name: Code coverage + runs-on: [ubuntu-latest] + needs: [unit-tests-linux] + steps: + - uses: actions/download-artifact@v4 with: - name: build-data + name: coverage-data path: ${{ github.workspace }}/build - name: Codecov - uses: codecov/codecov-action@v1 - - - name: PHP Code Sniffer - continue-on-error: false - run: php vendor/bin/phpcs + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true + verbose: true - - name: Psalm - continue-on-error: true - run: php vendor/bin/psalm --show-info=true --shepherd + cleanup: + name: Cleanup artifacts + needs: [unit-tests-linux, coverage] + runs-on: [ubuntu-latest] + if: | + always() && + needs.coverage.result == 'success' || + (needs.unit-tests-linux.result == 'success' && needs.coverage.result == 'skipped') - - name: Psalter - continue-on-error: false - run: php vendor/bin/psalter --issues=UnnecessaryVarAnnotation --dry-run + steps: + - uses: geekyeggo/delete-artifact@v5 + with: + name: coverage-data diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 0000000000..3b7f8d8545 --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,141 @@ +--- + +name: Build translations + +on: # yamllint disable-line rule:truthy + push: + tags-ignore: + - '**' + paths: + - '**.po' + - '**.php' + - '**.twig' + workflow_dispatch: + +jobs: + + build: + name: Setup and Build PO-files + runs-on: ['ubuntu-latest'] + + outputs: + files_changed: ${{ steps.changes.outputs.files_changed }} + + steps: + - name: Setup PHP, with composer and extensions + id: setup-php + # https://github.com/shivammathur/setup-php + uses: shivammathur/setup-php@v2 + with: + # Should be the higest supported version, so we can use the newest tools + php-version: '8.2' + coverage: none + + - uses: actions/checkout@v4 + with: + # token: ${{ secrets.PAT_TOKEN }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} + persist-credentials: false + fetch-depth: 0 + + - name: Install Composer dependencies + run: composer install --no-progress --prefer-dist --optimize-autoloader + + - name: Generate new updated PO-files + run: php bin/translations translations:update:translatable --module main + + - name: Diff the changes after building + shell: pwsh + # Give an id to the step, so we can reference it later + id: changes + run: | + git add --all + $Diff = git diff --cached --name-only + + # Check if any of the translation files have changed (added, modified, deleted) + $SourceDiff = $Diff | Where-Object { + $_ -match '^*.po' + } + echo "Changed files" + echo $SourceDiff + + $HasSourceDiff = $SourceDiff.Length -gt 0 + echo "($($SourceDiff.Length) changes)" + echo "files_changed=$HasSourceDiff" >> $env:GITHUB_OUTPUT + + - name: Zip artifact for deployment + if: steps.changes.outputs.files_changed == 'true' || steps.changes.outputs.packages_changed + run: zip build.zip -r . + + - uses: actions/upload-artifact@v4 + if: steps.changes.outputs.files_changed == 'true' || steps.changes.outputs.packages_changed + with: + name: build + path: build.zip + retention-days: 1 + + commit: + name: Commit changes to assets + needs: build + if: needs.build.outputs.files_changed == 'true' + runs-on: [ubuntu-latest] + + steps: + - uses: actions/download-artifact@v4 + with: + name: build + + - name: unzip artifact for deployment + run: | + unzip build.zip + rm build.zip + + - name: Add & Commit + uses: EndBug/add-and-commit@v9 + with: + # The arguments for the `git add` command (see the paragraph below for more info) + # Default: '.' + add: "['**/*.po']" + fetch: false + push: false + + # Determines the way the action fills missing author name and email. Three options are available: + # - github_actor -> UserName + # - user_info -> Your Display Name + # - github_actions -> github-actions + # Default: github_actor + default_author: github_actions + + # The message for the commit. + # Default: 'Commit from GitHub Actions (name of the workflow)' + message: "[skip ci] Auto-rebuild translations" + + # The way the action should handle pathspec errors from the add and remove commands. + # Three options are available: + # - ignore -> errors will be logged but the step won't fail + # - exitImmediately -> the action will stop right away, and the step will fail + # - exitAtEnd -> the action will go on, every pathspec error will be logged at the end, the step will fail. + # Default: ignore + pathspec_error_handling: exitImmediately + + - name: Push changes + uses: ad-m/github-push-action@master + with: + branch: ${{ github.ref_name }} + github_token: ${{ secrets.GITHUB_TOKEN }} + + cleanup: + name: Cleanup artifacts + needs: [build, commit] + runs-on: [ubuntu-latest] + if: | + always() && + needs.commit.result == 'success' || + (needs.build.result == 'success' && needs.commit.result == 'skipped') + + steps: + - uses: geekyeggo/delete-artifact@v4 + with: + name: | + build diff --git a/.gitignore b/.gitignore index 35d237f357..cf6571b554 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,17 @@ -/log/ -/config/ -/metadata/ -/cert/ -/www/assets/fonts/* -/www/assets/js/*.js -/www/assets/js/*.js.LICENSE.txt -!/www/assets/js/post.js -/www/assets/js/*.map -/www/assets/css/*.css -/www/assets/css/*.css.LICENSE.txt -!/www/assets/css/post.css -/www/assets/css/*.map +cert/* +config/* +metadata/* +!/.github/build/*.json +!/cert/*.gitkeep +!/config/*.dist +!/metadata/*.dist +!/public/assets/.gitkeep +/public/assets/* +.phpunit.cache/ .phpunit.result.cache - -!/config/.gitkeep -!/metadata/.gitkeep -!/cache/.gitkeep -!/locales/.gitkeep -!/www/assets/fonts/.gitkeep -!/www/assets/js/.gitkeep -!/www/assets/css/.gitkeep - +phpunit.xml.bak +.phive +**.mo # https://www.gitignore.io/api/osx,windows,linux,netbeans,sublimetext,composer,phpstorm,vagrant # Created by https://www.gitignore.io diff --git a/.php_cs.dist b/.php_cs.dist index feb3f1ad29..125938bd73 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -1,13 +1,13 @@ exclude(__DIR__ . '/www/resources') + ->exclude(__DIR__ . '/public/assets') ->in([ __DIR__ . '/modules', + __DIR__ . '/public', __DIR__ . '/src', __DIR__ . '/templates', __DIR__ . '/tests', - __DIR__ . '/www', ]) ; diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c8e96d5d81..b0167c5baa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,23 +6,6 @@ These guidelines briefly explain how to contribute to SimpleSAMLphp effectively [TOC] -## Team members - -Currently, the core team members are: - -* Jaime Pérez Crespo, *maintainer and main developer*, UNINETT -* Tim van Dijen, *main developer* -* Thijs Kinkhorst, *main developer* - -Two other persons are listed here for historical reasons, even though they are no longer involved in the project: - -* Andreas Åkre Solberg, *architect and original developer*, UNINETT -* Olav Morken, *architect and main developer*, UNINETT - -We have been lucky enough to have so many people help us through the years. SimpleSAMLphp wouldn't have reached so far without them. We want to thank them from here, but unfortunately they are so many it is nearly impossible to mention all of them. [Here is a Github page that summarizes everyone's contributions](https://github.com/simplesamlphp/simplesamlphp/graphs/contributors?from=2007-09-09&to=2015-09-06&type=c). - -***Big thanks to you all!*** - ## First things first Before embarking yourself in a contribution, please make sure you are familiar with the way SimpleSAMLphp is written, the way it works, and what is required or not. @@ -97,35 +80,17 @@ You can help us diagnose and fix bugs by asking and providing answers to the fol ## Reporting vulnerabilities -In case you find a vulnerability in SimpleSAMLphp, or you want to confirm a possible security issue in the software, please get in touch with us through [UNINETT's CERT team](https://www.uninett.no/cert). Please use our PGP public key to encrypt any possibly sensitive data that you may need to submit. We will get back to you as soon as possible according to our working hours in Central European Time. - -When reporting a security issue, please add as much information as possible to help us identify, confirm, replicate and fix the problem. In particular, remember to include the following information in your report: - -* The version or versions of SimpleSAMLphp affected. -* An exact version that can be used to replicate the issue. -* Any module or modules involved in the issue. -* Any particular configuration details relevant to the setup affected. -* A detailed description and a clear and concise, step-by-step guide to allow us reproduce the issue. -* Screenshots, videos, or any other media that would help identify the issue. -* Pointers to the exact line or lines in the code where the vulnerability is supposed to be. -* Context on how you discovered the issue. -* Your own name and whether you want to be credited for the discovery or not. - -Please **DO NOT** report security incidents related to systems that use SimpleSAMLphp, where this software is not the cause of the incident. Issues related to the use (or misuse) of infrastructure, misconfiguration of the software, malfunction of a particular system or user-related errors should not be reported either. If you are using SimpleSAMLphp to authenticate or login to services, but you don't know what SimpleSAMLphp is or you are not sure about the nature of the issue, please contact the organization running the service for you. - -Finally, be reasonable. We'll do our best to resolve the issue according to our principles of security and transparency. Every confirmed vulnerability will be published and resolved in a timely manner. All we ask in return is that you contact us privately first in order to avoid any potential damage to those using the software. - -You can find the list of security advisories we have published [here](https://simplesamlphp.org/security). +Please see [SECURITY.md](SECURITY.md) for how to report security vulnerabilities. Please do *not* use the public issue tracker. ## Translations -SimpleSAMLphp is translated to many languages, though it needs constant updates from translators, as well as new translations to other languages. For the moment, translations can be contributed as **pull requests**. We are looking at better ways to translate the software that would make your life easier, so stay tuned! You can also join the [translators mailing list](http://groups.google.com/group/simplesamlphp-translation) to keep up to date on the latest news. +SimpleSAMLphp is translated to many languages, though it needs constant updates from translators, as well as new translations to other languages. For the moment, translations can be contributed as **pull requests**. Before starting a new translation, decide what style you want to use, whether you want to address the user in a polite manner or not, etc. Be coherent and keep that style through all your translations. If there is already a translation and you want to complete it, make sure to keep the same style used by your fellow translators. ## Documentation improvements -Did you find a typo in the documentation? Does something make no sense? Did we use poor english? Tell us! +Did you find a typo in the documentation? Does something make no sense? Did we use poor English? Tell us! Documentation is included in our own repository in *markdown* format. You can submit pull requests with fixes. If you encounter some feature that is not documented, or the documentation does not reflect the real behaviour of the library, please do not hesitate to open an issue. diff --git a/COPYING b/COPYING index 25c761ed05..f1d41affca 100644 --- a/COPYING +++ b/COPYING @@ -1,4 +1,4 @@ -Copyright 2007-2020 UNINETT AS, 2021-2022 SimpleSAMLphp +Copyright 2007-2020 UNINETT AS, 2021-2024 SimpleSAMLphp SimpleSAMLphp is licensed under the CC-GNU LGPL version 2.1. http://creativecommons.org/licenses/LGPL/2.1/ diff --git a/SECURITY.md b/SECURITY.md index 676cf9becf..076d7be6d8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,11 +6,13 @@ This page contains information about security vulnerabilities, incidents or issu ## Supported Versions -Only the current minor version (X.Y) receives bug and security fixes as a general rule. Release candidates are not considered stable, meaning the previous minor version will still receive fixes until the release candidate promotes to stable. +Only the current minor version (X.Y) receives bug and security fixes as a general rule. + +The 1.19 branch will receive security and critical bug fixes until the end of 2023. ## Reporting a Vulnerability -In case you find a vulnerability in SimpleSAMLphp, or you want to confirm a possible security issue in the software, please get in touch with us through [UNINETT's CERT team](https://www.uninett.no/cert). Please use our PGP public key to encrypt any possible sensitive data that you may need to submit. We will get back to you as soon as possible according to our working hours in Central European Time. +In case you find a vulnerability in SimpleSAMLphp, or you want to confirm a possible security issue in the software, please get in touch with us through [Sikt's CERT team](https://sikt.no/abuse). Please use our PGP public key to encrypt any possible sensitive data that you may need to submit. We will get back to you as soon as possible according to our working hours in Central European Time. When reporting a security issue, please add as much information as possible to help us identify, confirm, replicate and fix the problem. In particular, remember to include the following information in your report: diff --git a/attributemap/entra2name.php b/attributemap/entra2name.php new file mode 100644 index 0000000000..ae591e58f0 --- /dev/null +++ b/attributemap/entra2name.php @@ -0,0 +1,25 @@ + 'uid', + "http://schemas.microsoft.com/identity/claims/displayname" => 'displayName', + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" => 'givenName', + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname" => 'sn', + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" => 'emailAddress', + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" => 'mail', + + /** + * Additional/Optional Claim, using default value + */ + "http://schemas.microsoft.com/ws/2008/06/identity/claims/groups" => 'groups', + + /** + * Additional Attributes from Entra + */ + "http://schemas.microsoft.com/claims/authnmethodsreferences" => 'authNMethodsReferences', + "http://schemas.microsoft.com/identity/claims/identityprovider" => 'idp', + "http://schemas.microsoft.com/identity/claims/tenantid" => 'tenantId', +]; \ No newline at end of file diff --git a/attributemap/name2entra.php b/attributemap/name2entra.php new file mode 100644 index 0000000000..b3267e8a0b --- /dev/null +++ b/attributemap/name2entra.php @@ -0,0 +1,25 @@ + 'http://schemas.microsoft.com/identity/claims/objectidentifier', + 'displayName' => 'http://schemas.microsoft.com/identity/claims/displayname', + 'givenName' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname', + 'sn' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname', + 'emailAddress' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress', + 'mail' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name', + + /** + * Additional/Optional Claim, using default value, mapped back to original claim names + */ + 'groups' => 'http://schemas.microsoft.com/ws/2008/06/identity/claims/groups', + + /** + * Additional Attributes from Entra, mapped back to original claims + */ + 'authNMethodsReferences' => 'http://schemas.microsoft.com/claims/authnmethodsreferences', + 'idp' => 'http://schemas.microsoft.com/identity/claims/identityprovider', + 'tenantId' => 'http://schemas.microsoft.com/identity/claims/tenantid', +]; \ No newline at end of file diff --git a/attributemap/name2oid.php b/attributemap/name2oid.php index 76631ea081..34fa864c29 100644 --- a/attributemap/name2oid.php +++ b/attributemap/name2oid.php @@ -44,18 +44,21 @@ 'eduOrgSuperiorURI' => 'urn:oid:1.3.6.1.4.1.5923.1.2.1.5', 'eduOrgWhitePagesURI' => 'urn:oid:1.3.6.1.4.1.5923.1.2.1.6', 'eduPersonAffiliation' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.1', + 'eduPersonAnalyticsTag' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.17', 'eduPersonAssurance' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.11', + 'eduPersonDisplayPronouns' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.18', 'eduPersonEntitlement' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.7', 'eduPersonNickname' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.2', + 'eduPersonOrcid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.16', 'eduPersonOrgDN' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.3', 'eduPersonOrgUnitDN' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.4', 'eduPersonPrimaryAffiliation' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.5', 'eduPersonPrimaryOrgUnitDN' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.8', 'eduPersonPrincipalName' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', + 'eduPersonPrincipalNamePrior' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.12', 'eduPersonScopedAffiliation' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.9', 'eduPersonTargetedID' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'eduPersonUniqueId' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.13', - 'eduPersonOrcid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.16', 'email' => 'urn:oid:1.2.840.113549.1.9.1', 'emailAddress' => 'urn:oid:1.2.840.113549.1.9.1', 'employeeNumber' => 'urn:oid:2.16.840.1.113730.3.1.3', diff --git a/attributemap/oid2name.php b/attributemap/oid2name.php index 7024b03a88..4a6d36079b 100644 --- a/attributemap/oid2name.php +++ b/attributemap/oid2name.php @@ -1,13 +1,20 @@ 'uid', + 'urn:oid:0.9.2342.19200300.100.1.2' => 'textEncodedORAddress', + 'urn:oid:0.9.2342.19200300.100.1.3' => 'mail', + 'urn:oid:0.9.2342.19200300.100.1.4' => 'info', + 'urn:oid:0.9.2342.19200300.100.1.5' => 'drink', + 'urn:oid:0.9.2342.19200300.100.1.6' => 'roomNumber', + 'urn:oid:0.9.2342.19200300.100.1.7' => 'photo', + 'urn:oid:0.9.2342.19200300.100.1.8' => 'userClass', + 'urn:oid:0.9.2342.19200300.100.1.9' => 'host', 'urn:oid:0.9.2342.19200300.100.1.10' => 'manager', 'urn:oid:0.9.2342.19200300.100.1.11' => 'documentIdentifier', 'urn:oid:0.9.2342.19200300.100.1.12' => 'documentTitle', 'urn:oid:0.9.2342.19200300.100.1.13' => 'documentVersion', 'urn:oid:0.9.2342.19200300.100.1.14' => 'documentAuthor', 'urn:oid:0.9.2342.19200300.100.1.15' => 'documentLocation', - 'urn:oid:0.9.2342.19200300.100.1.2' => 'textEncodedORAddress', 'urn:oid:0.9.2342.19200300.100.1.20' => 'homePhone', 'urn:oid:0.9.2342.19200300.100.1.21' => 'secretary', 'urn:oid:0.9.2342.19200300.100.1.22' => 'otherMailbox', @@ -16,13 +23,11 @@ 'urn:oid:0.9.2342.19200300.100.1.27' => 'mDRecord', 'urn:oid:0.9.2342.19200300.100.1.28' => 'mXRecord', 'urn:oid:0.9.2342.19200300.100.1.29' => 'nSRecord', - 'urn:oid:0.9.2342.19200300.100.1.3' => 'mail', 'urn:oid:0.9.2342.19200300.100.1.30' => 'sOARecord', 'urn:oid:0.9.2342.19200300.100.1.31' => 'cNAMERecord', 'urn:oid:0.9.2342.19200300.100.1.37' => 'associatedDomain', 'urn:oid:0.9.2342.19200300.100.1.38' => 'associatedName', 'urn:oid:0.9.2342.19200300.100.1.39' => 'homePostalAddress', - 'urn:oid:0.9.2342.19200300.100.1.4' => 'info', 'urn:oid:0.9.2342.19200300.100.1.40' => 'personalTitle', 'urn:oid:0.9.2342.19200300.100.1.41' => 'mobile', 'urn:oid:0.9.2342.19200300.100.1.42' => 'pager', @@ -33,7 +38,6 @@ 'urn:oid:0.9.2342.19200300.100.1.47' => 'mailPreferenceOption', 'urn:oid:0.9.2342.19200300.100.1.48' => 'buildingName', 'urn:oid:0.9.2342.19200300.100.1.49' => 'dSAQuality', - 'urn:oid:0.9.2342.19200300.100.1.5' => 'drink', 'urn:oid:0.9.2342.19200300.100.1.50' => 'singleLevelQuality', 'urn:oid:0.9.2342.19200300.100.1.51' => 'subtreeMinimumQuality', 'urn:oid:0.9.2342.19200300.100.1.52' => 'subtreeMaximumQuality', @@ -41,19 +45,14 @@ 'urn:oid:0.9.2342.19200300.100.1.54' => 'dITRedirect', 'urn:oid:0.9.2342.19200300.100.1.55' => 'audio', 'urn:oid:0.9.2342.19200300.100.1.56' => 'documentPublisher', - 'urn:oid:0.9.2342.19200300.100.1.6' => 'roomNumber', 'urn:oid:0.9.2342.19200300.100.1.60' => 'jpegPhoto', - 'urn:oid:0.9.2342.19200300.100.1.7' => 'photo', - 'urn:oid:0.9.2342.19200300.100.1.8' => 'userClass', - 'urn:oid:0.9.2342.19200300.100.1.9' => 'host', - 'urn:oid:1.2.840.113549.1.9.1' => 'email', 'urn:oid:1.2.752.194.10.2.2' => 'sisSchoolGrade', 'urn:oid:1.2.752.194.10.2.1' => 'sisLegalGuardianFor', 'urn:oid:1.2.752.194.10.3' => 'sisOrgDepartment', 'urn:oid:1.2.752.194.10.2.4' => 'sisSchoolUnitCode', + 'urn:oid:1.2.840.113549.1.9.1' => 'email', + 'urn:oid:1.3.6.1.4.1.250.1.57' => 'labeledURI', 'urn:oid:1.3.6.1.4.1.2428.90.1.1' => 'norEduOrgUniqueNumber', - 'urn:oid:1.3.6.1.4.1.2428.90.1.11' => 'norEduOrgSchemaVersion', - 'urn:oid:1.3.6.1.4.1.2428.90.1.12' => 'norEduOrgNIN', 'urn:oid:1.3.6.1.4.1.2428.90.1.2' => 'norEduOrgUnitUniqueNumber', 'urn:oid:1.3.6.1.4.1.2428.90.1.3' => 'norEduPersonBirthDate', 'urn:oid:1.3.6.1.4.1.2428.90.1.4' => 'norEduPersonLIN', @@ -62,13 +61,9 @@ 'urn:oid:1.3.6.1.4.1.2428.90.1.7' => 'norEduOrgUniqueIdentifier', 'urn:oid:1.3.6.1.4.1.2428.90.1.8' => 'norEduOrgUnitUniqueIdentifier', 'urn:oid:1.3.6.1.4.1.2428.90.1.9' => 'federationFeideSchemaVersion', - 'urn:oid:1.3.6.1.4.1.24552.500.1.1.1.13' => 'sshPublicKey', - 'urn:oid:1.3.6.1.4.1.250.1.57' => 'labeledURI', + 'urn:oid:1.3.6.1.4.1.2428.90.1.11' => 'norEduOrgSchemaVersion', + 'urn:oid:1.3.6.1.4.1.2428.90.1.12' => 'norEduOrgNIN', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.1' => 'eduPersonAffiliation', - 'urn:oid:1.3.6.1.4.1.5923.1.1.1.11' => 'eduPersonAssurance', - 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10' => 'eduPersonTargetedID', - 'urn:oid:1.3.6.1.4.1.5923.1.1.1.13' => 'eduPersonUniqueId', - 'urn:oid:1.3.6.1.4.1.5923.1.1.1.16' => 'eduPersonOrcid', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.2' => 'eduPersonNickname', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.3' => 'eduPersonOrgDN', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.4' => 'eduPersonOrgUnitDN', @@ -77,12 +72,20 @@ 'urn:oid:1.3.6.1.4.1.5923.1.1.1.7' => 'eduPersonEntitlement', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.8' => 'eduPersonPrimaryOrgUnitDN', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.9' => 'eduPersonScopedAffiliation', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10' => 'eduPersonTargetedID', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.11' => 'eduPersonAssurance', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.12' => 'eduPersonPrincipalNamePrior', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.13' => 'eduPersonUniqueId', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.16' => 'eduPersonOrcid', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.17' => 'eduPersonAnalyticsTag', + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.18' => 'eduPersonDisplayPronouns', 'urn:oid:1.3.6.1.4.1.5923.1.2.1.2' => 'eduOrgHomePageURI', 'urn:oid:1.3.6.1.4.1.5923.1.2.1.3' => 'eduOrgIdentityAuthNPolicyURI', 'urn:oid:1.3.6.1.4.1.5923.1.2.1.4' => 'eduOrgLegalName', 'urn:oid:1.3.6.1.4.1.5923.1.2.1.5' => 'eduOrgSuperiorURI', 'urn:oid:1.3.6.1.4.1.5923.1.2.1.6' => 'eduOrgWhitePagesURI', 'urn:oid:1.3.6.1.4.1.5923.1.5.1.1' => 'isMemberOf', + 'urn:oid:1.3.6.1.4.1.24552.500.1.1.1.13' => 'sshPublicKey', 'urn:oid:1.3.6.1.4.1.25178.1.0.2.3' => 'schacYearOfBirth', 'urn:oid:1.3.6.1.4.1.25178.1.2.1' => 'schacMotherTongue', 'urn:oid:1.3.6.1.4.1.25178.1.2.2' => 'schacGender', @@ -124,16 +127,16 @@ 'urn:oid:1.3.6.1.4.1.25178.4.2.3' => 'voPosixAccountHomeDirectory', 'urn:oid:1.3.6.1.4.1.25178.4.2.4' => 'voPosixAccountLoginShell', 'urn:oid:1.3.6.1.4.1.25178.4.2.5' => 'voPosixAccountUidNumber', - 'urn:oid:2.16.840.1.113730.3.1.1' => 'carLicense', - 'urn:oid:2.16.840.1.113730.3.1.2' => 'departmentNumber', - 'urn:oid:2.16.840.1.113730.3.1.216' => 'userPKCS12', - 'urn:oid:2.16.840.1.113730.3.1.241' => 'displayName', - 'urn:oid:2.16.840.1.113730.3.1.3' => 'employeeNumber', - 'urn:oid:2.16.840.1.113730.3.1.39' => 'preferredLanguage', - 'urn:oid:2.16.840.1.113730.3.1.4' => 'employeeType', - 'urn:oid:2.16.840.1.113730.3.1.40' => 'userSMIMECertificate', 'urn:oid:2.5.4.0' => 'objectClass', 'urn:oid:2.5.4.1' => 'aliasedObjectName', + 'urn:oid:2.5.4.2' => 'knowledgeInformation', + 'urn:oid:2.5.4.3' => 'cn', + 'urn:oid:2.5.4.4' => 'sn', + 'urn:oid:2.5.4.5' => 'serialNumber', + 'urn:oid:2.5.4.6' => 'c', + 'urn:oid:2.5.4.7' => 'l', + 'urn:oid:2.5.4.8' => 'st', + 'urn:oid:2.5.4.9' => 'street', 'urn:oid:2.5.4.10' => 'o', 'urn:oid:2.5.4.11' => 'ou', 'urn:oid:2.5.4.12' => 'title', @@ -144,7 +147,6 @@ 'urn:oid:2.5.4.17' => 'postalCode', 'urn:oid:2.5.4.18' => 'postOfficeBox', 'urn:oid:2.5.4.19' => 'physicalDeliveryOfficeName', - 'urn:oid:2.5.4.2' => 'knowledgeInformation', 'urn:oid:2.5.4.20' => 'telephoneNumber', 'urn:oid:2.5.4.21' => 'telexNumber', 'urn:oid:2.5.4.22' => 'teletexTerminalIdentifier', @@ -155,7 +157,6 @@ 'urn:oid:2.5.4.27' => 'destinationIndicator', 'urn:oid:2.5.4.28' => 'preferredDeliveryMethod', 'urn:oid:2.5.4.29' => 'presentationAddress', - 'urn:oid:2.5.4.3' => 'cn', 'urn:oid:2.5.4.30' => 'supportedApplicationContext', 'urn:oid:2.5.4.31' => 'member', 'urn:oid:2.5.4.32' => 'owner', @@ -166,7 +167,6 @@ 'urn:oid:2.5.4.37' => 'cACertificate', 'urn:oid:2.5.4.38' => 'authorityRevocationList', 'urn:oid:2.5.4.39' => 'certificateRevocationList', - 'urn:oid:2.5.4.4' => 'sn', 'urn:oid:2.5.4.40' => 'crossCertificatePair', 'urn:oid:2.5.4.41' => 'name', 'urn:oid:2.5.4.42' => 'givenName', @@ -177,15 +177,18 @@ 'urn:oid:2.5.4.47' => 'enhancedSearchGuide', 'urn:oid:2.5.4.48' => 'protocolInformation', 'urn:oid:2.5.4.49' => 'distinguishedName', - 'urn:oid:2.5.4.5' => 'serialNumber', 'urn:oid:2.5.4.50' => 'uniqueMember', 'urn:oid:2.5.4.51' => 'houseIdentifier', 'urn:oid:2.5.4.52' => 'supportedAlgorithms', 'urn:oid:2.5.4.53' => 'deltaRevocationList', 'urn:oid:2.5.4.54' => 'dmdName', - 'urn:oid:2.5.4.6' => 'c', 'urn:oid:2.5.4.65' => 'pseudonym', - 'urn:oid:2.5.4.7' => 'l', - 'urn:oid:2.5.4.8' => 'st', - 'urn:oid:2.5.4.9' => 'street', + 'urn:oid:2.16.840.1.113730.3.1.1' => 'carLicense', + 'urn:oid:2.16.840.1.113730.3.1.2' => 'departmentNumber', + 'urn:oid:2.16.840.1.113730.3.1.3' => 'employeeNumber', + 'urn:oid:2.16.840.1.113730.3.1.4' => 'employeeType', + 'urn:oid:2.16.840.1.113730.3.1.39' => 'preferredLanguage', + 'urn:oid:2.16.840.1.113730.3.1.40' => 'userSMIMECertificate', + 'urn:oid:2.16.840.1.113730.3.1.216' => 'userPKCS12', + 'urn:oid:2.16.840.1.113730.3.1.241' => 'displayName', ]; diff --git a/bin/build-release.sh b/bin/build-release.sh deleted file mode 100755 index 0c86f18cf1..0000000000 --- a/bin/build-release.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -set -e - -VERSION=$1 -REPOPATH=$2 - -if ! shift; then - echo "$0: Missing required version parameter." >&2 - exit 1 -fi - -if [ -z "$VERSION" ]; then - echo "$0: Empty version parameter." >&2 - exit 1 -fi - -if [ -z "$REPOPATH" ]; then - REPOPATH="https://github.com/simplesamlphp/simplesamlphp.git" -fi - -TAG="v$VERSION" -TARGET="simplesamlphp-$VERSION" - -cd /tmp - -if [ -a "$TARGET" ]; then - echo "$0: Destination already exists: $TARGET" >&2 - exit 1 -fi - -umask 0022 - -git clone $REPOPATH $TARGET -cd $TARGET -git checkout $TAG -cd .. - -if [ ! -x "$TARGET/composer.phar" ]; then - curl -sS https://getcomposer.org/installer | php -- --install-dir=$TARGET -fi - -# Set the version in composer.json -php "$TARGET/composer.phar" config version "v$VERSION" -d "$TARGET" - -# Install dependencies (without vcs history or dev tools) -php "$TARGET/composer.phar" install --no-dev --prefer-dist -o -d "$TARGET" - -cd $TARGET -npm install -npm audit fix -npm run build -cd .. - -mkdir -p "$TARGET/config" "$TARGET/metadata" "$TARGET/cert" "$TARGET/log" "$TARGET/data" -cp -rv "$TARGET/config-templates/"* "$TARGET/config/" -cp -rv "$TARGET/metadata-templates/"* "$TARGET/metadata/" -rm -rf "$TARGET/.git" -rm -rf "$TARGET/node_modules" -rm "$TARGET/www/assets/js/stylesheet.js"* -rm "$TARGET/.editorconfig" -rm "$TARGET/.gitattributes" -rm -r "$TARGET/.github" -rm "$TARGET"/phpunit.xml -rm "$TARGET"/{cache,config,metadata,locales}/.gitkeep -rm "$TARGET/composer.phar" -rm "$TARGET/bin/build-release.sh" -tar --owner 0 --group 0 -cvzf "$TARGET.tar.gz" "$TARGET" -rm -rf "$TARGET" - -echo "Created: /tmp/$TARGET.tar.gz" diff --git a/bin/console b/bin/console index a01bc1443c..74816335eb 100755 --- a/bin/console +++ b/bin/console @@ -1,6 +1,8 @@ #!/usr/bin/env php getParameterOption(['--modules', '-m'], 'core'); +$module = $input->getParameterOption(['--module', '-m'], 'core'); $kernel = new Kernel($module); $application = new Application($kernel); diff --git a/bin/convertTranslations.php b/bin/convertTranslations.php index 96e52776ec..4c33d864ab 100755 --- a/bin/convertTranslations.php +++ b/bin/convertTranslations.php @@ -41,7 +41,7 @@ function codifyWithSource(array $sourcePairs, array $destPairs): array function dissectFile(array $fileInputRaw): array { $pairs = []; -// create an array with MSGID => MSGSTR + // create an array with MSGID => MSGSTR foreach ($fileInputRaw as $rowIndex => $oneLine) { if (preg_match("/^msgid/", $oneLine)) { $msgId = $oneLine; @@ -120,7 +120,7 @@ function dissectFile(array $fileInputRaw): array STDERR, "Merging (for nullify) " . count($sourcePairs) . " entries from source language (destination language has " . - count($destPairs) . " already.\n" + count($destPairs) . " already.\n", ); $outputPairs = mergeWithSource($sourcePairs, $destPairs); foreach ($outputPairs as $key => $value) { @@ -132,7 +132,7 @@ function dissectFile(array $fileInputRaw): array STDERR, "Merging " . count($sourcePairs) . " entries from source language (destination language has " . - count($destPairs) . " already.\n" + count($destPairs) . " already.\n", ); $outputPairs = mergeWithSource($sourcePairs, $destPairs); break; @@ -141,7 +141,7 @@ function dissectFile(array $fileInputRaw): array STDERR, "Codifying " . count($sourcePairs) . " entries from destination language (pool has " . - count($destPairs) . " candidates).\n" + count($destPairs) . " candidates).\n", ); $outputPairs = codifyWithSource($sourcePairs, $destPairs); break; diff --git a/bin/get-translatable-strings b/bin/get-translatable-strings deleted file mode 100755 index bc4a4f2e9f..0000000000 --- a/bin/get-translatable-strings +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/php -q -|--main)\n"; - exit(1); -} - -if($argv[1] === '--main') { - $modules = ['', 'core', 'admin', 'cron', 'exampleauth', 'multiauth', 'saml']; -} else { - $modules = [$argv[1]]; -} - -$transUtils = new Utils\Translate(); -$sysUtils = new Utils\System(); -$filesystem = new Filesystem(); - -$tempDirBase = $sysUtils->getTempDir() . "/temptemplatestemp"; -// Ensure no leftover from any previous invocation -$filesystem->remove($tempDirBase); - -$outputSuffix = '/locales/en/LC_MESSAGES'; - - -foreach($modules as $module) { - $tempDir = $tempDirBase . "/" . $module; - $transUtils->compileAllTemplates($module, $tempDir); - $domain = $module ?: 'messages'; - - $moduleDir = $baseDir . ($module === '' ? '' : '/modules/' . $module); - $moduleSrcDir = $moduleDir . '/src/'; - $outputDir = $moduleDir . $outputSuffix; - print `find $tempDir $moduleSrcDir -name \*.php | xargs xgettext --default-domain=$domain -p $outputDir --from-code=UTF-8 -j --omit-header --no-location -ktrans -knoop -L PHP`; -} - -$filesystem->remove($tempDirBase); -// TODO: merge new strings into translated languages catalogs diff --git a/bin/importPdoMetadata.php b/bin/importPdoMetadata.php index 271152a73c..5376b8a0ee 100755 --- a/bin/importPdoMetadata.php +++ b/bin/importPdoMetadata.php @@ -1,10 +1,15 @@ #!/usr/bin/env php getConfigDir(); + +require_once $configDir . DIRECTORY_SEPARATOR . 'config.php'; # Iterate through configured metadata sources and ensure # that a PDO source exists. diff --git a/bin/initMDSPdo.php b/bin/initMDSPdo.php index 79af70f125..e68dfadf39 100755 --- a/bin/initMDSPdo.php +++ b/bin/initMDSPdo.php @@ -1,12 +1,18 @@ #!/usr/bin/env php getConfigDir(); + +require_once $configDir . DIRECTORY_SEPARATOR . 'config.php'; echo "Initializing Metadata Database..." . PHP_EOL; diff --git a/bin/memcacheSync.php b/bin/memcacheSync.php index 85bdbacfc2..5833cc200b 100755 --- a/bin/memcacheSync.php +++ b/bin/memcacheSync.php @@ -1,6 +1,8 @@ #!/usr/bin/env php getConfigDir(); \SimpleSAML\Configuration::setConfigDir($configdir); // Things we should warn the user about diff --git a/bin/pwgen.php b/bin/pwgen.php index 5980566bf4..f969f3d217 100755 --- a/bin/pwgen.php +++ b/bin/pwgen.php @@ -1,25 +1,62 @@ #!/usr/bin/env php 0) { + $password = rtrim($password, "\r\n"); + $length = strlen($password); + } +} while ($length === 0); // retry if password is empty + +$passwordHash = $hasher->hash($password); -$cryptoUtils = new SimpleSAML\Utils\Crypto(); -echo "\n " . $cryptoUtils->pwHash($password) . "\n\n"; +echo "\nPassword hash:\n" . $passwordHash . "\n\n"; diff --git a/bin/translateAttributes.php b/bin/translateAttributes.php index 7ed0a21117..6ece51329f 100755 --- a/bin/translateAttributes.php +++ b/bin/translateAttributes.php @@ -6,6 +6,8 @@ * translation file for each supported language. */ +declare(strict_types=1); + $base = __DIR__ . '/../'; include_once($base . 'vendor/autoload.php'); @@ -30,7 +32,7 @@ $attributes = []; -$languages = SimpleSAML\Locale\Language::$language_names; +$languages = Symfony\Component\Intl\Languages::getNames(); $languages['nb'] = $languages['no']; unset($languages['no']); @@ -59,7 +61,7 @@ [ 'en' => $defs['attribute_' . $lower]['en'], ], - $trans['attribute_' . $lower] + $trans['attribute_' . $lower], ), ]; } diff --git a/bin/translations b/bin/translations new file mode 100755 index 0000000000..61bf89c91e --- /dev/null +++ b/bin/translations @@ -0,0 +1,20 @@ +#!/usr/bin/env php +add(new UnusedTranslatableStringsCommand()); +$application->add(new UpdateTranslatableStringsCommand()); +$application->run(); diff --git a/cache/.gitkeep b/cert/.gitkeep similarity index 100% rename from cache/.gitkeep rename to cert/.gitkeep diff --git a/codecov.yml b/codecov.yml index 1e5da3250e..623fb22c66 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,16 +1,18 @@ +--- + coverage: status: project: default: target: 0% threshold: 2% - patch: off + patch: false comment: layout: "diff" behavior: once require_changes: true - require_base: no - require_head: yes + require_base: false + require_head: true branches: null github_checks: annotations: false diff --git a/composer.json b/composer.json index fd577daef2..4428d251fb 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "A PHP implementation of a SAML 2.0 service provider and identity provider.", "type": "project", "keywords": [ "saml2", "shibboleth","oauth","ws-federation","sp","idp" ], - "homepage": "http://simplesamlphp.org", + "homepage": "https://simplesamlphp.org", "license": "LGPL-2.1-or-later", "authors": [ { @@ -44,52 +44,65 @@ "files": ["tests/_autoload_modules.php"] }, "require": { - "php": ">=7.4 || ^8.0", + "php": "^8.1", "ext-date": "*", "ext-dom": "*", "ext-hash": "*", - "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", "ext-pcre": "*", + "ext-session": "*", + "ext-simplexml": "*", "ext-SPL": "*", "ext-zlib": "*", - "composer/composer": "^2.3", - "gettext/gettext": "^5.6.1", - "gettext/translator": "^1.0.1", - "phpmailer/phpmailer": "^6.5", - "simplesamlphp/assert": "^0.6.3", - "simplesamlphp/saml2": "^4.6", - "symfony/cache": "^5.4", - "symfony/config": "^5.4", - "symfony/console": "^5.4", - "symfony/dependency-injection": "^5.4", - "symfony/filesystem": "^5.4", - "symfony/finder": "^5.4", - "symfony/framework-bundle": "^5.4", - "symfony/http-foundation": "^5.4", - "symfony/http-kernel": "^5.4", - "symfony/intl": "^5.4", - "symfony/routing": "^5.4", - "symfony/translation-contracts": "^2.5", - "symfony/twig-bridge": "^5.4", - "symfony/var-exporter": "^5.4", - "symfony/yaml": "^5.4", - "twig/intl-extra": "^3.3", - "twig/twig": "^3.3.8" + + "gettext/gettext": "^5.7", + "gettext/translator": "^1.1", + "phpmailer/phpmailer": "^6.8", + "psr/log": "^3.0", + "simplesamlphp/assert": "^1.1", + "simplesamlphp/composer-module-installer": "^1.3", + "simplesamlphp/saml2": "^5.0.0", + "simplesamlphp/saml2-legacy": "^4.18.1", + "simplesamlphp/simplesamlphp-assets-base": "~2.4.0", + "simplesamlphp/xml-common": "^1.24.2", + "simplesamlphp/xml-security": "^1.7", + "symfony/cache": "^6.4", + "symfony/config": "^6.4", + "symfony/console": "^6.4", + "symfony/dependency-injection": "^6.4", + "symfony/expression-language": "~6.4.0", + "symfony/filesystem": "^6.4", + "symfony/finder": "^6.4", + "symfony/framework-bundle": "^6.4", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.4", + "symfony/intl": "^6.4", + "symfony/password-hasher": "^6.4", + "symfony/polyfill-intl-icu": "^1.28", + "symfony/routing": "^6.4", + "symfony/translation-contracts": "^3.0", + "symfony/twig-bridge": "^6.4", + "symfony/var-exporter": "^6.4", + "symfony/yaml": "^6.4", + "twig/intl-extra": "^3.7", + "twig/twig": "^3.14.0" }, "require-dev": { "ext-curl": "*", "ext-pdo_sqlite": "*", + + "gettext/php-scanner": "1.3.1", "mikey179/vfsstream": "~1.6", - "simplesamlphp/simplesamlphp-module-adfs": ">=2.0.0-rc4", - "simplesamlphp/simplesamlphp-test-framework": "^1.2.1", - "simplesamlphp/xml-security": "^0.6.4" + "predis/predis": "^2.2", + "simplesamlphp/simplesamlphp-test-framework": "^1.9.2", + "symfony/translation": "^6.4" }, "suggest": { "predis/predis": "Needed if a Redis server is used to store session information", "ext-curl": "Needed in order to check for updates automatically", + "ext-intl": "Needed if translations for non-English languages are required.", "ext-ldap": "Needed if an LDAP backend is used", "ext-memcache": "Needed if a Memcache server is used to store session information", "ext-pdo": "Needed if a database backend is used, either for authentication or to store session information", @@ -103,8 +116,31 @@ "config": { "allow-plugins": { "composer/package-versions-deprecated": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "muglug/package-versions-56": true, + "phpstan/extension-installer": true, "simplesamlphp/composer-module-installer": true, - "muglug/package-versions-56": true + "simplesamlphp/composer-xmlprovider-installer": true } - } + }, + "extra": { + "branch-alias": { + "dev-master": "2.4.0.x-dev" + } + }, + "scripts": { + "translations:unused": "./bin/translations translations:unused", + "translations:update:translatable": "./bin/translations translations:update:translatable", + "clear-symfony-cache": [ + "./bin/console cache:clear --no-warmup", + "./bin/console ssp-cache:clear --no-warmup" + ], + "post-update-cmd": [ + "echo 'Post-update tasks completed!'" + ], + "post-install-cmd": [ + "echo 'Post-install tasks completed!'" + ] + }, + "version": "v2.4.4" } diff --git a/composer.lock b/composer.lock index 121e17eaee..f05da3feb9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,42 +4,37 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "38261c0648a96d15d3b43a485ef94949", + "content-hash": "def4d8bcc4946f96ceceeac712b060af", "packages": [ { - "name": "composer/ca-bundle", - "version": "1.3.3", + "name": "gettext/gettext", + "version": "v5.7.3", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "url": "https://github.com/php-gettext/Gettext.git", + "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", + "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", "shasum": "" }, "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "gettext/languages": "^2.3", + "php": "^7.2|^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "brick/varexporter": "^0.3.5", + "friendsofphp/php-cs-fixer": "^3.2", + "oscarotero/php-cs-fixer-config": "^2.0", + "phpunit/phpunit": "^8.0|^9.0", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\CaBundle\\": "src" + "Gettext\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -48,76 +43,71 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "description": "PHP gettext manager", + "homepage": "https://github.com/php-gettext/Gettext", "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" + "JS", + "gettext", + "i18n", + "mo", + "po", + "translation" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/Gettext/issues", + "source": "https://github.com/php-gettext/Gettext/tree/v5.7.3" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/oscarotero", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/oscarotero", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://www.patreon.com/misteroom", + "type": "patreon" } ], - "time": "2022-07-20T07:14:26+00:00" + "time": "2024-12-01T10:18:08+00:00" }, { - "name": "composer/class-map-generator", - "version": "1.0.0", + "name": "gettext/languages", + "version": "2.12.1", "source": { "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + "url": "https://github.com/php-gettext/Languages.git", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", "shasum": "" }, "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" + "php": ">=5.3" }, "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, + "bin": [ + "bin/export-plural-rules", + "bin/import-cldr-data" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\ClassMapGenerator\\": "src" + "Gettext\\Languages\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -126,101 +116,76 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Michele Locati", + "email": "mlocati@gmail.com", + "role": "Developer" } ], - "description": "Utilities to scan PHP code and generate class maps.", + "description": "gettext languages with plural rules", + "homepage": "https://github.com/php-gettext/Languages", "keywords": [ - "classmap" + "cldr", + "i18n", + "internationalization", + "l10n", + "language", + "languages", + "localization", + "php", + "plural", + "plural rules", + "plurals", + "translate", + "translations", + "unicode" ], "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "issues": "https://github.com/php-gettext/Languages/issues", + "source": "https://github.com/php-gettext/Languages/tree/2.12.1" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/mlocati", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/mlocati", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2025-03-19T11:14:02+00:00" }, { - "name": "composer/composer", - "version": "2.4.1", + "name": "gettext/translator", + "version": "v1.2.1", "source": { "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414" + "url": "https://github.com/php-gettext/Translator.git", + "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/777d542e3af65f8e7a66a4d98ce7a697da339414", - "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414", + "url": "https://api.github.com/repos/php-gettext/Translator/zipball/8ae0ac79053bcb732a6c584cd86f7a82ef183161", + "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", - "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "php": "^7.2|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "friendsofphp/php-cs-fixer": "^2.15", + "gettext/gettext": "^5.0.0", + "oscarotero/php-cs-fixer-config": "^1.0", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.0" }, "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" + "gettext/gettext": "Is necessary to load and generate array files used by the translator" }, - "bin": [ - "bin/composer" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] - } - }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Gettext\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -229,75 +194,83 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", + "description": "Gettext translator functions", + "homepage": "https://github.com/php-gettext/Translator", "keywords": [ - "autoload", - "dependency", - "package" + "gettext", + "i18n", + "php", + "translator" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.1" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/Translator/issues", + "source": "https://github.com/php-gettext/Translator/tree/v1.2.1" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/oscarotero", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/oscarotero", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://www.patreon.com/misteroom", + "type": "patreon" } ], - "time": "2022-08-20T09:44:50+00:00" + "time": "2025-01-09T09:20:22+00:00" }, { - "name": "composer/metadata-minifier", - "version": "1.0.0", + "name": "guzzlehttp/psr7", + "version": "2.7.1", "source": { "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + "url": "https://github.com/guzzle/psr7.git", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.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": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Composer\\MetadataMinifier\\": "src" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -306,67 +279,112 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "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": "Small utility library that handles metadata minification and expansion.", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "composer", - "compression" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.1" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "url": "https://github.com/composer", + "url": "https://github.com/Nyholm", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], - "time": "2021-04-07T13:37:33+00:00" + "time": "2025-03-27T12:30:47+00:00" }, { - "name": "composer/pcre", - "version": "3.0.0", + "name": "nyholm/psr7", + "version": "1.8.2", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { - "Composer\\Pcre\\": "src" + "Nyholm\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -375,149 +393,143 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "psr-17", + "psr-7" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/Zegnat", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://github.com/nyholm", + "type": "github" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { - "name": "composer/semver", - "version": "3.3.2", + "name": "phpmailer/phpmailer", + "version": "v6.12.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, + "type": "library", "autoload": { "psr-4": { - "Composer\\Semver\\": "src" + "PHPMailer\\PHPMailer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-only" ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Brent R. Matzelle" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/Synchro", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2025-10-15T16:49:08+00:00" }, { - "name": "composer/spdx-licenses", - "version": "1.5.7", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Composer\\Spdx\\": "src" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -526,76 +538,42 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "SPDX licenses list and validation library.", + "description": "Common interface for caching libraries", "keywords": [ - "license", - "spdx", - "validator" + "cache", + "psr", + "psr-6" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.3", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "php": "^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -604,65 +582,51 @@ ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Restarts a process without Xdebug.", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "Xdebug", - "performance" + "clock", + "now", + "psr", + "psr-20", + "time" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "gettext/gettext", - "version": "v5.7.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-gettext/Gettext.git", - "reference": "8657e580747bb3baacccdcebe69cac094661e404" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/8657e580747bb3baacccdcebe69cac094661e404", - "reference": "8657e580747bb3baacccdcebe69cac094661e404", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "gettext/languages": "^2.3", - "php": "^7.2|^8.0" - }, - "require-dev": { - "brick/varexporter": "^0.3.5", - "friendsofphp/php-cs-fixer": "^3.2", - "oscarotero/php-cs-fixer-config": "^2.0", - "phpunit/phpunit": "^8.0|^9.0", - "squizlabs/php_codesniffer": "^3.0" + "php": ">=7.4.0" }, "type": "library", - "autoload": { + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { "psr-4": { - "Gettext\\": "src" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -671,70 +635,51 @@ ], "authors": [ { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "PHP gettext manager", - "homepage": "https://github.com/php-gettext/Gettext", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "JS", - "gettext", - "i18n", - "mo", - "po", - "translation" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v5.7.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "funding": [ - { - "url": "https://paypal.me/oscarotero", - "type": "custom" - }, - { - "url": "https://github.com/oscarotero", - "type": "github" - }, - { - "url": "https://www.patreon.com/misteroom", - "type": "patreon" - } - ], - "time": "2022-07-27T19:54:55+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "gettext/languages", - "version": "2.9.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-gettext/Languages.git", - "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", - "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" + "php": ">=7.2.0" }, - "bin": [ - "bin/export-plural-rules" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Gettext\\Languages\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -743,76 +688,49 @@ ], "authors": [ { - "name": "Michele Locati", - "email": "mlocati@gmail.com", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "gettext languages with plural rules", - "homepage": "https://github.com/php-gettext/Languages", + "description": "Standard interfaces for event handling.", "keywords": [ - "cldr", - "i18n", - "internationalization", - "l10n", - "language", - "languages", - "localization", - "php", - "plural", - "plural rules", - "plurals", - "translate", - "translations", - "unicode" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.9.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "funding": [ - { - "url": "https://paypal.me/mlocati", - "type": "custom" - }, - { - "url": "https://github.com/mlocati", - "type": "github" - } - ], - "time": "2021-11-11T17:30:39+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "gettext/translator", - "version": "v1.1.1", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/php-gettext/Translator.git", - "reference": "b18ff33e8203de623854561f5e47e992fc5c50bb" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Translator/zipball/b18ff33e8203de623854561f5e47e992fc5c50bb", - "reference": "b18ff33e8203de623854561f5e47e992fc5c50bb", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15", - "gettext/gettext": "^5.0.0", - "oscarotero/php-cs-fixer-config": "^1.0", - "phpunit/phpunit": "^8.0", - "squizlabs/php_codesniffer": "^3.0" - }, - "suggest": { - "gettext/gettext": "Is necessary to load and generate array files used by the translator" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Gettext\\": "src" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -821,75 +739,52 @@ ], "authors": [ { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Gettext translator functions", - "homepage": "https://github.com/php-gettext/Translator", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "gettext", - "i18n", - "php", - "translator" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/Translator/issues", - "source": "https://github.com/php-gettext/Translator/tree/v1.1.1" + "source": "https://github.com/php-fig/http-factory" }, - "funding": [ - { - "url": "https://paypal.me/oscarotero", - "type": "custom" - }, - { - "url": "https://github.com/oscarotero", - "type": "github" - }, - { - "url": "https://www.patreon.com/misteroom", - "type": "patreon" - } - ], - "time": "2022-02-23T20:29:40+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.2.12", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "php": "^7.2 || ^8.0" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -898,139 +793,101 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "json", - "schema" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "phpmailer/phpmailer", - "version": "v6.6.4", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b", - "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.2", - "yoast/phpunit-polyfills": "^1.0.0" - }, - "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1-only" + "MIT" ], "authors": [ { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2022-08-22T09:22:00+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.6" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, + "type": "library", "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1038,491 +895,462 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" } ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], + "description": "A polyfill for getallheaders.", "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "robrichards/xmlseclibs", + "version": "3.1.4", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/robrichards/xmlseclibs.git", + "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/bc87389224c6de95802b505e5265b0ec2c5bcdbd", + "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd", "shasum": "" }, "require": { - "php": ">=7.4.0" + "ext-openssl": "*", + "php": ">= 5.4" }, "type": "library", "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "RobRichards\\XMLSecLibs\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } + "BSD-3-Clause" ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "A PHP library for XML Security", + "homepage": "https://github.com/robrichards/xmlseclibs", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "security", + "signature", + "xml", + "xmldsig" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "issues": "https://github.com/robrichards/xmlseclibs/issues", + "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.4" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2025-12-08T11:57:53+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "simplesamlphp/assert", + "version": "v1.8.3", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/simplesamlphp/assert.git", + "reference": "01b4e706daafb109e9fabbf3b4497d2f4dada035" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/01b4e706daafb109e9fabbf3b4497d2f4dada035", + "reference": "01b4e706daafb109e9fabbf3b4497d2f4dada035", "shasum": "" }, "require": { - "php": ">=7.2.0" + "ext-date": "*", + "ext-filter": "*", + "ext-pcre": "*", + "ext-spl": "*", + "guzzlehttp/psr7": "~2.7.1", + "php": "^8.1", + "webmozart/assert": "~1.11.0" + }, + "require-dev": { + "ext-intl": "*", + "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "v1.1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "SimpleSAML\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-or-later" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" + }, + { + "name": "Jaime Perez Crespo", + "email": "jaimepc@gmail.com" } ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], + "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/simplesamlphp/assert/issues", + "source": "https://github.com/simplesamlphp/assert/tree/v1.8.3" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2025-10-28T16:40:50+00:00" }, { - "name": "psr/log", - "version": "1.1.4", + "name": "simplesamlphp/composer-module-installer", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "url": "https://github.com/simplesamlphp/composer-module-installer.git", + "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/edb2155d200e2a208816d06f42cfa78bfd9e7cf4", + "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4", "shasum": "" }, "require": { - "php": ">=5.3.0" + "composer-plugin-api": "^2.6", + "php": "^8.1", + "simplesamlphp/assert": "^1.6" }, - "type": "library", + "require-dev": { + "composer/composer": "^2.8.3", + "simplesamlphp/simplesamlphp-test-framework": "^1.8.0" + }, + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } + "class": "SimpleSAML\\Composer\\ModuleInstallerPlugin" }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "SimpleSAML\\Composer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" + "LGPL-2.1-only" ], + "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", + "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.4.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2024-12-08T16:57:03+00:00" }, { - "name": "react/promise", - "version": "v2.9.0", + "name": "simplesamlphp/composer-xmlprovider-installer", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "url": "https://github.com/simplesamlphp/composer-xmlprovider-installer.git", + "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/3d882187b5b0b404c381a2e4d17498ca4b2785b3", + "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3", "shasum": "" }, "require": { - "php": ">=5.4.0" + "composer-plugin-api": "^2.0", + "php": "^8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "composer/composer": "^2.4", + "simplesamlphp/simplesamlphp-test-framework": "^1.5.4" + }, + "type": "composer-plugin", + "extra": { + "class": "SimpleSAML\\Composer\\XMLProvider\\XMLProviderInstallerPlugin" }, - "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" + "SimpleSAML\\Composer\\XMLProvider\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" + "LGPL-2.1-only" ], + "description": "A composer plugin that will auto-generate a classmap with all classes that implement SerializableElementInterface.", "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "issues": "https://github.com/simplesamlphp/composer-xmlprovider-installer/issues", + "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.0.2" }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2025-06-28T18:54:25+00:00" }, { - "name": "robrichards/xmlseclibs", - "version": "3.1.1", + "name": "simplesamlphp/saml2", + "version": "v5.0.5", "source": { "type": "git", - "url": "https://github.com/robrichards/xmlseclibs.git", - "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df" + "url": "https://github.com/simplesamlphp/saml2.git", + "reference": "73c2dd8dd0ffd81f2f37ae59f02a00f1240bea53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df", - "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/73c2dd8dd0ffd81f2f37ae59f02a00f1240bea53", + "reference": "73c2dd8dd0ffd81f2f37ae59f02a00f1240bea53", "shasum": "" }, "require": { + "ext-date": "*", + "ext-dom": "*", + "ext-filter": "*", + "ext-libxml": "*", "ext-openssl": "*", - "php": ">= 5.4" + "ext-pcre": "*", + "ext-zlib": "*", + "nyholm/psr7": "~1.8.2", + "php": "^8.1", + "psr/clock": "~1.0.0", + "psr/http-message": "~2.0", + "psr/log": "~2.3.1 || ~3.0.0", + "simplesamlphp/assert": "~1.8.1", + "simplesamlphp/xml-common": "~1.25.0", + "simplesamlphp/xml-security": "~1.13.8", + "simplesamlphp/xml-soap": "~1.7.0" + }, + "require-dev": { + "beste/clock": "~3.0.0", + "ext-intl": "*", + "mockery/mockery": "~1.6.12", + "simplesamlphp/composer-xmlprovider-installer": "~1.0.2", + "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" + }, + "suggest": { + "ext-soap": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v5.0.x-dev" + } + }, "autoload": { "psr-4": { - "RobRichards\\XMLSecLibs\\": "src" + "SimpleSAML\\SAML2\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "LGPL-2.1-or-later" ], - "description": "A PHP library for XML Security", - "homepage": "https://github.com/robrichards/xmlseclibs", - "keywords": [ - "security", - "signature", - "xml", - "xmldsig" + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + } ], + "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "issues": "https://github.com/robrichards/xmlseclibs/issues", - "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1" + "issues": "https://github.com/simplesamlphp/saml2/issues", + "source": "https://github.com/simplesamlphp/saml2/tree/v5.0.5" }, - "time": "2020-09-05T13:00:25+00:00" + "time": "2025-12-08T12:13:43+00:00" }, { - "name": "seld/jsonlint", - "version": "1.9.0", + "name": "simplesamlphp/saml2-legacy", + "version": "v4.19.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "url": "https://github.com/simplesamlphp/saml2-legacy.git", + "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", + "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "ext-dom": "*", + "ext-openssl": "*", + "ext-zlib": "*", + "php": ">=7.1 || ^8.0", + "psr/log": "~1.1 || ^2.0 || ^3.0", + "robrichards/xmlseclibs": "^3.1.4", + "webmozart/assert": "^1.9" + }, + "conflict": { + "robrichards/xmlseclibs": "3.1.2" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "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" }, - "bin": [ - "bin/jsonlint" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v4.2.x-dev" + } + }, "autoload": { "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" + "SAML2\\": "src/SAML2" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-or-later" ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" } ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], + "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.19.1" }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2025-12-08T12:05:03+00:00" }, { - "name": "seld/phar-utils", - "version": "1.2.1", + "name": "simplesamlphp/simplesamlphp-assets-base", + "version": "v2.4.4", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", + "reference": "eed577f8defb548ae4849ecb32ffbb5222c5fb4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/eed577f8defb548ae4849ecb32ffbb5222c5fb4e", + "reference": "eed577f8defb548ae4849ecb32ffbb5222c5fb4e", "shasum": "" }, "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } + "php": "^8.1", + "simplesamlphp/composer-module-installer": "^1.3.4" }, + "type": "simplesamlphp-module", "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-or-later" ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" } ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], + "description": "Assets for the SimpleSAMLphp main repository", "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.4.4" }, - "time": "2022-08-31T10:31:18+00:00" + "time": "2026-01-20T20:25:51+00:00" }, { - "name": "seld/signal-handler", - "version": "2.0.1", + "name": "simplesamlphp/xml-common", + "version": "v1.25.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + "url": "https://github.com/simplesamlphp/xml-common.git", + "reference": "999603aa521d91e17b562bb0b498513af80eb190" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/999603aa521d91e17b562bb0b498513af80eb190", + "reference": "999603aa521d91e17b562bb0b498513af80eb190", "shasum": "" }, "require": { - "php": ">=7.2.0" + "ext-date": "*", + "ext-dom": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-pcre": "*", + "ext-spl": "*", + "php": "^8.1", + "simplesamlphp/assert": "~1.8.1", + "simplesamlphp/composer-xmlprovider-installer": "~1.0.2", + "symfony/finder": "~6.4.0" }, "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } + "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" }, + "type": "simplesamlphp-xmlprovider", "autoload": { "psr-4": { - "Seld\\Signal\\": "src/" + "SimpleSAML\\XML\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-or-later" ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Jaime Perez", + "email": "jaime.perez@uninett.no" + }, + { + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" } ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "description": "A library with classes and utilities for handling XML structures.", + "homepage": "http://simplesamlphp.org", "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" + "saml", + "xml" ], "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + "issues": "https://github.com/simplesamlphp/xml-common/issues", + "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2025-06-29T13:05:44+00:00" }, { - "name": "simplesamlphp/assert", - "version": "v0.6.3", + "name": "simplesamlphp/xml-security", + "version": "v1.13.8", "source": { "type": "git", - "url": "https://github.com/simplesamlphp/assert.git", - "reference": "d1b43494997a8853645f3e3f4f6e0eed5a1ed103" + "url": "https://github.com/simplesamlphp/xml-security.git", + "reference": "5e9c726889676911a499b44e15046227015a4947" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/d1b43494997a8853645f3e3f4f6e0eed5a1ed103", - "reference": "d1b43494997a8853645f3e3f4f6e0eed5a1ed103", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/5e9c726889676911a499b44e15046227015a4947", + "reference": "5e9c726889676911a499b44e15046227015a4947", "shasum": "" }, "require": { + "ext-dom": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-pcre": "*", "ext-spl": "*", - "php": "^7.4 || ^8.0", - "webmozart/assert": "^1.11" + "php": "^8.1", + "simplesamlphp/assert": "~1.8.1", + "simplesamlphp/xml-common": "~1.25.0" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.2.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "v0.2.x-dev" - } + "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" }, + "type": "simplesamlphp-xmlprovider", "autoload": { "psr-4": { - "SimpleSAML\\Assert\\": "src/" + "SimpleSAML\\XMLSecurity\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1531,60 +1359,63 @@ ], "authors": [ { - "name": "Tim van Dijen", - "email": "tvdijen@gmail.com" + "name": "Jaime Perez Crespo", + "email": "jaime.perez@uninett.no", + "role": "Maintainer" }, { - "name": "Jaime Perez Crespo", - "email": "jaimepc@gmail.com" + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com", + "role": "Maintainer" } ], - "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", + "description": "SimpleSAMLphp library for XML Security", + "homepage": "https://github.com/simplesamlphp/xml-security", + "keywords": [ + "security", + "signature", + "xml", + "xmldsig" + ], "support": { - "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v0.6.3" + "issues": "https://github.com/simplesamlphp/xml-security/issues", + "source": "https://github.com/simplesamlphp/xml-security/tree/v1.13.8" }, - "time": "2022-09-13T12:38:31+00:00" + "time": "2025-12-08T12:08:30+00:00" }, { - "name": "simplesamlphp/saml2", - "version": "v4.6.3", + "name": "simplesamlphp/xml-soap", + "version": "v1.7.1", "source": { "type": "git", - "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d" + "url": "https://github.com/simplesamlphp/xml-soap.git", + "reference": "ca1ee4ea29c62fa66fc30d040b4013b4543f4f76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/bfc9c79dd6b728a41d1de988f545f6e64728a51d", - "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d", + "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/ca1ee4ea29c62fa66fc30d040b4013b4543f4f76", + "reference": "ca1ee4ea29c62fa66fc30d040b4013b4543f4f76", "shasum": "" }, "require": { "ext-dom": "*", - "ext-openssl": "*", - "ext-zlib": "*", - "php": ">=7.1 || ^8.0", - "psr/log": "~1.1 || ^2.0 || ^3.0", - "robrichards/xmlseclibs": "^3.1.1", - "webmozart/assert": "^1.9" + "ext-pcre": "*", + "php": "^8.1", + "simplesamlphp/assert": "~1.8.1", + "simplesamlphp/xml-common": "~1.25.0" }, "require-dev": { - "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" + "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" }, - "type": "library", + "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { - "dev-master": "v4.2.x-dev" + "dev-master": "v2.0.x-dev" } }, "autoload": { "psr-4": { - "SAML2\\": "src/SAML2" + "SimpleSAML\\SOAP\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1593,71 +1424,70 @@ ], "authors": [ { - "name": "Andreas Åkre Solberg", - "email": "andreas.solberg@uninett.no" + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" } ], - "description": "SAML2 PHP library from SimpleSAMLphp", + "description": "SimpleSAMLphp library for XML SOAP", "support": { - "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.3" + "issues": "https://github.com/simplesamlphp/xml-soap/issues", + "source": "https://github.com/simplesamlphp/xml-soap/tree/v1.7.1" }, - "time": "2022-06-13T14:04:10+00:00" + "time": "2025-06-03T21:07:04+00:00" }, { "name": "symfony/cache", - "version": "v5.4.11", + "version": "v6.4.33", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5a0fff46df349f0db3fe242263451fddf5277362" + "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5a0fff46df349f0db3fe242263451fddf5277362", - "reference": "5a0fff46df349f0db3fe242263451fddf5277362", + "url": "https://api.github.com/repos/symfony/cache/zipball/5b088fa41eb9568748dc255c45e4054c387ba73b", + "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b", "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.0", - "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" + "doctrine/dbal": "^2.13.1|^3|^4", + "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/" ] @@ -1676,14 +1506,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/v6.4.33" }, "funding": [ { @@ -1694,42 +1524,43 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-28T15:25:17+00:00" + "time": "2026-01-27T15:05:20+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" }, "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/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", "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" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -1762,7 +1593,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" }, "funding": [ { @@ -1778,42 +1609,38 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2025-03-13T15:25:07+00:00" }, { "name": "symfony/config", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ec79e03125c1d2477e43dde8528535d90cc78379" + "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ec79e03125c1d2477e43dde8528535d90cc78379", - "reference": "ec79e03125c1d2477e43dde8528535d90cc78379", + "url": "https://api.github.com/repos/symfony/config/zipball/d445badf0ad2c2a492e38c0378c39997a56ef97b", + "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<4.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "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": { @@ -1841,7 +1668,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.11" + "source": "https://github.com/symfony/config/tree/v6.4.32" }, "funding": [ { @@ -1852,61 +1679,60 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2026-01-13T08:40:30+00:00" }, { "name": "symfony/console", - "version": "v5.4.12", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" + "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", + "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", "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.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.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" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^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/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "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": { @@ -1935,12 +1761,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.32" }, "funding": [ { @@ -1951,57 +1777,53 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-17T13:18:05+00:00" + "time": "2026-01-13T08:45:59+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a8b9251016e9476db73e25fa836904bc0bf74c62" + "reference": "b17882e933c4c606620247b6708ab53aa3b88753" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a8b9251016e9476db73e25fa836904bc0bf74c62", - "reference": "a8b9251016e9476db73e25fa836904bc0bf74c62", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b17882e933c4c606620247b6708ab53aa3b88753", + "reference": "b17882e933c4c606620247b6708ab53aa3b88753", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "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.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4.26" + "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": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4.26|^5.0|^6.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": { @@ -2029,7 +1851,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/v5.4.11" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.32" }, "funding": [ { @@ -2040,38 +1862,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2026-01-23T10:54:33+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "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/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -2096,7 +1922,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.6.0" }, "funding": [ { @@ -2112,31 +1938,35 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8" + "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/f75d17cb4769eb38cd5fccbda95cd80a054d35c8", - "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8c18400784fcb014dc73c8d5601a9576af7f8ad4", + "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.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" @@ -2167,7 +1997,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/v5.4.11" + "source": "https://github.com/symfony/error-handler/tree/v6.4.32" }, "funding": [ { @@ -2178,53 +2008,52 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2026-01-19T19:28:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "99d7e101826e6610606b9433248f80c1997cd20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b", + "reference": "99d7e101826e6610606b9433248f80c1997cd20b", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.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": { @@ -2252,7 +2081,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/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.32" }, "funding": [ { @@ -2263,42 +2092,43 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2026-01-05T11:13:48+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -2331,7 +2161,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -2347,27 +2177,97 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v6.4.32", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312", + "reference": "89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "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": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v6.4.32" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-04T11:52:13+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.12", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447" + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d67c1f9a1937406a9be3171b4b22250c0a11447", - "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", "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" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -2395,7 +2295,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.12" + "source": "https://github.com/symfony/filesystem/tree/v6.4.30" }, "funding": [ { @@ -2406,31 +2306,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-02T13:48:16+00:00" + "time": "2025-11-26T14:43:45+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v6.4.33", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "24965ca011dac87431729640feef8bcf7b5523e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0", + "reference": "24965ca011dac87431729640feef8bcf7b5523e0", "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": { @@ -2458,7 +2363,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/v6.4.33" }, "funding": [ { @@ -2469,119 +2374,121 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2026-01-26T13:03:48+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.4.12", + "version": "v6.4.33", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "49f8fe5d39b7513a3f26898788885dbe66b0d910" + "reference": "9ef2d0b63b9e855ba351e770a603d89699115801" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/49f8fe5d39b7513a3f26898788885dbe66b0d910", - "reference": "49f8fe5d39b7513a3f26898788885dbe66b0d910", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ef2d0b63b9e855ba351e770a603d89699115801", + "reference": "9ef2d0b63b9e855ba351e770a603d89699115801", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=7.2.5", - "symfony/cache": "^5.2|^6.0", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^5.4.5|^6.0.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^5.3|^6.0", - "symfony/http-kernel": "^5.4|^6.0", + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4.12|^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/polyfill-php81": "^1.22", - "symfony/routing": "^5.3|^6.0" + "symfony/routing": "^6.4|^7.0" }, "conflict": { "doctrine/annotations": "<1.13.1", - "doctrine/cache": "<1.11", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.3", - "symfony/console": "<5.2.5", - "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/form": "<5.2", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<5.2", - "symfony/messenger": "<5.4", - "symfony/mime": "<4.4", - "symfony/property-access": "<5.3", - "symfony/property-info": "<4.4", - "symfony/security-csrf": "<5.3", - "symfony/serializer": "<5.2", - "symfony/service-contracts": ">=3.0", - "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.3", - "symfony/twig-bridge": "<4.4", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<5.2", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<5.2" + "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/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.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.13.1", - "doctrine/cache": "^1.11|^2.0", + "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.3|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4.9|^6.0.9", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", - "symfony/dotenv": "^5.1|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/form": "^5.2|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/mailer": "^5.2|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/notifier": "^5.4|^6.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": "^4.4|^5.0|^6.0", - "symfony/property-info": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0", - "symfony/security-bundle": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/string": "^5.0|^6.0", - "symfony/translation": "^5.3|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/validator": "^5.2|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/workflow": "^5.2|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^2.10|^3.0" - }, - "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.4|^7.0.4", + "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.4" }, "type": "symfony-bundle", "autoload": { @@ -2609,7 +2516,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/v5.4.12" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.33" }, "funding": [ { @@ -2620,44 +2527,49 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-26T10:32:10+00:00" + "time": "2026-01-26T14:46:41+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.12", + "version": "v6.4.33", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f4bfe9611b113b15d98a43da68ec9b5a00d56791" + "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4bfe9611b113b15d98a43da68ec9b5a00d56791", - "reference": "f4bfe9611b113b15d98a43da68ec9b5a00d56791", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f1a490cc9d595ba7ebe684220e625d1e472ad278", + "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278", "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.4.12|>=7.0,<7.1.5" }, - "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.4.12|^7.1.5", + "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": { @@ -2685,7 +2597,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.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.33" }, "funding": [ { @@ -2696,81 +2608,87 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-19T07:33:17+00:00" + "time": "2026-01-27T15:04:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.12", + "version": "v6.4.33", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "37f660fa3bcd78fe4893ce23ebe934618ec099be" + "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/37f660fa3bcd78fe4893ce23ebe934618ec099be", - "reference": "37f660fa3bcd78fe4893ce23ebe934618ec099be", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/73fa5c999d7f741ca544a97d3c791cc97890ae4d", + "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.3.7|^6.0", - "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": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", + "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": "^5.4|^6.0", - "symfony/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", + "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.4.4|^7.0.4", + "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-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -2797,7 +2715,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/v5.4.12" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.33" }, "funding": [ { @@ -2808,48 +2726,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-26T14:40:40+00:00" + "time": "2026-01-28T10:02:13+00:00" }, { "name": "symfony/intl", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e" + "reference": "22748dcb8d1b0dd06db5ada9f7d9ce7523b0ee94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/d305c0c1d31b30b3876e041804c35e49e5f8a96e", - "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e", + "url": "https://api.github.com/repos/symfony/intl/zipball/22748dcb8d1b0dd06db5ada9f7d9ce7523b0ee94", + "reference": "22748dcb8d1b0dd06db5ada9f7d9ce7523b0ee94", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^4.4|^5.0|^6.0" + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { "Symfony\\Component\\Intl\\": "" }, - "classmap": [ - "Resources/stubs" - ], "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/data/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2874,7 +2791,7 @@ "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 access to the localization data of the ICU library", "homepage": "https://symfony.com", "keywords": [ "i18n", @@ -2885,7 +2802,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.11" + "source": "https://github.com/symfony/intl/tree/v6.4.32" }, "funding": [ { @@ -2896,53 +2813,49 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-20T11:34:24+00:00" + "time": "2026-01-11T21:01:02+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "name": "symfony/password-hasher", + "version": "v6.4.32", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "url": "https://github.com/symfony/password-hasher.git", + "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/fbdfa5a2ca218ec8bb9029517426df2d780bdba9", + "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9", "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": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "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": [ @@ -2950,24 +2863,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.26.0" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.32" }, "funding": [ { @@ -2978,41 +2889,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2026-01-01T21:24:53+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { - "ext-intl": "For best performance" + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3020,7 +2935,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3029,26 +2944,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.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -3059,41 +2972,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3101,11 +3015,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3121,18 +3032,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "grapheme", "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -3143,44 +3054,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "name": "symfony/polyfill-intl-icu", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=7.2" }, "suggest": { - "ext-mbstring": "For best performance" + "ext-intl": "For best performance and support of other locales than \"en\"" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3188,8 +3097,14 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3205,17 +3120,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill for intl's ICU-related data and classes", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", + "icu", + "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" }, "funding": [ { @@ -3226,38 +3142,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2025-06-20T22:24:30+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3265,7 +3185,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "classmap": [ "Resources/stubs" @@ -3285,16 +3205,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "intl", + "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -3305,38 +3227,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3344,21 +3274,14 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -3368,16 +3291,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ 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-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -3388,38 +3312,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "name": "symfony/polyfill-php83", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3427,7 +3352,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -3447,7 +3372,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", @@ -3456,7 +3381,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -3468,65 +3393,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "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": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -3534,47 +3401,40 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { "name": "symfony/routing", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226" + "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3e01ccd9b2a3a4167ba2b3c53612762300300226", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226", + "url": "https://api.github.com/repos/symfony/routing/zipball/0dc6253e864e71b486e8ba4970a56ab849106ebe", + "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.12", + "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "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": { @@ -3608,7 +3468,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.11" + "source": "https://github.com/symfony/routing/tree/v6.4.32" }, "funding": [ { @@ -3619,52 +3479,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2026-01-12T08:31:19+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "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/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "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", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3691,7 +3555,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -3702,43 +3566,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v5.4.12", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058" + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2fc515e512d721bf31ea76bd02fe23ada4640058", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058", + "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", "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/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": { @@ -3777,7 +3644,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.12" + "source": "https://github.com/symfony/string/tree/v6.4.30" }, "funding": [ { @@ -3788,47 +3655,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-12T17:03:11+00:00" + "time": "2025-11-21T18:03:05+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.2", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "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/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3855,7 +3726,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -3866,90 +3737,82 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/twig-bridge", - "version": "v5.4.12", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "94c3b38514c953e3e84719c96d4e578a01ca1819" + "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/94c3b38514c953e3e84719c96d4e578a01ca1819", - "reference": "94c3b38514c953e3e84719c96d4e578a01ca1819", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", + "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1|^2|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<5.3", - "symfony/form": "<5.3", - "symfony/http-foundation": "<5.3", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.2", - "symfony/workflow": "<5.2" + "symfony/console": "<5.4", + "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4", + "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": { - "doctrine/annotations": "^1.12", - "egulias/email-validator": "^2.1.10|^3", + "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": "^4.4|^5.0|^6.0", - "symfony/console": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/form": "^5.3|^6.0", - "symfony/http-foundation": "^5.3|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/intl": "^4.4|^5.0|^6.0", - "symfony/mime": "^5.2|^6.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.32|~7.3.10|^7.4.4", + "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/property-info": "^4.4|^5.1|^6.0", - "symfony/routing": "^4.4|^5.0|^6.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": "^4.4|^5.0|^6.0", - "symfony/security-csrf": "^4.4|^5.0|^6.0", - "symfony/security-http": "^4.4|^5.0|^6.0", - "symfony/serializer": "^5.2|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^5.2|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/workflow": "^5.2|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.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.3|^7.0.3", + "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/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": { @@ -3976,7 +3839,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.4.12" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.32" }, "funding": [ { @@ -3987,48 +3850,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-03T13:09:21+00:00" + "time": "2026-01-03T23:03:08+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.11", + "version": "v6.4.32", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861" + "reference": "131fc9915e0343052af5ed5040401b481ca192aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8f306d7b8ef34fb3db3305be97ba8e088fb4861", - "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/131fc9915e0343052af5ed5040401b481ca192aa", + "reference": "131fc9915e0343052af5ed5040401b481ca192aa", "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": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^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" ], @@ -4065,7 +3927,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.32" }, "funding": [ { @@ -4076,33 +3938,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2026-01-01T13:34:06+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.10", + "version": "v6.4.26", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", - "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", "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/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4135,10 +4003,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" }, "funding": [ { @@ -4149,40 +4019,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-27T12:56:18+00:00" + "time": "2025-09-11T09:57:09+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.12", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" + "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.3" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.3|^6.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" @@ -4213,7 +4084,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.12" + "source": "https://github.com/symfony/yaml/tree/v6.4.30" }, "funding": [ { @@ -4224,41 +4095,40 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-08-02T15:52:22+00:00" + "time": "2025-12-02T11:50:18+00:00" }, { "name": "twig/intl-extra", - "version": "v3.4.2", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "151e50fad9c7915bd56f0adf3f0cb3c47e6ed28a" + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/151e50fad9c7915bd56f0adf3f0cb3c47e6ed28a", - "reference": "151e50fad9c7915bd56f0adf3f0cb3c47e6ed28a", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/intl": "^4.4|^5.0|^6.0", - "twig/twig": "^2.7|^3.0" + "php": ">=8.1.0", + "symfony/intl": "^5.4|^6.4|^7.0|^8.0", + "twig/twig": "^3.13|^4.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, "autoload": { "psr-4": { "Twig\\Extra\\Intl\\": "" @@ -4286,463 +4156,193 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.4.2" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2022-06-10T08:33:05+00:00" - }, - { - "name": "twig/twig", - "version": "v3.4.2", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077", - "reference": "e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.4.2" + "source": "https://github.com/twigphp/intl-extra/tree/v3.23.0" }, "funding": [ { "url": "https://github.com/fabpot", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2022-08-12T06:47:24+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" } ], - "time": "2021-03-30T17:13:30+00:00" + "time": "2026-01-17T13:57:47+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", + "name": "twig/twig", + "version": "v3.23.0", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + "url": "https://github.com/twigphp/Twig.git", + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } + "phpstan/phpstan": "^2.0", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, + "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.23.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2022-01-17T14:14:24+00:00" + "time": "2026-01-23T21:00:41+00:00" }, { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=5.3.2" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { - "XdgBaseDir\\": "src/" + "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "implementation of xdg base directory specification for php", + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2019-12-04T15:06:13+00:00" - }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ { - "name": "doctrine/instantiator", - "version": "1.4.1", + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "composer-plugin-api": "^2.2", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { - "doctrine/coding-standard": "^9", - "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" + "composer/composer": "^2.2", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, - "type": "library", "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4751,157 +4351,139 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "Franck Nijhof", + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", "keywords": [ - "constructor", - "instantiate" + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" ], "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", + "source": "https://github.com/PHPCSStandards/composer-installer" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/jrfnl", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" + "time": "2025-11-11T04:32:07+00:00" }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "name": "gettext/php-scanner", + "version": "v1.3.1", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "url": "https://github.com/php-gettext/PHP-Scanner.git", + "reference": "989a2cffa1d0f43d13b14c83a50429119b5eb8e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/989a2cffa1d0f43d13b14c83a50429119b5eb8e4", + "reference": "989a2cffa1d0f43d13b14c83a50429119b5eb8e4", "shasum": "" }, "require": { - "php": ">=7.1" + "gettext/gettext": "^5.5.0", + "nikic/php-parser": "^4.2", + "php": ">=7.2" }, "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "friendsofphp/php-cs-fixer": "^2.15", + "oscarotero/php-cs-fixer-config": "^1.0", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" + "Gettext\\Scanner\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "PHP classes for the Language Server Protocol", + "description": "PHP scanner for gettext", + "homepage": "https://github.com/php-gettext/PHP-Scanner", "keywords": [ - "language", - "microsoft", + "gettext", + "i18n", "php", - "server" + "scanner", + "translation" ], "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/PHP-Scanner/issues", + "source": "https://github.com/php-gettext/PHP-Scanner/tree/v1.3.1" }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2022-03-18T11:47:55+00:00" }, { "name": "mikey179/vfsstream", - "version": "v1.6.11", + "version": "v1.6.12", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" + "phpunit/phpunit": "^7.5||^8.5||^9.6", + "yoast/phpunit-polyfills": "^2.0" }, "type": "library", "extra": { @@ -4932,20 +4514,20 @@ "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, - "time": "2022-02-23T02:02:42+00:00" + "time": "2024-08-29T18:43:31+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -4953,11 +4535,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -4983,7 +4566,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.13.4" }, "funding": [ { @@ -4991,90 +4574,34 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "time": "2020-12-01T19:48:11+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.19.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "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" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" @@ -5096,79 +4623,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" - }, - "time": "2022-09-04T07:30:47+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" }, - "time": "2019-03-29T20:06:56+00:00" + "time": "2025-12-06T11:45:25+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -5209,9 +4684,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -5265,205 +4746,243 @@ "time": "2022-02-21T01:04:05+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "phpstan/extension-installer", + "version": "1.4.3", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "PHPStan\\PhpDocParser\\": [ + "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" - ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, + "name": "phpstan/phpstan", + "version": "1.12.32", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", + "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" + "php": "^7.2|^8.0" }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "conflict": { + "phpstan/phpstan-shim": "*" }, + "bin": [ + "phpstan", + "phpstan.phar" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "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": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "url": "https://github.com/ondrejmirtes", + "type": "github" }, { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "url": "https://github.com/phpstan", + "type": "github" } ], - "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" + "time": "2025-09-30T10:16:31+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", + "name": "phpstan/phpstan-mockery", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "url": "https://github.com/phpstan/phpstan-mockery.git", + "reference": "98cac6e256b4ee60fdeb26a7dd81bb271b454e80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/98cac6e256b4ee60fdeb26a7dd81bb271b454e80", + "reference": "98cac6e256b4ee60fdeb26a7dd81bb271b454e80", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpstan/phpstan": "^1.12" }, "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "mockery/mockery": "^1.6.11", + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "^9.5" }, - "type": "library", + "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "PHPStan\\": "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", + "description": "PHPStan Mockery extension", "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + "issues": "https://github.com/phpstan/phpstan-mockery/issues", + "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.3" }, - "time": "2022-03-15T21:29:03+00:00" + "time": "2024-09-11T15:47:29+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.17", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", - "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" + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.1" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "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": "9.2-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -5491,7 +5010,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -5499,32 +5019,32 @@ "type": "github" } ], - "time": "2022-08-30T12:24:04+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -5551,7 +5071,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -5559,28 +5080,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -5588,7 +5109,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -5614,7 +5135,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -5622,32 +5143,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -5673,7 +5194,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -5681,32 +5203,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5732,7 +5254,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -5740,54 +5262,52 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.5.24", + "version": "10.5.63", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5" + "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", - "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", + "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", "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.13", - "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.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.1", - "sebastian/version": "^3.0.2" + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.5", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.4", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.1", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -5795,7 +5315,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -5826,7 +5346,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.24" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { @@ -5836,34 +5357,108 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-01-27T05:48:37+00:00" + }, + { + "name": "predis/predis", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "07105e050622ed80bd60808367ced9e379f31530" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/07105e050622ed80bd60808367ced9e379f31530", + "reference": "07105e050622ed80bd60808367ced9e379f31530", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.9", + "phpunit/phpcov": "^6.0 || ^8.0", + "phpunit/phpunit": "^8.0 || ^9.4" + }, + "suggest": { + "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "description": "A flexible and feature-complete Redis/Valkey client for PHP.", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "support": { + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" } ], - "time": "2022-08-30T07:42:16+00:00" + "time": "2025-11-12T18:00:11+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5886,7 +5481,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -5894,32 +5490,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5942,7 +5538,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -5950,32 +5546,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -5997,7 +5593,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/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -6005,34 +5601,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6071,41 +5669,54 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2026-01-24T09:25:16+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -6128,7 +5739,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -6136,33 +5748,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6194,7 +5806,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -6202,27 +5815,27 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -6230,7 +5843,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -6249,7 +5862,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -6257,7 +5870,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -6265,34 +5879,34 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "0735b90f4da94969541dac1da743446e276defa6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", + "reference": "0735b90f4da94969541dac1da743446e276defa6", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6334,46 +5948,56 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2025-09-24T06:09:11+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6392,13 +6016,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -6406,33 +6031,33 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -6455,7 +6080,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -6463,34 +6089,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6512,7 +6138,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/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -6520,32 +6146,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6567,7 +6193,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/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -6575,32 +6201,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6627,98 +6253,56 @@ } ], "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/4.0.4" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "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" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "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/3.0.3" - }, - "funding": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2025-08-10T07:50:56+00:00" }, { "name": "sebastian/type", - "version": "3.2.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6741,7 +6325,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -6749,29 +6333,29 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6784,147 +6368,54 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "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": "simplesamlphp/composer-module-installer", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/simplesamlphp/composer-module-installer.git", - "reference": "27b4fe96198ffaff3ab49c87b40f4cb24de77b01" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/27b4fe96198ffaff3ab49c87b40f4cb24de77b01", - "reference": "27b4fe96198ffaff3ab49c87b40f4cb24de77b01", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1 || ^2.0", - "php": "^7.4 || ^8.0", - "simplesamlphp/simplesamlphp": "*" - }, - "type": "composer-plugin", - "extra": { - "class": "SimpleSAML\\Composer\\ModuleInstallerPlugin" - }, - "autoload": { - "psr-4": { - "SimpleSAML\\Composer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", - "support": { - "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", - "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.2.0" - }, - "time": "2022-08-31T17:20:27+00:00" - }, - { - "name": "simplesamlphp/simplesamlphp-module-adfs", - "version": "v2.0.0-rc4", - "source": { - "type": "git", - "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git", - "reference": "9e37d1763b40ff130473bb93c7ec07a60eff08e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/9e37d1763b40ff130473bb93c7ec07a60eff08e4", - "reference": "9e37d1763b40ff130473bb93c7ec07a60eff08e4", - "shasum": "" - }, - "require": { - "php": ">=7.4 || ^8.0", - "simplesamlphp/assert": "^0.6.3", - "simplesamlphp/composer-module-installer": "^1.2.0", - "simplesamlphp/xml-security": "~0.6.2" - }, - "require-dev": { - "simplesamlphp/simplesamlphp": "^2.0.0-rc1", - "simplesamlphp/simplesamlphp-test-framework": "^1.2.1" - }, - "type": "simplesamlphp-module", - "autoload": { - "psr-4": { - "SimpleSAML\\Module\\adfs\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Tim van Dijen", - "email": "tvdijen@gmail.com" + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A module that implements the WS-federation IDP", - "keywords": [ - "adfs", - "simplesamlphp" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, - "time": "2022-09-13T12:17:06+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.2.1", + "version": "v1.9.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "70a601f41aebb00820b168c24f4b8177f414fc18" + "reference": "8dd14bb338573710165e6c237ec36378fa18eadb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/70a601f41aebb00820b168c24f4b8177f414fc18", - "reference": "70a601f41aebb00820b168c24f4b8177f414fc18", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/8dd14bb338573710165e6c237ec36378fa18eadb", + "reference": "8dd14bb338573710165e6c237ec36378fa18eadb", "shasum": "" }, "require": { - "php": ">=7.4|^8.0", - "phpunit/phpunit": "^8.5|^9.5", - "squizlabs/php_codesniffer": "^3.6", - "symfony/phpunit-bridge": "^6.0", - "vimeo/psalm": "^4.20|^5.0.0-beta1" + "ext-curl": "*", + "php": "^8.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1", + "phpunit/phpunit": "^10.0 || ^11.0", + "psr/log": "^2.0 || ^3.0", + "slevomat/coding-standard": "^8.15", + "symfony/phpunit-bridge": "^6.4 || ^7.0" }, "require-dev": { - "ext-curl": "*", - "simplesamlphp/simplesamlphp": "dev-master" + "simplesamlphp/simplesamlphp": "^2.4" }, - "bin": [ - "bin/check-syntax-json.sh", - "bin/check-syntax-php.sh", - "bin/check-syntax-xml.sh", - "bin/check-syntax-yaml.sh" - ], "type": "project", "autoload": { "psr-4": { @@ -6949,163 +6440,101 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2022-05-15T10:37:25+00:00" + "time": "2025-07-14T17:03:27+00:00" }, { - "name": "simplesamlphp/xml-common", - "version": "v0.11.2", + "name": "slevomat/coding-standard", + "version": "8.27.1", "source": { "type": "git", - "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "a16579a637cc32e522cefea8b66879dea69594bb" + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/a16579a637cc32e522cefea8b66879dea69594bb", - "reference": "a16579a637cc32e522cefea8b66879dea69594bb", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/29bdaee8b65e7ed2b8e702b01852edba8bae1769", + "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-spl": "*", - "php": ">=7.4 || ^8.0", - "simplesamlphp/assert": "^0.6.0" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.0", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.3.1", + "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { - "ext-xmlreader": "*", - "simplesamlphp/simplesamlphp-test-framework": "^1.2.1", - "vimeo/psalm": "^5.0.0-beta1" + "phing/phing": "3.0.1|3.1.1", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.37", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpstan/phpstan-phpunit": "2.0.12", + "phpstan/phpstan-strict-rules": "2.0.7", + "phpunit/phpunit": "9.6.31|10.5.60|11.4.4|11.5.49|12.5.7" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } }, - "type": "project", "autoload": { "psr-4": { - "SimpleSAML\\XML\\": "src/", - "SimpleSAML\\Test\\XML\\": [ - "tests/PHPUnit/" - ] + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Jaime Perez", - "email": "jaime.perez@uninett.no" - }, - { - "name": "Tim van Dijen", - "email": "tvdijen@gmail.com" - } + "MIT" ], - "description": "A library with classes and utilities for handling XML structures.", - "homepage": "http://simplesamlphp.org", + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", "keywords": [ - "saml", - "xml" + "dev", + "phpcs" ], "support": { - "issues": "https://github.com/simplesamlphp/xml-common/issues", - "source": "https://github.com/simplesamlphp/xml-common" - }, - "time": "2022-08-29T20:12:59+00:00" - }, - { - "name": "simplesamlphp/xml-security", - "version": "v0.6.4", - "source": { - "type": "git", - "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "e26901e35660a4d6c9a21fad8e0d961ec32ac9d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/e26901e35660a4d6c9a21fad8e0d961ec32ac9d7", - "reference": "e26901e35660a4d6c9a21fad8e0d961ec32ac9d7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-openssl": "*", - "ext-spl": "*", - "php": ">= 7.4 || ^8.0", - "simplesamlphp/assert": "^0.6.0", - "simplesamlphp/xml-common": "^0.11.0" + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.27.1" }, - "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.2.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "SimpleSAML\\XMLSecurity\\": "src", - "SimpleSAML\\XMLSecurity\\TestUtils\\": "tests/TestUtils" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ + "funding": [ { - "name": "Jaime Perez Crespo", - "email": "jaime.perez@uninett.no", - "role": "Maintainer" + "url": "https://github.com/kukulich", + "type": "github" }, { - "name": "Tim van Dijen", - "email": "tvdijen@gmail.com", - "role": "Maintainer" + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" } ], - "description": "SimpleSAMLphp library for XML Security", - "homepage": "https://github.com/simplesamlphp/xml-security", - "keywords": [ - "security", - "signature", - "xml", - "xmldsig" - ], - "support": { - "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v0.6.4" - }, - "time": "2022-09-04T15:05:57+00:00" + "time": "2026-01-25T15:57:07+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0525c73950de35ded110cffafb9892946d7771b5" }, "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/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", "shasum": "" }, "require": { "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=7.2.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -7113,48 +6542,70 @@ "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", + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", + "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" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-10T16:43:36+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v6.1.3", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "75c2fa71d049c1f48e39d208c0cefba97e66335a" + "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/75c2fa71d049c1f48e39d208c0cefba97e66335a", - "reference": "75c2fa71d049c1f48e39d208c0cefba97e66335a", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f933e68bb9df29d08077a37e1515a23fea8562ab", + "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab", "shasum": "" }, "require": { - "php": ">=7.1.3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "php": ">=8.1.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3.0", - "symfony/error-handler": "^5.4|^6.0" - }, - "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4.3|^7.0.3|^8.0" }, "bin": [ "bin/simple-phpunit" @@ -7162,8 +6613,8 @@ "type": "symfony-bridge", "extra": { "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" } }, "autoload": { @@ -7174,7 +6625,8 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -7193,8 +6645,11 @@ ], "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", + "keywords": [ + "testing" + ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.4.3" }, "funding": [ { @@ -7205,239 +6660,183 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-07-28T13:40:41+00:00" + "time": "2025-12-09T15:33:45+00:00" }, { - "name": "theseer/tokenizer", - "version": "1.2.1", + "name": "symfony/translation", + "version": "v6.4.32", "source": { "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "url": "https://github.com/symfony/translation.git", + "reference": "d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/symfony/translation/zipball/d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc", + "reference": "d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "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": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "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": { - "classmap": [ - "src/" + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/symfony/translation/tree/v6.4.32" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2026-01-12T19:15:33+00:00" }, { - "name": "vimeo/psalm", - "version": "4.27.0", + "name": "theseer/tokenizer", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/faf106e717c37b8c81721845dba9de3d8deed8ff", - "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], - "psr-4": { - "Psalm\\": "src/Psalm/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Matthew Brown" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.27.0" - }, - "time": "2022-08-31T13:47:09+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "simplesamlphp/simplesamlphp-module-adfs": 5 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.4 || ^8.0", + "php": "^8.1", "ext-date": "*", "ext-dom": "*", "ext-hash": "*", - "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", "ext-pcre": "*", + "ext-session": "*", + "ext-simplexml": "*", "ext-spl": "*", "ext-zlib": "*" }, @@ -7445,5 +6844,5 @@ "ext-curl": "*", "ext-pdo_sqlite": "*" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.9.0" } diff --git a/config-templates/acl.php b/config/acl.php.dist similarity index 100% rename from config-templates/acl.php rename to config/acl.php.dist diff --git a/config-templates/authsources.php b/config/authsources.php.dist similarity index 62% rename from config-templates/authsources.php rename to config/authsources.php.dist index f0f77cab88..cdde34d65b 100644 --- a/config-templates/authsources.php +++ b/config/authsources.php.dist @@ -27,8 +27,7 @@ 'saml:SP', // The entity ID of this SP. - // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL. - 'entityID' => null, + 'entityID' => 'https://myapp.example.org/', // The entity ID of the IdP this SP should contact. // Can be NULL/unset, in which case the user will be shown a list of available IdPs. @@ -38,6 +37,14 @@ // Can be NULL/unset, in which case a builtin discovery service will be used. 'discoURL' => null, + /* + * If SP behind the SimpleSAMLphp in IdP/SP proxy mode requests + * AuthnContextClassRef, decide whether the AuthnContextClassRef will be + * processed by the IdP/SP proxy or if it will be passed to the original + * IdP in front of the IdP/SP proxy. + */ + 'proxymode.passAuthnContextClassRef' => false, + /* * The attributes parameter must contain an array of desired attributes by the SP. * The attributes can be expressed as an array of names or as an associative array @@ -90,13 +97,15 @@ //'remember.username.enabled' => false, //'remember.username.checked' => false, - 'student:studentpass' => [ - 'uid' => ['test'], - 'eduPersonAffiliation' => ['member', 'student'], - ], - 'employee:employeepass' => [ - 'uid' => ['employee'], - 'eduPersonAffiliation' => ['member', 'employee'], + 'users' => [ + 'student:studentpass' => [ + 'uid' => ['test'], + 'eduPersonAffiliation' => ['member', 'student'], + ], + 'employee:employeepass' => [ + 'uid' => ['employee'], + 'eduPersonAffiliation' => ['member', 'employee'], + ], ], ], */ @@ -187,107 +196,117 @@ /* // Example of a LDAP authentication source. 'example-ldap' => [ - 'ldap:LDAP', - - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => false, - //'remember.username.checked' => false, + 'ldap:Ldap', - // The hostname of the LDAP server. - 'hostname' => 'ldap.example.org', + // The connection string for the LDAP-server. + // You can add multiple by separating them with a space. + 'connection_string' => 'ldap.example.org', // Whether SSL/TLS should be used when contacting the LDAP server. - 'enable_tls' => true, + // Possible values are 'ssl', 'tls' or 'none' + 'encryption' => 'ssl', + + // The LDAP version to use when interfacing the LDAP-server. + // Defaults to 3 + 'version' => 3, + + // Set to TRUE to enable LDAP debug level. Passed to the LDAP connector class. + // + // Default: FALSE + // Required: No + 'ldap.debug' => false, - // Whether debug output from the LDAP library should be enabled. - // Default is FALSE. - 'debug' => false, + // The LDAP-options to pass when setting up a connection + // See [Symfony documentation][1] + 'options' => [ - // The timeout for accessing the LDAP server, in seconds. - // The default is 0, which means no timeout. - 'timeout' => 0, + // Set whether to follow referrals. + // AD Controllers may require 0x00 to function. + // Possible values are 0x00 (NEVER), 0x01 (SEARCHING), + // 0x02 (FINDING) or 0x03 (ALWAYS). + 'referrals' => 0x00, - // The port used when accessing the LDAP server. - // The default is 389. - 'port' => 389, + 'network_timeout' => 3, + ], - // Set whether to follow referrals. AD Controllers may require FALSE to function. - 'referrals' => true, + // The connector to use. + // Defaults to '\SimpleSAML\Module\ldap\Connector\Ldap', but can be set + // to '\SimpleSAML\Module\ldap\Connector\ActiveDirectory' when + // authenticating against Microsoft Active Directory. This will + // provide you with more specific error messages. + 'connector' => '\SimpleSAML\Module\ldap\Connector\Ldap', // Which attributes should be retrieved from the LDAP server. // This can be an array of attribute names, or NULL, in which case // all attributes are fetched. 'attributes' => null, - // The pattern which should be used to create the users DN given the username. - // %username% in this pattern will be replaced with the users username. + // Which attributes should be base64 encoded after retrieval from + // the LDAP server. + 'attributes.binary' => [ + 'jpegPhoto', + 'objectGUID', + 'objectSid', + 'mS-DS-ConsistencyGuid' + ], + + // The pattern which should be used to create the user's DN given + // the username. %username% in this pattern will be replaced with + // the user's username. // // This option is not used if the search.enable option is set to TRUE. 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', - // As an alternative to specifying a pattern for the users DN, it is possible to - // search for the username in a set of attributes. This is enabled by this option. + // As an alternative to specifying a pattern for the users DN, it is + // possible to search for the username in a set of attributes. This is + // enabled by this option. 'search.enable' => false, - // The DN which will be used as a base for the search. - // This can be a single string, in which case only that DN is searched, or an - // array of strings, in which case they will be searched in the order given. - 'search.base' => 'ou=people,dc=example,dc=org', + // An array on DNs which will be used as a base for the search. In + // case of multiple strings, they will be searched in the order given. + 'search.base' => [ + 'ou=people,dc=example,dc=org', + ], + + // The scope of the search. Valid values are 'sub' and 'one' and + // 'base', first one being the default if no value is set. + 'search.scope' => 'sub', // The attribute(s) the username should match against. // - // This is an array with one or more attribute names. Any of the attributes in - // the array may match the value the username. + // This is an array with one or more attribute names. Any of the + // attributes in the array may match the value the username. 'search.attributes' => ['uid', 'mail'], - // Additional LDAP filters appended to the search attributes - //'search.filter' => '(objectclass=inetorgperson)', + // Additional filters that must match for the entire LDAP search to + // be true. + // + // This should be a single string conforming to [RFC 1960][2] + // and [RFC 2544][3]. The string is appended to the search attributes + 'search.filter' => '(&(objectClass=Person)(|(sn=Doe)(cn=John *)))', - // The username & password the SimpleSAMLphp should bind to before searching. If - // this is left as NULL, no bind will be performed before searching. + // The username & password where SimpleSAMLphp should bind to before + // searching. If this is left NULL, no bind will be performed before + // searching. 'search.username' => null, 'search.password' => null, - - // If the directory uses privilege separation, - // the authenticated user may not be able to retrieve - // all required attributes, a privileged entity is required - // to get them. This is enabled with this option. - 'priv.read' => false, - - // The DN & password the SimpleSAMLphp should bind to before - // retrieving attributes. These options are required if - // 'priv.read' is set to TRUE. - 'priv.username' => null, - 'priv.password' => null, - ], */ /* // Example of an LDAPMulti authentication source. 'example-ldapmulti' => [ - 'ldap:LDAPMulti', - - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => false, - //'remember.username.checked' => false, - - // Give the user an option to save their organization choice for future login - // attempts. And when enabled, what should the default be, checked or not. - //'remember.organization.enabled' => false, - //'remember.organization.checked' => false, - - // The way the organization as part of the username should be handled. - // Three possible values: - // - 'none': No handling of the organization. Allows '@' to be part - // of the username. - // - 'allow': Will allow users to type 'username@organization'. - // - 'force': Force users to type 'username@organization'. The dropdown - // list will be hidden. - // - // The default is 'none'. + 'ldap:LdapMulti', + + // The way the organization as part of the username should be handled. + // Three possible values: + // - 'none': No handling of the organization. Allows '@' to be part + // of the username. + // - 'allow': Will allow users to type 'username@organization'. + // - 'force': Force users to type 'username@organization'. The dropdown + // list will be hidden. + // + // The default is 'none'. 'username_organization_method' => 'none', // Whether the organization should be included as part of the username @@ -306,24 +325,21 @@ // // The value of each element is an array in the same format as an LDAP // authentication source. - 'employees' => [ - // A short name/description for this group. Will be shown in a dropdown list - // when the user logs on. - // - // This option can be a string or an array with language => text mappings. - 'description' => 'Employees', - - // The rest of the options are the same as those available for - // the LDAP authentication source. - 'hostname' => 'ldap.employees.example.org', - 'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org', - ], - - 'students' => [ - 'description' => 'Students', - - 'hostname' => 'ldap.students.example.org', - 'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org', + 'mapping' => [ + 'employees' => [ + // A short name/description for this group. Will be shown in a + // dropdown list when the user logs on. + // + // This option can be a string or an array with + // language => text mappings. + 'description' => 'Employees', + 'authsource' => 'example-ldap', + ], + + 'students' => [ + 'description' => 'Students', + 'authsource' => 'example-ldap-2', + ], ], ], */ diff --git a/config-templates/config.php b/config/config.php.dist similarity index 88% rename from config-templates/config.php rename to config/config.php.dist index b4938fc393..362cb17019 100644 --- a/config-templates/config.php +++ b/config/config.php.dist @@ -24,6 +24,8 @@ * * The full url format is useful if your SimpleSAMLphp setup is hosted behind * a reverse proxy. In that case you can specify the external url here. + * Specifying the full URL including https: will let SimpleSAMLphp know + * that it runs on HTTPS even if the backend server is plain HTTP. * * Please note that SimpleSAMLphp will then redirect all queries to the * external url, no matter where you come from (direct access or via the @@ -35,7 +37,7 @@ * The 'application' configuration array groups a set configuration options * relative to an application protected by SimpleSAMLphp. */ - //'application' => [ + 'application' => [ /* * The 'baseURL' configuration option allows you to specify a protocol, * host and optionally a port that serves as the canonical base for all @@ -51,22 +53,24 @@ * to SimpleSAMLphp's API. */ //'baseURL' => 'https://example.com', - //], + ], /* * The following settings are *filesystem paths* which define where * SimpleSAMLphp can find or write the following things: + * - 'cachedir': Where SimpleSAMLphp can write its cache. * - 'loggingdir': Where to write logs. MUST be set to NULL when using a logging * handler other than `file`. * - 'datadir': Storage of general data. * - 'tempdir': Saving temporary files. SimpleSAMLphp will attempt to create - * this directory if it doesn't exist. + * this directory if it doesn't exist. DEPRECATED - replaced by cachedir. * When specified as a relative path, this is relative to the SimpleSAMLphp * root directory. */ - 'loggingdir' => 'log/', - 'datadir' => 'data/', - 'tempdir' => '/tmp/simplesaml', + 'cachedir' => '/var/cache/simplesamlphp', + //'loggingdir' => '/var/log/', + //'datadir' => '/var/data/', + //'tempdir' => '/tmp/simplesamlphp', /* * Certificate and key material can be loaded from different possible @@ -84,7 +88,7 @@ * 'certdir' parameter below. When 'certdir' is specified as a relative * path, it will be interpreted as relative to the SimpleSAMLphp root * directory. Note that locations with no prefix included will be treated - * as file locations for backwards compatibility. + * as file locations. */ 'certdir' => 'cert/', @@ -112,7 +116,6 @@ * Defaults are shown below, to change them, uncomment the line and update as * needed */ - //'cert.pdo.table' => 'certificates', //'cert.pdo.keytable' => 'private_keys', //'cert.pdo.apply_prefix' => true, @@ -139,19 +142,22 @@ * Set the transport options for the transport method specified. The valid settings are relative to the * selected transport method. */ - // // smtp mail transport options - // 'mail.transport.options' => [ - // 'host' => 'mail.example.org', // required - // 'port' => 25, // optional - // 'username' => 'user@example.org', // optional: if set, enables smtp authentication - // 'password' => 'password', // optional: if set, enables smtp authentication - // 'security' => 'tls', // optional: defaults to no smtp security - // 'smtpOptions' => [], // optional: passed to stream_context_create when connecting via SMTP - // ], - // // sendmail mail transport options - // 'mail.transport.options' => [ - // 'path' => '/usr/sbin/sendmail' // optional: defaults to php.ini path - // ], + /* + 'mail.transport.options' => [ + 'host' => 'mail.example.org', // required + 'port' => 25, // optional + 'username' => 'user@example.org', // optional: if set, enables smtp authentication + 'password' => 'password', // optional: if set, enables smtp authentication + 'security' => 'tls', // optional: defaults to no smtp security + 'smtpOptions' => [], // optional: passed to stream_context_create when connecting via SMTP + ], + + // sendmail mail transport options + /* + 'mail.transport.options' => [ + 'path' => '/usr/sbin/sendmail' // optional: defaults to php.ini path + ], + */ /* * The envelope from address for outgoing emails. @@ -190,6 +196,10 @@ * This password will give access to the installation page of SimpleSAMLphp with * metadata listing and diagnostics pages. * You can also put a hash here; run "bin/pwgen.php" to generate one. + * + * If you are using Ansible you might like to use + * ansible.builtin.password_hash(hashtype='blowfish', ident='2y', rounds=13) + * to generate this hashed value. */ 'auth.adminpassword' => '123', @@ -255,7 +265,7 @@ /* * Set the allowed clock skew between encrypting/decrypting assertions * - * If you have an server that is constantly out of sync, this option + * If you have a server that is constantly out of sync, this option * allows you to adjust the allowed clock-skew. * * Allowed range: 180 - 300 @@ -263,6 +273,21 @@ */ 'assertion.allowed_clock_skew' => 180, + /* + * Set custom security headers. The defaults can be found in \SimpleSAML\Configuration::DEFAULT_SECURITY_HEADERS + * + * NOTE: When a header is already set on the response we will NOT overrule it and leave it untouched. + * + * Whenever you change any of these headers, make sure to validate your config by running your + * hostname through a security-test like https://en.internet.nl + 'headers.security' => [ + 'Content-Security-Policy' => "default-src 'none'; frame-ancestors 'self'; object-src 'none'; script-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; img-src 'self' data:; base-uri 'none'", + 'X-Frame-Options' => 'SAMEORIGIN', + 'X-Content-Type-Options' => 'nosniff', + 'Referrer-Policy' => 'origin-when-cross-origin', + ], + */ + /************************ | ERRORS AND DEBUGGING | @@ -317,7 +342,7 @@ /* * Custom error show function called from SimpleSAML\Error\Error::show. - * See docs/simplesamlphp-errorhandling.txt for function code example. + * See docs/simplesamlphp-errorhandling.md for function code example. * * Example: * 'errors.show_function' => ['SimpleSAML\Module\example\Error', 'show'], @@ -340,6 +365,9 @@ * * Options: [syslog,file,errorlog,stderr] * + * If you set the handler to 'file', the directory specified in loggingdir above + * must exist and be writable for SimpleSAMLphp. If set to something else, set + * loggingdir above to 'null'. */ 'logging.level' => SimpleSAML\Logger::NOTICE, 'logging.handler' => 'syslog', @@ -359,7 +387,7 @@ * * - %level: the log level (name or number depending on the handler used). * -- * - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind + * - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind * the trailing space). * * - %trackid: the track ID, an identifier that allows you to track a single session. @@ -400,7 +428,8 @@ * This is an array of outputs. Each output has at least a 'class' option, which * selects the output. */ - 'statistics.out' => [// Log statistics to the normal log. + 'statistics.out' => [ + // Log statistics to the normal log. /* [ 'class' => 'core:Log', @@ -426,7 +455,7 @@ * Proxy to use for retrieving URLs. * * Example: - * 'proxy' => 'tcp://proxy.example.com:5100' + * 'proxy' => 'http://proxy.example.com:5100' */ 'proxy' => null, @@ -535,7 +564,7 @@ 'exampleauth' => false, 'core' => true, 'admin' => true, - 'saml' => true + 'saml' => true, ], @@ -602,8 +631,10 @@ * Set this to TRUE if the user only accesses your service * through https. If the user can access the service through * both http and https, this must be set to FALSE. + * + * If unset, SimpleSAMLphp will try to automatically determine the right value */ - 'session.cookie.secure' => true, + //'session.cookie.secure' => true, /* * Set the SameSite attribute in the cookie. @@ -655,7 +686,7 @@ /* * Custom function for session checking called on session init and loading. - * See docs/simplesamlphp-advancedfeatures.txt for function code example. + * See docs/simplesamlphp-advancedfeatures.md for function code example. * * Example: * 'session.check_function' => ['\SimpleSAML\Module\example\Util', 'checkSession'], @@ -794,7 +825,7 @@ */ 'language.available' => [ 'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'ca', 'fr', 'it', 'nl', 'lb', - 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', + 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt_BR', 'tr', 'ja', 'zh', 'zh_TW', 'ru', 'et', 'he', 'id', 'sr', 'lv', 'ro', 'eu', 'el', 'af', 'zu', 'xh', 'st', ], 'language.rtl' => ['ar', 'dv', 'fa', 'ur', 'he'], @@ -842,7 +873,7 @@ * Set this option to the text you would like to appear at the header of each page. Set to false if you don't want * any text to appear in the header. */ - //'theme.header' => 'SimpleSAMLphp' + //'theme.header' => 'SimpleSAMLphp', /** * A template controller, if any. @@ -870,6 +901,14 @@ */ 'template.auto_reload' => false, + + /* + * Set the 'template.debug' to true to enable debugging for Twig templates. + * This is useful during development as it provides better error messages. + * Defaults to false. + */ + //'template.debug' => false, + /* * Set this option to true to indicate that your installation of SimpleSAMLphp * is running in a production environment. This will affect the way resources @@ -887,6 +926,19 @@ * The serving of the resources can be configured through these settings. */ 'assets' => [ + /* + * Used to generate cache buster tags. This salt is only used for this purpose. + * You should set this in the same way as secretsalt. + * + * You can change this salt at any time. This will have the effect of explicit + * cache busting as the tags for resources will change and thus all resources + * will be fetched again. + * + * Leaving the default value in place can allow an attacker the opportunity + * to work out the version of SSP you have installed. + */ + 'salt' => 'assets.salt.default', + /* * These settings adjust the caching headers that are sent * when serving static resources. @@ -955,7 +1007,7 @@ */ 'authproc.idp' => [ /* Enable the authproc filter below to add URN prefixes to all attributes - 10 => array[ + 10 => [ 'class' => 'core:AttributeMap', 'addurnprefix' ], */ @@ -966,12 +1018,6 @@ // Adopts language from attribute to use in UI 30 => 'core:LanguageAdaptor', - 45 => [ - 'class' => 'core:StatisticsWithAttribute', - 'attributename' => 'realm', - 'type' => 'saml20-idp-SSO', - ], - /* When called without parameters, it will fallback to filter attributes 'the old way' * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. */ @@ -1106,6 +1152,21 @@ * ['type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'], * ], * + * This example defines a remote xml-file with optional connection context. + * See PHP documentation for possible context options: https://www.php.net/manual/en/context.php + * + * 'metadata.sources' => [ + * [ + * 'type' => 'xml', + * 'url' => 'https://example.org/idp.example.org-idpMeta.xml', + * 'context' => [ + * 'ssl' => [ + * 'verify_peer' => true, + * ], + * ], + * ], + * ], + * * This example defines an mdq source. * 'metadata.sources' => [ * [ @@ -1155,6 +1216,7 @@ 'metadata.sign.privatekey' => null, 'metadata.sign.privatekey_pass' => null, 'metadata.sign.certificate' => null, + 'metadata.sign.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', /**************************** @@ -1217,6 +1279,28 @@ 'store.redis.username' => '', 'store.redis.password' => '', + /* + * Communicate with Redis over a secure connection instead of plain TCP. + * + * This setting affects both single host connections as + * well as Sentinel mode. + */ + 'store.redis.tls' => false, + + /* + * Verify the Redis server certificate. + */ + 'store.redis.insecure' => false, + + /* + * Files related to secure communication with Redis. + * + * Files are searched in the 'certdir' when using relative paths. + */ + 'store.redis.ca_certificate' => null, + 'store.redis.certificate' => null, + 'store.redis.privatekey' => null, + /* * The prefix we should use on our Redis datastore. */ @@ -1230,12 +1314,26 @@ /* * The Redis Sentinel hosts. * Example: - * array( - * 'tcp://[yoursentinel1]:[port]' + * 'store.redis.sentinels' => [ + * 'tcp://[yoursentinel1]:[port]', * 'tcp://[yoursentinel2]:[port]', * 'tcp://[yoursentinel3]:[port] - * ) + * ], + * + * Use 'tls' instead of 'tcp' in order to make use of the additional + * TLS settings. */ 'store.redis.sentinels' => [], + /********************* + | IdP/SP PROXY MODE | + *********************/ + + /* + * If the IdP in front of SimpleSAMLphp in IdP/SP proxy mode sends + * AuthnContextClassRef, decide whether the AuthnContextClassRef will be + * processed by the IdP/SP proxy or if it will be passed to the SP behind + * the IdP/SP proxy. + */ + 'proxymode.passAuthnContextClassRef' => false, ]; diff --git a/docs/index.md b/docs/index.md index 0d0a4ca17d..b1ce371d7a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,6 +9,7 @@ * [Service Provider Quickstart](simplesamlphp-sp) * [Hosted SP Configuration Reference](./saml:sp) * [IdP remote reference](simplesamlphp-reference-idp-remote) + * [SP API reference (for your application)](simplesamlphp-sp-api). * [Configuring HTTP-Artifact](./simplesamlphp-artifact-sp) * [Using scoping](./simplesamlphp-scoping) * [Holder-of-Key profile](simplesamlphp-hok-sp) @@ -27,6 +28,7 @@ * [Authentication Processing Filters](simplesamlphp-authproc) - attribute filtering, attribute mapping, consent, group generation etc. * [State Information Lost](simplesamlphp-nostate) - more about this common error message * [Advanced features](simplesamlphp-advancedfeatures) - covers bridging protocols, attribute filtering, etc. + * [Developer documentation](simplesamlphp-developer-information) - code overview and other docs for new and returning developers * SimpleSAMLphp Modules * [Documentation for specific modules](/docs/contributed_modules.html) * [Theming SimpleSAMLphp](simplesamlphp-theming) diff --git a/docs/simplesamlphp-advancedfeatures.md b/docs/simplesamlphp-advancedfeatures.md index 76ac9e9c78..47430e9878 100644 --- a/docs/simplesamlphp-advancedfeatures.md +++ b/docs/simplesamlphp-advancedfeatures.md @@ -55,15 +55,11 @@ simpleSAMLphp can be configured to send HTTP/S requests via such a proxy. The pr The default is not to use a proxy ('proxy' = null) and no username and password are used ('proxy.auth' = false). -## Auth MemCookie - -[Auth MemCookie](http://authmemcookie.sourceforge.net/) support is deprecated in the standard code base of SimpleSAMLphp - and will no longer be available starting in SimpleSAMLphp 2.0. Please use the new - [memcookie module](https://github.com/simplesamlphp/simplesamlphp-module-memcookie) instead. - ## Metadata signing -SimpleSAMLphp supports signing of the metadata it generates. Metadata signing is configured by four options: +SimpleSAMLphp supports signing of the metadata it generates. + +Metadata signing is configured by four options: - `metadata.sign.enable`: Whether metadata signing should be enabled or not. Set to `TRUE` to enable metadata signing. Defaults to `FALSE`. - `metadata.sign.privatekey`: Location of the private key data which should be used to sign the metadata. @@ -77,26 +73,88 @@ SimpleSAMLphp supports signing of the metadata it generates. Metadata signing is - `http://www.w3.org/2001/04/xmldsig-more#rsa-sha384` - `http://www.w3.org/2001/04/xmldsig-more#rsa-sha512` -These options can be configured globally in the `config/config.php`-file, or per SP/IdP by adding them to the hosted metadata for the SP/IdP. The configuration in the metadata for the SP/IdP takes precedence over the global configuration. - -There is also an additional fallback for the private key and the certificate. If `metadata.sign.privatekey` and `metadata.sign.certificate` isn't configured, SimpleSAMLphp will use the `privatekey`, `privatekey_pass` and `certificate` options in the metadata for the SP/IdP. +These options can be configured globally in the +`config/config.php`-file, or per SP/IdP by adding them to the hosted +metadata for the SP/IdP. The configuration in the metadata for the +SP/IdP takes precedence over the global configuration. Note that if +wish to set the metadata.sign.privatekey and metadata.sign.certificate +in a metadata file you need to also set metadata.sign.enable=true in +that metadata file. ## Session checking function Optional session checking function, called on session init and loading, defined with 'session.check_function' in config.php. -Example code for the function with GeoIP country check: +A simple example that will logout a specific user and also prevent +them from logging in. The code should be placed in in a file +`src/SimpleSAML/CustomCode.php` in the main repository. + +```php + 'session.check_function' => ['\SimpleSAML\CustomCode', 'checkSession'], +``` + +In the `src/SimpleSAML/CustomCode.php` file we check for a specific +`uid` who we know is a bad boy in a known auth source and stop them +from doing anything. ```php -public static function checkSession($session, $init = false) +declare(strict_types=1); + +namespace SimpleSAML; + +class CustomCode +{ + /** + * The session.check_function can be used to throw away a session object + * during normal processing. If we throw it away by returning `false` then + * the user will be forced to create a new session. + * + * There are two call modes: during session init which can not fail and + * during testing. When testing returning false will cause the session to + * be discarded. + * + * @param \SimpleSAML\Session $session The session to approve/reject + * @param bool $init true if called during session init. + */ + public static function checkSession(\SimpleSAML\Session $session, bool $init = false) + { + $authority = "default-sp"; + + if( $init ) { + // init can not fail + // return value is ignored + return true; + } + + $ad = $session->getAuthData($authority,"Attributes"); + if( !$ad ) { + return true; + } + $uid = $ad["uid"]; + + if( in_array("badboy@localhost.localdomain",$uid)) { + // drop the session + return false; + } + + // normal functionality + return true; + } +}; + +``` + +A more complex example which performs a GeoIP country check on the +session to make sure the user is in the same country as they were when +they authenticated. + +```php +public static function checkSession(\SimpleSAML\Session $session, bool $init = false) { $data_type = 'example:check_session'; $data_key = 'remote_addr'; - $remote_addr = null; - if (!empty($_SERVER['REMOTE_ADDR'])) { - $remote_addr = (string)$_SERVER['REMOTE_ADDR']; - } + $remote_addr = strval($_SERVER['REMOTE_ADDR']); if ($init) { $session->setData( diff --git a/docs/simplesamlphp-authproc.md b/docs/simplesamlphp-authproc.md index 53d6c3d649..78f2f28fa8 100644 --- a/docs/simplesamlphp-authproc.md +++ b/docs/simplesamlphp-authproc.md @@ -4,7 +4,7 @@ In SimpleSAMLphp, there is an API where you can *do stuff* at the IdP after authentication is complete, and just before you are sent back to the SP. The same API is available on the SP, after you have received a successful Authentication Response from the IdP and before you are sent back to the SP application. -Authentication processing filters postprocess authentication information received from authentication sources. It is possible to use this for additional authentication checks, requesting the user's consent before delivering attributes about the user, modifying the user's attributes, and other things which should be performed before returning the user to the service provider he came from. +Authentication processing filters postprocess authentication information received from authentication sources. It is possible to use this for additional authentication checks, requesting the user's consent before delivering attributes about the user, modifying the user's attributes, and other things which should be performed before returning the user to the service provider they came from. Examples of neat things to do using Authentication Processing Filters: @@ -12,15 +12,7 @@ Examples of neat things to do using Authentication Processing Filters: * Modify the name of attributes. * Generate new attributes that are composed of others, for example eduPersonTargetedID. * Ask the user for consent, before the user is sent back to a service. -* Implement basic Access Control on the IdP (not necessarily a good idea), limiting access for some users to some SPs. - -Be aware that Authentication Processing Filters do replace some of the previous features in SimpleSAMLphp, named: - -* `attributemap` -* `attributealter` -* `attribute filter` - -Later in this document, we will describe in detail the alternative Authentication Processing Filters that will replicate these functionalities. +* Implement basic Access Control on the IdP, limiting access for some users to some SPs. ## How to configure Auth Proc Filters @@ -32,20 +24,22 @@ Later in this document, we will describe in detail the alternative Authenticatio * On the IdP: Specific for only one hosted IdP in `saml20-idp-hosted` * On the IdP: Specific for only one remote SP in `saml20-sp-remote` +*Note*: An Auth Proc Filter will not work in the "Test authentication sources" option in the web UI of a SimpleSAMLphp IdP. It will only be triggered in conjunction with an actual SP. So you need to set up an IdP *and* and SP when testing your filter. + The configuration of *Auth Proc Filters* is a list of filters with priority as *index*. Here is an example of *Auth Proc Filters* configured in `config.php`: ```php 'authproc.idp' => [ 10 => [ - 'class' => 'core:AttributeMap', + 'class' => 'core:AttributeMap', 'addurnprefix' ], 20 => 'core:TargetedID', 50 => 'core:AttributeLimit', 90 => [ - 'class' => 'consent:Consent', - 'store' => 'consent:Cookie', - 'focus' => 'yes', + 'class' => 'consent:Consent', + 'store' => 'consent:Cookie', + 'focus' => 'yes', 'checked' => true ], ], @@ -53,11 +47,13 @@ The configuration of *Auth Proc Filters* is a list of filters with priority as * This configuration will execute *Auth Proc Filters* one by one, with the priority value in increasing order. When *Auth Proc Filters* is configured in multiple places, in example both globally, in the hosted IdP and remote SP metadata, then the list is interleaved sorted by priority. -The most important parameter of each item on the list is the *class* of the *Auth Proc Filter*. The syntax of the class is `modulename:classname`. As an example the class definition `core:AttributeLimit` will be expanded to look for the class `\SimpleSAML\Module\core\Auth\Process\AttributeLimit`. The location of this class file *must* then be: `modules/core/lib/Auth/Process/AttributeLimit.php`. - -You will see that a bunch of useful filters is included in the `core` module. In addition the `consent` module that is included in the SimpleSAMLphp distribution implements a filter. Beyond that, you are encouraged to create your own filters and share with the community. If you have created a cool *Auth Proc Filter* that does something useful, let us know, and we may share it on the [SimpleSAMLphp web site][]. +The most important parameter of each item on the list is the *class* of the *Auth Proc Filter*. The syntax of the class is `modulename:classname`. As an example the class definition `core:AttributeLimit` will be expanded to look for the class `\SimpleSAML\Module\core\Auth\Process\AttributeLimit`. The location of this class file *must* then be: `modules/core/src/Auth/Process/AttributeLimit.php`. -[SimpleSAMLphp web site]: http://simplesamlphp.org +You will see that a bunch of useful filters is included in the `core` and `saml` modules, but there are +many others published as [SimpleSAMLphp modules)[https://simplesamlphp.org/modules/] you can install. Beyond that, you are +encouraged to create your own filters and share with the community. If you have +created a cool *Auth Proc Filter* that does something useful, let us know, and +we may add it on the Modules overview. When you know the class definition of a filter, and the priority, the simple way to configure the filter is: @@ -73,13 +69,13 @@ This is analogous to: ], ``` -Some *Auth Proc Filters* have optional or required *parameters*. To send parameters to *Auth Proc Filters*, you need to choose the second of the two alernatives above. Here is an example of provided parameters to the consent module: +Some *Auth Proc Filters* have optional or required *parameters*. To send parameters to *Auth Proc Filters*, you need to choose the second of the two alternatives above. Here is an example of provided parameters to the consent module: ```php 90 => [ - 'class' => 'consent:Consent', - 'store' => 'consent:Cookie', - 'focus' => 'yes', + 'class' => 'consent:Consent', + 'store' => 'consent:Cookie', + 'focus' => 'yes', 'checked' => true, ], ``` @@ -102,7 +98,7 @@ The filters in `authproc.sp` will be executed at the SP side regardless of which Filters can be added both in `hosted` and `remote` metadata. Here is an example of a filter added in a metadata file: ```php -'https://example.org/saml-idp' => [ +$metadata['https://example.org/saml-idp'] = [ 'host' => '__DEFAULT_', 'privatekey' => 'example.org.pem', 'certificate' => 'example.org.crt', @@ -115,6 +111,20 @@ Filters can be added both in `hosted` and `remote` metadata. Here is an example The example above is in `saml20-idp-hosted`. +## Preconditional filters + +Any filter can be configured with a precondition that will determine whether or not a filter should run. +The condition is represented as a string that will be evaluated, similar to the `core:PHP` filter. It also has +the `$attributes` and `$state` variable available for use. +The code must return either `true` to run the filter, or `false` to skip it. + +```php +'authproc' => [ + 40 => 'core:TargetedID', + '%precondition' => 'return $attributes["displayName"] === "John Doe";', +], +``` + ## Auth Proc Filters included in the SimpleSAMLphp distribution The following filters are included in the SimpleSAMLphp distribution: @@ -143,6 +153,8 @@ The following filters are included in the SimpleSAMLphp distribution: * [`saml:PersistentNameID`](./saml:nameid): Generate persistent NameID from an attribute. * [`saml:PersistentNameID2TargetedID`](./saml:nameid): Store persistent NameID as eduPersonTargetedID. * [`saml:TransientNameID`](./saml:nameid): Generate transient NameID. +* [`saml:SubjectID`](./saml:authproc_subjectid): Generate SubjectID. +* [`saml:PairwiseID`](./saml:authproc_pairwiseid): Generate PairwiseID. See the [Third-party modules](https://simplesamlphp.org/modules) page on the SimpleSAMLphp website for externally hosted modules that may provide a processing filter. @@ -158,13 +170,11 @@ If a filter for some reason needs to redirect the user, for example to show a we Requirements for authentication processing filters: * Must be derived from the `\SimpleSAML\Auth\ProcessingFilter`-class. -* If a constructor is implemented, it must first call the parent constructor, passing along all parameters, before accessing any of the parameters. In general, only the $config parameter should be accessed. -* The `process(&$request)`-function must be implemented. If this function completes, it is assumed that processing is completed, and that the $request array has been updated. +* If a constructor is implemented, it must first call the parent constructor, passing along all parameters, before accessing any of the parameters. Only the $config parameter can be accessed. +* The `process(array &$state)`-function must be implemented. If this function completes, it is assumed that processing is completed, and that the $state array has been updated. * If the `process`-function does not return, it must at a later time call `\SimpleSAML\Auth\ProcessingChain::resumeProcessing` with the new request state. The request state must be an update of the array passed to the `process`-function. * No pages may be shown to the user from the `process`-function. Instead, the request state should be saved, and the user should be redirected to a new page. This must be done to prevent unpredictable events if the user for example reloads the page. * No state information should be stored in the filter object. It must instead be stored in the request state array. Any changes to variables in the filter object may be lost. * The filter object must be serializable. It may be serialized between being constructed and the call to the `process`-function. This means that, for example, no database connections should be created in the constructor and later used in the `process`-function. -*Note*: An Auth Proc Filter will not work in the "Test authentication sources" option in the web UI of a SimpleSAMLphp IdP. It will only be triggered in conjunction with an actual SP. So you need to set up an IdP *and* and SP when testing your filter. - Don't hestitate to ask on the SimpleSAMLphp mailinglist if you have problems or questions, or want to share your *Auth Proc Filter* with others. diff --git a/docs/simplesamlphp-authsource.md b/docs/simplesamlphp-authsource.md index e2d09a1862..7b65579a70 100644 --- a/docs/simplesamlphp-authsource.md +++ b/docs/simplesamlphp-authsource.md @@ -1,6 +1,6 @@ # Creating authentication sources -All authentication sources are located in the `lib/Auth/Source/` directory in a module, and the class name is `\SimpleSAML\Module\\Auth\Source\`. +All authentication sources are located in the `src/Auth/Source/` directory in a module, and the class name is `\SimpleSAML\Module\\Auth\Source\`. The authentication source must extend the `\SimpleSAML\Auth\Source` class or one of its subclasses. The "entry point" of an authentication source is the `authenticate()`-function. @@ -37,7 +37,7 @@ The only function you need to implement is the `login($username, $password)`-fun This function receives the username and password the user entered, and is expected to return the attributes of that user. If the username or password is incorrect, it should throw an error saying so: - throw new \SimpleSAML\Error\Error('WRONGUSERPASS'); + throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); "[Implementing custom username/password authentication](./simplesamlphp-customauth)" describes how to implement username/password authentication using that base class. @@ -56,7 +56,7 @@ If the username or password is incorrect, it should throw an error saying so: - The `$info`-array is used to provide information to the `\SimpleSAML\Auth\Source` base class, and therefore needs to be included. - Including the `$config`-array makes it possible to add generic configuration options that are valid for all authentication sources. -- The `authenticate(&$state)`-function must be implemented. +- The `authenticate(array &$state)`-function must be implemented. If this function completes, it is assumed that the user is authenticated, and that the `$state`-array has been updated with the user's attributes. **Rationale**: diff --git a/docs/simplesamlphp-changelog-1.x.md b/docs/simplesamlphp-changelog-1.x.md index c785c61dc2..d372b377e9 100644 --- a/docs/simplesamlphp-changelog-1.x.md +++ b/docs/simplesamlphp-changelog-1.x.md @@ -7,7 +7,7 @@ See the upgrade notes for specific information about upgrading. ## Version 1.19.6 -Released 1-7-2022 +Released 2022-07-01 * Fix several translations (#1572, #1573, #1577, #1578, #1603) * Fix HTTP status code for error pages (#1585) @@ -26,7 +26,7 @@ Released 1-7-2022 ## Version 1.19.5 -Released 24-01-2021 +Released 2021-01-24 * Fix composer-file to prevent warnings * Fix database persistence (#1555) @@ -42,7 +42,7 @@ Released 24-01-2021 ## Version 1.19.4 -Released 13-12-2021 +Released 2021-12-13 `core` @@ -114,7 +114,7 @@ Released 2021-10-27 ## Version 1.19.1 -Released TBD +Released 2021-04-29 * Fixed a bug in the Artifact Resolution Service (#1428) * Fixed compatibility with Composer pre 1.8.5 (Debian 10) (#1427) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 600b334aa0..c6ba0215db 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -3,18 +3,621 @@ [TOC] This document lists the changes between versions of SimpleSAMLphp. -See the upgrade notes for specific information about upgrading. +See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgrade-notes.html) for specific information about upgrading. + +## Version 2.4.5 + +Released TBD + +## Version 2.4.4 + +Released 2025-12-08 + +* store.redis.tls should apply to sentinels (#2557) +* Fix unhandled canonicalization failure (CVE-2025-66475) +* Bump dependencies + +## Version 2.4.3 + +Released 2025-10-05 + +* Prevent emulation of SQL prepare-statements +* Add Ukrainian translations (#2501) +* Update and improve Indonesian translations (#2462) +* Update and improve Thai translations (#2464) +* Update and improve Vietnamese translations (#2465) +* Fix various errors and warnings detected in VS Code (#2468) +* Remove information in simplesamlphp-advancedfeatures.md about + possible fallback from metadata.sign.privatekey to privatekey in IdP + and SP metadata files (#2470) +* Fix auth state AuthnInstant (#2478) +* Allow "Secure" cookie attribute via HTTP on localhost (#2483) +* Fix override over errorURL +* Introduced a new assets.salt to allow cache busting without leaking version information (#2490) +* If session.check_function is set and can not be called an error is raised (#2498) +* Fix FontAwesome icon names (#2509) +* NameIDType attributes are now JSON-serializable - these objects might appear in the array returned by getAuthDataArray() + +`authorize` + +* Remove reauthentication-button when reauthentication is disabled (simplesamlphp/simplesamlphp-module-authorize#24) (v1.6.2) + +`radius` + +* Add some more logging (v2.0.3) + +## Version 2.4.2 + +Released 2025-06-04 + +* Fixed a bug where metadata-endpoints with isDefault set would not yield the expected metadata (#2439) +* Fixed a backwards incompatibility that would throw an exception on an invalid entityID. + The exception was downgraded to a warning in the log (#2448) +* Fixed a security-issue where cron-jobs could be executed using the default key, + even if a different one was set (#2453) + +`memcacheMonitor` + +* Fixed an issue that prevented the latest version of this module from being installed on SSP 2.4.x + +`negotiate` + +* Fixed an issue that prevented the latest version of this module from being installed on SSP 2.4.x + +## Version 2.4.1 + +Released 2025-05-14 + +* Reverted #2278 because of a regression in SLO when using SSP as a bridge (#2436) +* Fixed a dependency on a dev-version of the saml2-library + +## Version 2.4.0 + +Released 2025-04-16 + +* Added a new feature flag `encryption.optional` to allow unencrypted assertions if the SP does + not provide an encryption certificate (#2208) +* Make translations tool theme-aware (#2315) +* Fix deprecation of Twig spaceless-filter (#2229) +* Add possibility to provide connection context to XML storage-handler (#2332) +* Throw user-friendly exception with the proper HTTP statuscode for incorrect HTTP-method (#2234) +* Fixed build-workflow to only re-build the website once +* Bugfix: Use entityID from state to allow overriding the issuer (#2345) +* When only a single IdP is in scope, skip discovery screen (#2355) +* Downgrade simplesamlphp/composer-module-installer to 1.3.x to keep things working with older (OS-supplied) + versions of composer +* Skip test if xdebug.mode does not contain develop (#2419) +* Add a console-script to clear cache (#2410) +* PHP 8.4 Deprecation fixes (#2413) +* Warn if a module has an unexpected translation-domain in its po file. +* Add configuration that enables/disables twig template debug mode (#2406) +* Add support for IDP Discovery protocol (#2402) +* Destroy session cookies on logout (#2278) +* A new module to allow debugging SP logins (#2381) +* When only a single IdP is in scope, skip discovery screen (#2355) +* Add authproc-filter to manipulate the Assertion's Issuer (#2346) +* Many improvements to docs and translations +* Updated dependencies + +`adfs` + +* The ADFS-module has been disconnected from the SSP release. To continue to use it, the module has to be manually installed. +* The ADFS-module was completely rewritten and now uses our own XML-libraries for building, signing and encrypting XML (v3.0.0) + +`discopower` + +* Create discopower.po for italian locale (#22) +* Hide tab list when there's only one tab +* Fix for tags containing uppercase letters +* Updated jQuery + +`ldap` + +* Add SASL-support (v2.4.0). Note that this required a newer version of symfony/ldap than the one packaged (v2.4.3) + +`metarefresh` + +* Fixed parsing of large metadata files (v1.2.4) + +`saml` + +* Stricter regexp to verify SubjectID/PairwiseID: disallow trailing spaces. + +## Version 2.3.7 + +Released TBD + +* Fixed loading translations for themes where there is no explicit X-Domain set in the po file. + +## Version 2.3.6 + +Released 2025-02-17 + +* Fixed PHP 8.4 deprecation notices +* Fixed infinite recursion (#2367) +* Added a new feature flag `encryption.optional` to allow unencrypted assertions if the SP does + not provide an encryption certificate (#2208) +* Make translations tool theme-aware (#2315) +* Fixed build-workflow to only re-build the website once +* Bugfix: Use entityID from state to allow overriding the issuer (#2345) +* When only a single IdP is in scope, skip discovery screen (#2355) +* Fixed "Undefined array key" warning in RequestedAuthnContextSelector if no RAC is present in the request +* SimpleSAMLAuthToken cookie is now removed during an SLO + +`adfs` + +* PHP 8.4 support +* The ADFS-module has been disconnected from the SSP release. To continue to use it, the module has to be manually installed. +* The ADFS-module was completely rewritten and now uses our own XML-libraries for building, signing and encrypting XML (v3.0.0) + +`authcrypt` + +* PHP 8.4 support + +`discopower` + +* Hide tab list when there's only one tab (simplesamlphp/simplesamlphp-module-discopower#27) (v1.5.0) +* Bugfix: Use jquery-assets repo to work around symlink-issue (simplesamlphp/simplesamlphp-module-discopower#28) (v1.5.1) + +`ldap` + +* Add SASL-support (v2.4.0). Note that this required a newer version of symfony/ldap than the one packaged (v2.4.3) + +`saml` + +* Stricter regexp to verify SubjectID/PairwiseID: disallow trailing spaces. +* Feature: Add authproc-filter to be able to manipulate the Assertion's Issuer (#2346) + +`debugsp` + +* Added module to allow testing the SP you have in your installation without needing admin login + This is similar to the admin/test page but can more easily be used by an IdP who may not have admin + privileges on your site. + +## Version 2.3.0 + +Released 2024-08-20 + +* The SubjectID authproc-filter now has a new option `hashed`, which if set to true + will automatically hash the unique part of the ID. This will also automatically + make the unique part of the ID in compliance with the specs (#2006) +* Add microsecond support to the FileLoggingHandler (#2084) +* Session ID's are now hashed when stored in a database (#2106) +* Improved HTML 5 compatibility (#2162) +* Fix: preloaded resource not used (#2207) +* BC-break (unintentional): plain-text admin-password are no longer allowed (#2113) + +`authorize` + +* Feature: allow a user to reauthenticate with a different account (simplesamlphp/simplesamlphp-module-authorize#17) (v1.5.0) +* Feature: show user what account he's using when authorization fails (simplesamlphp/simplesamlphp-module-authorize#20) (v1.6.0) +* Fix: fix faulty translation (v1.6.1) + +`consent` + +* Update Luxembourgish translations (v1.4.0) + +`negotiate` + +* Add support for SPNEGO channel binding (v2.3.1) + +`sqlauth` + +* Add username_regex option - run regular expression over username before querying the + database (simplesamlphp/simplesamlphp-module-sqlauth#11) (v1.3.0) + +## Version 2.2.6 + +Released 2025-08-20 + +* Fix auth state AuthnInstant (#2478) + +`cron` + +* Fixed a security-issue where cron-jobs could be executed using the default key, + even if a different one was set (#2453) + +`metarefresh` + +* Fixed parsing of large metadata files (v1.2.4) + +## Version 2.2.5 + +Released 2025-03-11 + +* Fixed PHP 8.4 deprecation notices +* Fixed infinite recursion (#2367) +* Fixed "Undefined array key" warning in RequestedAuthnContextSelector if no RAC is present in the request +* Bumped vulnerable saml2-library to v4.17.0 + +## Version 2.2.4 + +Released 2024-12-02 + +`Security` + +* A security bug was patched in the `saml2-library` that allowed for XXE during the parsing + of SAML2-messages (CVE-2024-52596) + +`Other fixes` + +* Run ob_end_clean() on configuration file parsing error (#2219) +* Fix typo that caused the metadata file-upload to be hidden (#2271) + +`admin` + +* Fix metadata-viewer to output a valid PHP array + +## Version 2.2.3 + +Released 2024-08-20 + +* Added a missing use-statement that would cause a 'class not found' exception. +* Improved Luxembourgish (LB) translations (#2129, #2140) +* Fix regression introduced in v2.2.2 regarding autofilling usernames. +* Restore the possibility to set `trusted.url.domains` to null +* Improved documentation on cachedir-setting (#2153) +* Fix bug in post.twig (#2161) +* Fix MDQ cache file bugs (#2200) + +`adfs` + +* Fixed metadata download to become a proper xml-file +* Prevent metadata-download from ever being cached + +`authorize` + +* Fixed logout button (simplesamlphp/simplesamlphp-module-authorize#16) (v1.4.1) + +`ldap` + +* Fixed a bug that would throw an unhandled exception to the user if they would enter + a non-existing organization and `username_organization_method` is set to `allow` or `force` (v2.3.6). + +`metarefresh` + +* Fixed incorrect parsing of configuration (v1.2.2) + +`radius` + +* Fixed security bug known as Blast-Radius (CVE-2024-3596) (simplesamlphp/simplesamlphp-module-radius#10) (v2.0.2) + +## Version 2.2.2 + +:warning: IMPORTANT NOTE :warning: + +Due to a mistake, this bugfix-release can turn out to become a backwards-incompatibility for those who override the loginuserpass.twig in their custom theme. +Please update your theme to reflect the changes in [this commit](https://github.com/simplesamlphp/simplesamlphp/pull/2022/commits/691199e9b963a2861d731e6583555c7a8df39992) before updating. + +Released 2024-04-30 + +* Fix regression when setting the host-variable in `saml20-idp-hosted` (was #1922) +* Fix posting the form to the incorrect endpoint when using an authsource based on UserPassOrgBase (#2022) +* Fix RequestedAuthnContextSelector for case with multiple RACs in request +* Add xml opening-tag to SP-metadata for consistency with IdP-metadata (#2048) +* Fixed a PHP 8.3 compliance issue in the logout handler (#2047) +* Improve parsing of base64-encoded strings +* Autofill username when Entra ID hints it in the HTTP parameters + +`admin` + +* Set custom security header to properly display phpinfo-page +* Hide file-upload button for metadata-converter if uploads are disabled at PHP-level + +`exampleauth` + +* Fix controller for External-authsource + +`ldap` + +* Fix exception being thrown when password is empty + +`saml2 library` + +Fixed a bug where base64 encoded strings were not decoded using the `strict` flag, leading +to an incorrect error message. + +`sqlauth` + +* Add username_regex option (simplesamlphp/simplesamlphp-module-sqlauth#11) (v1.3.0) + +## Version 2.2.1 + +Released 2014-03-17 + +* Fix regression in bin/initMDSPdo.php (was #1892) +* Fix regression in translations, causing a fallback to English (#2009 + #2010) + +`sqlauth` + +* Add multi-query support (simplesamlphp/simplesamlphp-module-sqlauth#9) (v1.2.0) + +## Version 2.2.0 + +Released 2024-03-08 + +* Make error codes easier to extend (#1870) +* Updated eduPerson attributes in attribute maps (#1948) +* Add regex support for attribute names in AttributeLimit authproc filter (#1971) +* Reverted the .mo files change introduced in 2.1.x +* NOTE: 'core:StatisticsWithAttribute' filter was removed from SimpleSAMLphp, but is still + available from the [statistics](https://github.com/simplesamlphp/simplesamlphp-module-statistics)-module. + It was previously enabled in the default configuration file (config/config.php.dist), so + many lightly configured installations will have it enabled by default. Please check your + config/config.php (and anywhere else you have authprocs configured) that you've either + disabled "core:StatisticsWithAttribute" or migrated to "statistics:StatisticsWithAttribute" + before upgrading to SimpleSAMLphp 2.2.0. + +## Version 2.1.4 + +Released 2024-02-29 + +* Fix static call for non-static method in bin/importPdoMetadata.php (#1969) +* Validate AuthState before processing it (#1706) +* Fix possible incompatible dependency-set (#1981) + +## Version 2.1.3 + +Released 2024-02-12 + +* Fix backwards compatibility for mandatory cachedir-setting introduced in 2.1.2 + +Deprecations: + +* The core:StatisticsWithAttribute authproc-filter has been deprecated. It is now available + in the 'statistics' module (v1.2+) as 'statistics:StatisticsWithAttribute', while only the + 'core:StatisticsWithAttribute' filter will be removed from SimpleSAMLphp in a future release. + +## Version 2.1.2 + +Released 2024-02-05 + +* Restore possibility to use HTTP-Artifact on AuthnRequests (regression from 2.0.4) +* Fixed undefined variable exception when using MS SQL store (#1917 + #1918) +* Fix legacy-endpoints to not send responses twice +* Fix exception when using iframe-logout (#1936) +* Look for the schema files in the right place (#1929) +* Fixed file logging handler to not fail on the first write after file-creation (#1877) +* Fixed a warning in the RequestedAuthnContextSelector + +`adfs` + +* Fixed incorrect use of StreamedResponse (v2.1.3) + +`core` + +* Fixed a broken template for the WarnShortSSOInterval authproc-filter (#1920) +* Fixed the order of the routes so that the least specific error-controller is hit last (#1923) + +`ldap` + +* Restored 1.x functionality to be able to fetch operational attributes (v2.3.0) +* Fixed undesirable side-effect introduced in v2.3.0 (v2.3.1) +* Restore the ability to read attributes using a privileged account (v2.3.2) + +`saml` + +* Disable caching for metadata-endpoint when protect.metadata is true (#1926) + +`saml2 library` + +* Fix serialization for the NameID element +* Fix inheritance - There is no relation between BaseID and NameID + +NOTE: Clear your session store after updating, because old serialized sessions can no longer be unserialized + +## Version 2.1.1 + +Released 2023-11-28 + +* Fix static call for non-static method in bin/initMDSPdo.php (#1892) +* Restore logout-behaviour for IdP's that do not send a saml:NameID in their LogoutRequest (#1894) +* Fix code error in docs (#1895) +* Fixed a TypeError when accessing the module.php endpoint without specifying a module (#1907) +* Fixed the precondition-functionality for more complex authproc-filters (#1905) +* Reverted a case of 'constructor property promotion' in SAMLParser, causing the validators to be empty (#1904) +* Drop ext-intl in favour of a polyfill (#1908) + +`multiauth` + +* Fix TypeError due to missing keys in source array (#1900) + +## Version 2.1.0 + +Released 2023-10-30 + +* Functionality that before was provided by the sanitycheck-module is now implicit. + The module has been archived and should no longer be used. (#1843) +* Add support for conditional authproc-filters (#1836) +* Add support for TLS configuration for Redis Store (#1828) +* Add support for Metadata Deployment Profile for errorURL (#1841) +* Raised minimum Symfony version to 6.0 +* Raise minimum PHP version to 8.0 +* Specified the allowed HTTP methods for each route +* Our dependency on `composer/composer` was dropped in favour of a packaged phar-file (#1857) +* The `bin/pwgen.php` script was improved to used stronger encryption (#1849) +* Fixed a missing Accept-header for metadata queries (#1865) +* Changed the UNIQUE constraint for the SP LogoutStore database to PRIMARY KEY to + prevent confusing warnings in Drupal (#1862) +* Add Accept HTTP headers to MDQ queries (#1865) +* The custom error- and exception handlers were moved to their very own classes (#1858) + +## Version 2.0.8 + +Released 2023-11-28 + +* Fix static call for non-static method in bin/initMDSPdo.php (#1892) +* Restore logout-behaviour for IdP's that do not send a saml:NameID in their LogoutRequest (#1894) +* Fix code error in docs (#1895) +* Fixed a TypeError when accessing the module.php endpoint without specifying a module (#1907) +* Drop ext-intl in favour of a polyfill (#1908) + +`multiauth` + +* Fix TypeError due to missing keys in source array (#1900) + +## Version 2.0.7 + +Released 2023-10-30 + +* Fixed a missing Accept-header for metadata queries (#1865) +* Update vulnerable composer (CVE-2023-43655; not affected) +* Fixed a potential XSS-through-DOM (3x; not affected) +* Fixed a warning in the RequestedAuthnContextSelector + +## Version 2.0.6 + +Released 2023-09-07 + +* Fixed a legacy endpoint causing to break iframe-logout (#1846) +* Fixed an incorrect return-type in RunnableResponse +* Fix for admin.protectmetadata=true - it would show a blank page +* Fix default for entity attributes NameFormat in XML metadata to be 'URI'. +* Fix error message when invoking SSO endpoint without the required parameters. +* Security header regression +* Fixed a regression that made it impossible to configure metadata-signing on individual hosted IdP's (#1792) + +## Version 2.0.5 + +Released 2023-07-31 + +* Fixed link pointing to legacy endpoint (#1833) +* Updated German translations (#1814) +* Do not drop UIInfo from SSP array style metadata (#1808) +* Fixed incorrect return types +* Added removeEntry-method to MetadataStorageHandlerPdo (#1823) +* Fixed SLO with signed response (#1812) +* Fixed broken MetaDataStorageHandlerSerialize +* Usernames are now trimmed (#1829) +* Never expose the cron-API if secret is not properly configured (#1831) +* Fixed a bug where IdP-initiated SLO using the HTTP-POST binding wasn't properly dealt with + +`admin` + +* Updated French translations (#1824) + +`cron` + +* Log a warning if secret is not properly configured (#1831) + +`metarefresh` + +* Added support for PDO storage (v0.11.0) + +## Version 2.0.4 + +Released 2023-05-12 + +* The source that was selected by the SourceSelector is now available in the state. +* The zone that was selected by the SourceIPSelector is now available in the state. +* The defaultSource for the SourceIPSelector can now be set to `null`. If none of the zones + are matched, a NotFound exception will be thrown. +* It is now possible to set a default AuthnContext in the RequestedAuthnContextSelector. +* Fixed a bug in MDQ metadata expiration +* Resolved a possible object injection vulnerability in MDQ metadata cache +* Restored the possibility to use HTTP-Artifact binding on AuthnRequests +* Removed unused private method MetaDataStorageSource::getDynamicHostedUrl (leftover from entityid generation) +* Bumped simplesamlphp-assets-base + +`ldap` + +* Fixed loading the options-array from configuration (v2.1.6) +* Properly escape user-input in ldap filters (v2.1.7) + +`saml2` + +* Fixed a static call to a non-static function that caused a broken artifact binding (v4.6.8) + +## Version 2.0.3 + +Released 2023-03-29 + +* Fix exception when translation-file does not exist +* Correct host in generated URLS for IdPs with 'host' config in admin/federation (#1774, #1781) +* Restore dev-autoloader (#1795) + +`authyubikey` + +* The module wasn't fully compatible with SSP 2.0 yet (v2.0.1) + +`cas` + +* Fixed a broken controller (simplesamlphp/simplesamlphp-module-cas#6) (v1.1.2) + +`saml2debug` + +* Fixed a broken controller (simplesamlphp/simplesamlphp-module-saml2debug#4) (v1.0.5) + +## Version 2.0.2 + +Released 2023-03-10 + +* Fixed the broken 2.0.1 release by restoring an accidentally removed file + +## Version 2.0.1 + +Released 2023-03-10 + +* The language-menu on mobile devices was fixed +* Fix some issues with logout (#1776, #1780, #1785) +* The `loginpage_links` functionality for authsources was restored and documented (#1770, #1773) +* Several issues regarding the use of the back-button were fixed (#1720) +* Many fixes in documentation +* Fixed config/authsources.php.dist so you can just rename it for new deployments to get you started (#1771) +* Fixed UTF-8 encoding for metadata output +* Fixed incompatibility with SSP 2.0 for the following modules; + * consent + * consentadmin + * consentsimpleadmin + * exampleattributeserver + * expirycheck + * memcachemonitor + * memcookie + * metaedit + * negotiate + * negotiateext + * preprodwarning + * saml2debug + * sanitycheck + * sqlauth + +`authtwitter` + +* A legacy route was added for backwards compatibility +* Docs have been updated + +`ldap` + +* Fixed the possibility to return ALL attributes (simplesamlphp/simplesamlphp-module-ldap#39) +* Restored the possibility to use anonymous bind (simplesamlphp/simplesamlphp-module-ldap#41) + +`negotiate` + +* Added support for multi-realm environments + +`statistics` + +* Fixed missing script-tag to load jQuery +* Fixed static calls to SSP utilities +* Docs have been updated ## Version 2.0.0 -* Support for certificate fingerprints was removed -* Support for SAML 1.1 was removed -* Old-style PHP templates were removed -* Old-style dictionaries were removed -* The default value for attrname-format was changed to 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri' - to comply with SAML2INT -* core:PairwiseID and core:SubjectID authprocs no longer support the 'scope' config-setting. - Use 'scopeAttribute' instead to identify the attribute holding the scope. -* Accepting unsolicited responses can be disabled by setting `enable_unsolicited` to `false` in the SP authsource. -* Certificates and private keys can now be retrieved from a database -* Support for Redis sentinel was added (#1699) +Released 2023-02-23 + +* Many changes, upgrades and improvements since the 1.x series. +* Most notably the new templating system based on Twig, a new + localization system based on gettext. +* Most modules have been moved out of the core package but can + easily be installed on-demand as required via composer. +* Better conformance by default to the SAML2INT standard. +* Code cleanups, improvements and simplifications. +* Improved test coverage and more use of standard libraries. +* Compatibility with modern versions of PHP. +* Various new features, including: + * SAML SubjectID and Pairwise ID support + * Accepting unsolicited responses can be disabled by setting `enable_unsolicited` to `false` in the SP authsource. + * Certificates and private keys can now be retrieved from a database + * Support for Redis sentinel was added. +* Please read the upgrade notes for 2.0 because this release breaks + backwards compatibility in a number of places. diff --git a/docs/simplesamlphp-customauth.md b/docs/simplesamlphp-customauth.md index f5e316b623..a6de7a20de 100644 --- a/docs/simplesamlphp-customauth.md +++ b/docs/simplesamlphp-customauth.md @@ -21,7 +21,6 @@ cd modules mkdir mymodule ``` -Since this is a custom module, it should always be enabled in the configuration. Now that we have our own module, we can move on to creating an authentication source. Creating a basic authentication source @@ -29,10 +28,10 @@ Creating a basic authentication source Authentication sources are implemented using PHP classes. We are going to create an authentication source named `mymodule:MyAuth`. -It will be implemented in the file `modules/mymodule/lib/Auth/Source/MyAuth.php`. +It will be implemented in the file `modules/mymodule/src/Auth/Source/MyAuth.php`. To begin with, we will create a very simple authentication source, where the username and password is hardcoded into the source code. -Create the file `modules/mymodule/lib/Auth/Source/MyAuth.php` with the following contents: +Create the file `modules/mymodule/src/Auth/Source/MyAuth.php` with the following contents: ```php [ + 'mymodule' => true, + /* Other enabled modules follow. */ +], +``` + Testing our authentication source --------------------------------- @@ -203,10 +214,10 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase $this->password = $config['password']; } - protected function login($username, $password) + protected function login(string $username, string $password): array { if ($username !== $this->username || $password !== $this->password) { - throw new \SimpleSAML\Error\Error('WRONGUSERPASS'); + throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); } return [ @@ -324,7 +335,11 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase */ private function checkPassword($passwordHash, $password) { - $passwordHash = base64_decode($passwordHash); + $passwordHash = base64_decode($passwordHash, true); + if (empty($passwordHash)) { + throw new \InvalidArgumentException("Password hash is empty or not a valid base64 encoded string."); + } + $digest = substr($passwordHash, 0, 20); $salt = substr($passwordHash, 20); @@ -332,11 +347,12 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase return $digest === $checkDigest; } - protected function login($username, $password) + protected function login(string $username, string $password): array { /* Connect to the database. */ $db = new PDO($this->dsn, $this->username, $this->password, $this->options); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); /* Ensure that we are operating with UTF-8 encoding. * This command is for MySQL. Other databases may need different commands. @@ -357,14 +373,14 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase if (!$row) { /* User not found. */ SimpleSAML\Logger::warning('MyAuth: Could not find user ' . var_export($username, true) . '.'); - throw new \SimpleSAML\Error\Error('WRONGUSERPASS'); + throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); } /* Check the password. */ if (!$this->checkPassword($row['password_hash'], $password)) { /* Invalid password. */ SimpleSAML\Logger::warning('MyAuth: Wrong password for user ' . var_export($username, true) . '.'); - throw new \SimpleSAML\Error\Error('WRONGUSERPASS'); + throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); } /* Create the attribute array of the user. */ @@ -380,7 +396,7 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase } ``` -And configured in `config/authsources.php`: +Configured in `config/authsources.php`: ```php 'myauthinstance' => [ @@ -390,3 +406,12 @@ And configured in `config/authsources.php`: 'password' => 'secret_db_password', ], ``` + +And enabled in `config/config.php`: + +```php +'module.enable' => [ + 'mymodule' => true, + /* Other enabled modules follow. */ +], +``` diff --git a/docs/simplesamlphp-developer-information.md b/docs/simplesamlphp-developer-information.md new file mode 100644 index 0000000000..31b22c344b --- /dev/null +++ b/docs/simplesamlphp-developer-information.md @@ -0,0 +1,168 @@ +# SimpleSAMLphp developer information + + + +[TOC] + +This document is intended to provide an overview of the code for developers. +It should be readable to new developers and developers who contribute as +time allows and may have forgotten some details over time. + +## Overview + +This is a living document and various sections and additions are being made +as my knowledge of the SSP code and environment expands. Hopefully this can help +others find their way around the code a bit quicker. + +The `master` branch is where active development of the next release is +taking place. If you would like to contribute an update to and +existing release please checkout the branch for that release, for +example to make a contribution to the v2.1.1 release you would +checkout the [simplesamlphp-2.1 +branch](https://github.com/simplesamlphp/simplesamlphp/tree/simplesamlphp-2.1). + +## Libraries that SimpleSAMLphp uses and planned changes + +Many dependencies are listed in the require clause of the composer.json such as Symfony, Twig, and simplesamlphp/saml2. + +As at early 2024 there is a plan to move from using robrichards/xmlseclibs to using the newly written [xml-security +library](https://github.com/simplesamlphp/xml-security). The integration of xml-security started in the v5 of the saml2 library. +The saml2 library is already a dependency of SimpleSAMLphp and is brought in with composer as a [dependency here.](https://github.com/simplesamlphp/simplesamlphp/blob/15019f97eb1b4041859582b8b6f39fe432b603af/composer.json#L66C21-L66C29). + +## Build process + +There are two main release targets for each release: slim and full. +This is done by the +[build-release.yml](https://github.com/simplesamlphp/simplesamlphp/blob/master/.github/workflows/build-release.yml) +script. The full version also contains some [simplesamlphp +modules](https://github.com/simplesamlphp/simplesamlphp/blob/master/.github/build/full.json). +The build will also include some files in the vendor directory in the +full build that are not in the slim build. + +If the SimpleSAMLphp code relies on other repositories on the [simplesamlphp](https://github.com/simplesamlphp) site then +they are brought in using composer as shown for example for the [saml2 library](https://github.com/simplesamlphp/simplesamlphp/blob/435ce92874a789101495504cd6c4da600fb01334/composer.json#L73). + +## Code checks + +The github actions perform some linting and checks on the php code. +The linting is done with super-linter and the php checks with phpcs. +You can run the phpcs checks locally by executing `phpcs` in the root +of the git repository. If you would like your simpler issues to be +solved for you execute `phpcbf` which will update the code to remedy +as many issues as it can. + +## CSS and common asset setup + +The common assets such as CSS in SimpleSAMLphp, for example, that +stored in public/assets/base/css/stylesheet.css comes from the +[simplesamlphp-assets-base](https://github.com/simplesamlphp/simplesamlphp-assets-base) +package. + +The dependencies are updated using github actions in +simplesamlphp-assets-base. Select a recent branch such as release-2.2 +and dig into the .github directory for details. + +## Following a simple login + +The `SimpleSAML\Auth\Simple` class takes the authentication_source +name and can be used to find a login URL with `getLoginURL()`. The +getLoginURL method takes the return URL as it's only parameter. The +URL returned from `getLoginURL()` will be a request to module.php and +include the return URL information. + +The module.php code `Module::process`. The `process` method uses +Symfony to dispatch the request. This may result in a call to +modules/core/src/Controller/Login.php in `Login::loginuserpass()`. The +code flows through `handleLogin()` which may call +`UserPassBase::handleLogin(authstateid, username, password)`. The +`handleLogin` method looks up the `$as = Auth\Source` and passes the +login credentials to the `$as->login( username, password )` method. + +For an SQL based login this would be in +modules/sqlauth/src/Auth/Source/SQL.php and the `SQL::login` method. +This `login` method either returns the user attributes on success or +throws an exception on login failure. + +## Documentation + +The core of the simplesamlphp.org website is taken from +[simplesamlphp.github.io](https://github.com/simplesamlphp/simplesamlphp.github.io). +The [docs subdirectory](https://simplesamlphp.org/docs/) is built from +the [docs +subdirectory](https://github.com/simplesamlphp/simplesamlphp/tree/master/docs) +of the main repository on github. + +### Documentation updates + +There are two main repositories for documentation. The website itself +comes from one place and everything that is under the "Documentation" +menu uses another process +. + +The website lives in + +That only has a "release" branch to commit to, which is the website as +it is shown. There you'd commit to change the pages on the website, +e.g. to the page /contrib/ + +The "docs" repo (as described in the readme of the repo) only contains +the scripts that generate the docs website. In order to improve the +content of the documentation themselves, you commit using the same branches used +for code contributions at +. + +You can address documentation updates to master +. +Though it makes sense to backport them to supported releases, so each +version under will show the +change. In other words, if a documentation change relates to 2.1.3 you +might like to make the pull request against the simplesamlphp-2.1 +branch and leave it to the team to also apply it to master and other +branches in the same way that code updates work. + +Some docs offered under the `docs` directory on the web site come from modules. +For example the [saml module](https://simplesamlphp.org/docs/2.3/saml/sp.html) +file comes from the file `./modules/saml/docs/sp.md` in the git repository. + +### Documentation linting + +The CI system has some linting for markdown files in place. This uses +`github-action-markdown-cli` to perform the work which itself uses +`markdownlint-cli`. You can install the latter with npm install and +then setup the rc file from github-action-markdown-cli from + +to run the linter locally. + +For example, with the markdownlintrc from above in a local file you +could use the following if you have not globally installed +markdownlint. The `--fix` option will have markdownlint fix simpler +issues for you so you can concentrate on the document and not the fine +details of the syntax formatting. + +```bash +npm install markdownlint-cli +cd ./node_modules/.bin +# copy the markdown lint file to markdownlintrc +./markdownlint -c markdownlintrc /tmp/simplesamlphp-developer-information.md +./markdownlint -c markdownlintrc --fix /tmp/simplesamlphp-developer-information.md +``` + +You will probably want to make a script or alias to the above command +and apply it before pushing documentation changes to github. + +## Making a release + +The release process is documented on the wiki +. + +## Dependbot + +The dependbot + runs on the master branch +and creates pull requests with recommended updates. + +The release branches are updated automatically as part of the release process. diff --git a/docs/simplesamlphp-errorhandling.md b/docs/simplesamlphp-errorhandling.md index b3a4c32f91..99200bc1e9 100644 --- a/docs/simplesamlphp-errorhandling.md +++ b/docs/simplesamlphp-errorhandling.md @@ -66,7 +66,7 @@ It represents a SAML 2 status code with three elements: the top-level status cod The second-level status code and the status message is optional, and can be `NULL`. The `\SimpleSAML\Module\saml\Error` class contains a helper function named `fromException`. -The `fromException()` function is used by `www/saml2/idp/SSOService.php` to return SAML 2 errors to the SP. +The `fromException()` function is used to return SAML 2 errors to the SP. The function contains a list which maps various exceptions to specific SAML 2 errors. If it is unable to convert the exception, it will return a generic SAML 2 error describing the original exception in its status message. @@ -130,7 +130,6 @@ There are two methods in this class that deals with exceptions: #### `throwException` This method delivers the exception to the code that initialized the exception handling in the authentication state. -That would be `www/saml2/idp/SSOService.php` for processing filters. To configure how and where the exception should be delivered, there are two fields in the state-array which can be set: * `\SimpleSAML\Auth\State::EXCEPTION_HANDLER_FUNC`, in which case the exception will be delivered by a function call to the function specified in that field. diff --git a/docs/simplesamlphp-googleapps.md b/docs/simplesamlphp-googleapps.md index 6dc83afe8b..7db85832f5 100644 --- a/docs/simplesamlphp-googleapps.md +++ b/docs/simplesamlphp-googleapps.md @@ -1,14 +1,7 @@ -# Setting up a SimpleSAMLphp SAML 2.0 IdP to use with Google Workspace (G Suite / Google Apps) for Education +# Setting up a SimpleSAMLphp SAML 2.0 IdP to use with Google Workspace for Education [TOC] -## SimpleSAMLphp news and documentation - -This document is part of the SimpleSAMLphp documentation suite. - -* [List of all SimpleSAMLphp documentation](https://simplesamlphp.org/docs) -* [SimpleSAMLphp homepage](https://simplesamlphp.org) - ## Introduction This article describes how to configure a Google Workspace (formerly G Suite, formerly Google Apps) @@ -41,6 +34,7 @@ The certificate above will be valid for 10 years. Here is an example of typical user input when creating a certificate request: +```bash Country Name (2 letter code) [AU]:NO State or Province Name (full name) [Some-State]:Trondheim Locality Name (eg, city) []:Trondheim @@ -53,6 +47,7 @@ Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: +``` **Note**: SimpleSAMLphp will only work with RSA and not DSA certificates. @@ -119,7 +114,7 @@ This is the configuration of the IdP itself. Here is some example config: ```php // The SAML entity ID is the index of this config. -$metadata['https://example.org/saml-idp'] => [ +$metadata['https://example.org/saml-idp'] = [ // The hostname of the server (VHOST) that this SAML entity will use. 'host' => '__DEFAULT__', @@ -139,33 +134,29 @@ In the `saml20-sp-remote.php` file we will configure an entry for Google Workspa ```php /* - * This example shows an example config that works with Google Workspace (G Suite / Google Apps) for education. - * What is important is that you have an attribute in your IdP that maps to the local part of the email address - * at Google Workspace. E.g. if your google account is foo.com, and you have a user with email john@foo.com, then you - * must properly configure the saml:AttributeNameID authproc-filter with the name of an attribute that for this user has the value of 'john'. + * This example shows an example config that works with Google Workspace for education. + * You send the email address that identifies the user from your IdP in the SAML Name ID. */ -$metadata['https://www.google.com/a/g.feide.no'] => [ - 'AssertionConsumerService' => 'https://www.google.com/a/g.feide.no/acs', +$metadata['https://www.google.com/a/g.feide.no'] = [ + 'AssertionConsumerService' => 'https://www.google.com/a/g.feide.no/acs', 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'simplesaml.attributes' => false, 'authproc' => [ 1 => [ - 'saml:AttributeNameID', - 'attribute' => 'uid', - 'format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', + 'class' => 'saml:AttributeNameID', + 'identifyingAttribute' => 'mail', + 'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', ], ], ]; ``` -You must also map some attributes received from the authentication module into email field sent to Google Workspace. In this example, the `uid` attribute is set. When you later configure the IdP to connect to a LDAP directory or some other authentication source, make sure that the `uid` attribute is set properly, or you can configure another attribute to use here. The `uid` attribute contains the local part of the user name. - -For an e-mail address `student@g.feide.no`, the `uid` should be set to `student`. - -You should modify the `AssertionConsumerService` to include your G Suite domain name instead of `g.feide.no`. +You should modify the entityID above and the `AssertionConsumerService` to +include your Google Workspace domain name instead of `g.feide.no`. -For an explanation of the parameters, see the -[SimpleSAMLphp Identity Provider QuickStart](simplesamlphp-idp). +(It is also possible to send only the local part of the email address to Google. E.g. +for an e-mail address at GW `student@g.feide.no`, sending an attribute with the +value `student`.) ## Configure Google Workspace @@ -209,22 +200,18 @@ Figure 4. **Fill out the remaining fields** ![Fill out the remaining fields](resources/simplesamlphp-googleapps/googleapps-ssoconfig.png) -### Add a user in G Suite that is known to the IdP +### Add a user in Google Workspace that is known to the IdP -Before we can test login, a new user must be defined in Google Workspace. This user must have a mail field matching the email prefix mapped from the attribute as described above in the metadata section. +Before we can test login, a new user must be defined in Google Workspace. This user must have a mail field matching the email from the attribute as described above in the metadata section. ## Test to login to G Suite for education Go to the URL of your mail account for this domain, the URL is similar to the following: -`http://mail.google.com/a/yourgoogleappsdomain.com` +`http://mail.google.com/a/yourgoogleworkspacedomain.com` replacing the last part with your own Google Workspace domain name. -## Security Considerations - -Make sure that your IdP server runs HTTPS (TLS). The Apache documentation contains information for how to configure HTTPS. - ## Support If you need help to make this work, or want to discuss SimpleSAMLphp with other users of the software, you are fortunate: Around SimpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. diff --git a/docs/simplesamlphp-idp-more.md b/docs/simplesamlphp-idp-more.md index 38f05e387b..28181dd31f 100644 --- a/docs/simplesamlphp-idp-more.md +++ b/docs/simplesamlphp-idp-more.md @@ -56,3 +56,30 @@ IdP-initiated logout can be initiated by visiting the URL: `https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=` It will send a logout request to each SP, and afterwards return the user to the URL specified in the `ReturnTo` parameter. Bear in mind that IdPs might disallow redirecting to URLs other than those of their own for security reasons, so in order to get the redirection to work, it might be necessary to ask the IdP to whitelist the URL we are planning to redirect to. + +Adding links to the login page +------------------------------ + +If you want to add some helpful links to the login page, you can add +the following to the `authsources.php` config of the authentication +source you are using: + +```php + 'example-userpass' => [ + ... + 'core:loginpage_links' => [ + [ + 'href' => 'https://example.com/reset', + 'text' => 'Forgot your password?', + ], + [ + 'href' => 'https://example.com/news', + 'text' => 'Latest news about us', + ], + ], + ... + ], +``` + +The given text will also be translated via SimpleSAMLphp's translation +system if translations are available in the messages catalog. diff --git a/docs/simplesamlphp-idp.md b/docs/simplesamlphp-idp.md index 1dd173ce53..9c7eb9d2e9 100644 --- a/docs/simplesamlphp-idp.md +++ b/docs/simplesamlphp-idp.md @@ -83,13 +83,15 @@ In this setup, this file should contain a single entry: $config = [ 'example-userpass' => [ 'exampleauth:UserPass', - 'student:studentpass' => [ - 'uid' => ['student'], - 'eduPersonAffiliation' => ['member', 'student'], - ], - 'employee:employeepass' => [ - 'uid' => ['employee'], - 'eduPersonAffiliation' => ['member', 'employee'], + 'users' => [ + 'student:studentpass' => [ + 'uid' => ['student'], + 'eduPersonAffiliation' => ['member', 'student'], + ], + 'employee:employeepass' => [ + 'uid' => ['employee'], + 'eduPersonAffiliation' => ['member', 'employee'], + ], ], ], ]; @@ -182,13 +184,23 @@ This is a minimal example of a `metadata/saml20-sp-remote.php` metadata file for 'https://sp.example.org/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp', - 'SingleLogoutService' => 'https://sp.example.org/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp', + 'AssertionConsumerService' => [ + [ + 'Location' => 'https://sp.example.org/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp', + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', + ], + ], + 'SingleLogoutService' => [ + [ + 'Location' => 'https://sp.example.org/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp', + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + ], + ], ]; ``` Note that the URI in the entityID and the URLs to the AssertionConsumerService and SingleLogoutService endpoints change between different service providers. -If you have the metadata of the remote SP as an XML file, you can use the built-in XML to SimpleSAMLphp metadata converter, which by default is available as `/admin/metadata-converter.php` in your SimpleSAMLphp installation. +If you have the metadata of the remote SP as an XML file, you can use the built-in XML to SimpleSAMLphp metadata converter, which by default is available as `/module.php/admin/federation/metadata-converter` in your SimpleSAMLphp installation. For more information about available options in the sp-remote metadata files, see the [SP remote reference](simplesamlphp-reference-sp-remote). diff --git a/docs/simplesamlphp-install-repo.md b/docs/simplesamlphp-install-repo.md index 904fe91e15..c2dd4752f3 100644 --- a/docs/simplesamlphp-install-repo.md +++ b/docs/simplesamlphp-install-repo.md @@ -6,7 +6,7 @@ These are some notes about running SimpleSAMLphp from the repository. Prerequisites ------------- -* NodeJS version >= 10.0. +Review the [prerequisites](simplesamlphp-install) from the main installation guide. Installing from git ------------------- @@ -17,33 +17,60 @@ Go to the directory where you want to install SimpleSAMLphp: cd /var ``` +The `master` branch is not stable and targets the next major release. +Pick a [tag](https://github.com/simplesamlphp/simplesamlphp/tags) to use. + Then do a git clone: ```bash -git clone git@github.com:simplesamlphp/simplesamlphp.git simplesamlphp +git clone --branch https://github.com/simplesamlphp/simplesamlphp.git simplesamlphp ``` Initialize configuration and metadata: ```bash cd /var/simplesamlphp -cp -r config-templates/* config/ -cp -r metadata-templates/* metadata/ +cp config/config.php.dist config/config.php +cp config/authsources.php.dist config/authsources.php +cp metadata/saml20-idp-hosted.php.dist metadata/saml20-idp-hosted.php +cp metadata/saml20-idp-remote.php.dist metadata/saml20-idp-remote.php +cp metadata/saml20-sp-remote.php.dist metadata/saml20-sp-remote.php ``` +SimpleSAMLphp uses Symfony to maintain a cache which is by default stored +at `/var/cache/simplesamlphp`. You are encouraged to consider something +like the ACL commands from the [Symfony +website](https://symfony.com/doc/current/setup/file_permissions.html#1-using-acl-on-a-system-that-supports-setfacl-linux-bsd) +to enable access to this cache directory. + +The cache directory is stored at the location indicated by the +`cachedir` option in your config.php (defaulting to +`/var/cache/simplesamlphp`). This directory should exist and be +writable by the web server user and the user you use to run composer. + +Some commands which may be run from composer will want to clear this +cache which leads to a situation that the cache directory will need +permission to be updated by both the web server and also from your +regular user account that you use to checkout the git repository and +run composer. + +This is why it is recommended to use the solution provided on the +[Symfony +website](https://symfony.com/doc/current/setup/file_permissions.html#1-using-acl-on-a-system-that-supports-setfacl-linux-bsd) +linked above to enable access to this cache directory. + Install the external dependencies with Composer (you can refer to [getcomposer.org](https://getcomposer.org/) to get detailed -instructions on how to install Composer itself) and npm: +instructions on how to install Composer itself): ```bash php composer.phar install -npm install ``` -Build the assets: +When installing on Windows, use: ```bash -npm run build +php composer.phar install --ignore-platform-req=ext-posix ``` Upgrading @@ -55,17 +82,28 @@ Go to the root directory of your SimpleSAMLphp installation: cd /var/simplesamlphp ``` -Ask git to update to the latest version: +Ask git to update to update the local repository information: ```bash git fetch origin -git pull origin master ``` -Install or upgrade the external dependencies with Composer and npm: +If you installed as described above, you will be using a +[tag](https://github.com/simplesamlphp/simplesamlphp/tags) for a +specific release. You can see the current tag you are using and +checkout a newer one with the below commands: + +```bash +git branch +* (HEAD detached at v2.2.1) +git checkout v2.2.2 +``` + +Install or upgrade the external dependencies with Composer: ```bash php composer.phar install -npm install -npm run build ``` + +When using Windows see the additional options for this composer +command shown at the end of the installation step above. diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index 40b17c6686..59f6b1ac06 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -14,9 +14,12 @@ repository](simplesamlphp-install-repo). ## Prerequisites * A web server capable of executing PHP scripts. -* PHP version >= 7.2.0. +* PHP version >= 8.1.0. * Support for the following PHP extensions: - * Always required: `date`, `dom`, `hash`, `intl`, `json`, `libxml`, `mbstring`, `openssl`, `pcre`, `SPL`, `zlib` + * Always required: `date`, `dom`, `fileinfo`, `filter`, `hash`, `json`, `libxml`, `mbstring`, `openssl`, + `pcre`, `session`, `simplexml`, `sodium`, `SPL` and `zlib` + * When running on Linux: `posix` + * When wanting to use translations for non-English languages: `intl` * When automatically checking for latest versions, and used by some modules: `cURL` * When authenticating against an LDAP server: `ldap` * When authenticating against a RADIUS server: `radius` @@ -82,8 +85,8 @@ upgrade notes), you may have to update your configuration and metadata after upd ### Upgrading configuration files -A good approach is to run a `diff` between your previous `config.php` file and the new `config.php` file located in -`config-templates/config.php`, and apply relevant modifications to the new template. This will ensure that all new +A good approach is to run a `diff` between your previous `config.php` file and the new `config.php.dist` file located +the same directory, and apply relevant modifications to the new template. This will ensure that all new entries in the latest version of config.php are included, as well as preserve your local modifications. ### Upgrading metadata files @@ -112,7 +115,7 @@ Examples below assume that SimpleSAMLphp is installed in the default location, ` another location, but this requires a path update in a few files. See Appendix _Installing SimpleSAMLphp in alternative locations_ for more details. -The only subdirectory of `SimpleSAMLphp` that needs to be accessible from the web is `www`. There are several ways of +The only subdirectory of `SimpleSAMLphp` that needs to be accessible from the web is `public`. There are several ways of exposing SimpleSAMLphp depending on the way web sites are structured on your Apache web server. The following is just one possible configuration. @@ -126,9 +129,9 @@ look like this: SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config - Alias /simplesaml /var/simplesamlphp/www + Alias /simplesaml /var/simplesamlphp/public - + Require all granted @@ -136,10 +139,10 @@ look like this: Note the `Alias` directive, which gives control to SimpleSAMLphp for all urls matching `http(s)://service.example.com/simplesaml/*`. SimpleSAMLphp makes several SAML interfaces available on the web; all of -them are accessible through the `www` subdirectory of your SimpleSAMLphp installation. You can name the alias +them are accessible through the `public` subdirectory of your SimpleSAMLphp installation. You can name the alias whatever you want, but the name must be specified in the `baseurlpath` configuration option in the `config.php` file of SimpleSAMLphp as described in -[the section called “SimpleSAMLphp configuration: config.php”](#section_6 "SimpleSAMLphp configuration: config.php"). +[the section called “SimpleSAMLphp configuration: config.php”](simplesamlphp-install#configuration). Here is an example of how this configuration may look like in `config.php`: ```php @@ -159,7 +162,7 @@ directory too, use the `metadatadir` configuration option to specify the locatio This is just the basic configuration to get things working. For a checklist further completing your documentation, please see -[Maintenance and configuration: Apache](simplesamlphp-maintenance#section_5). +[Maintenance and configuration: Apache](simplesamlphp-maintenance). ## Configuring Nginx @@ -167,7 +170,7 @@ Examples below assume that SimpleSAMLphp is installed in the default location, ` another location, but this requires a path update in a few files. See Appendix _Installing SimpleSAMLphp in alternative locations_ for more details. -The only subdirectory of `SimpleSAMLphp` that needs to be accessible from the web is `www`. There are several ways of +The only subdirectory of `SimpleSAMLphp` that needs to be accessible from the web is `public`. There are several ways of exposing SimpleSAMLphp depending on the way web sites are structured on your Nginx web server. The following is just one possible configuration. @@ -178,6 +181,7 @@ look like this: server { listen 443 ssl; server_name idp.example.com; + index index.php; ssl_certificate /etc/pki/tls/certs/idp.example.com.crt; ssl_certificate_key /etc/pki/tls/private/idp.example.com.key; @@ -185,7 +189,7 @@ server { ssl_ciphers EECDH+AESGCM:EDH+AESGCM; location ^~ /simplesaml { - alias /var/simplesamlphp/www; + alias /var/simplesamlphp/public; location ~^(?/simplesaml)(?.+?\.php)(?/.*)?$ { include fastcgi_params; @@ -218,30 +222,31 @@ There are a few steps that you should complete in the main configuration file, ` **ignores** the `X-Forwarded-*` set of headers that your proxy might be setting, so **do not rely on those**. * Set an administrator password. This is needed to access some of the pages in your SimpleSAMLphp installation web - interface. - - Hashed passwords can also be used here. See the [`authcrypt`](./authcrypt:authcrypt) documentation - for more information. + interface. Plain-text passwords are not allowed, but you can generate a safe password-hash using the `bin/pwgen.php` + script. ```php 'auth.adminpassword' => 'setnewpasswordhere', ``` -* Set a secret salt. This should be a random string. Some parts of the SimpleSAMLphp needs this salt to generate +* Set a secret salt and assets.salt. + These should be random strings. Some parts of the SimpleSAMLphp needs this salt to generate cryptographically secure hashes. SimpleSAMLphp will give an error if the salt is not changed from the default value. The command below can help you to generated a random string on (some) unix systems: + The assets.salt is separate to the main secretsalt because assets.salt is used on many assets with known values. + ```bash tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo ``` - Here is an example of the configuration option: +Here is an example of the configuration option: ```php 'secretsalt' => 'randombytesinsertedhere', ``` - **Please note that changing the secret salt may break access to services for your users**. +**Please note that changing the secret salt may break access to services for your users**. * Configure your data storage. You can do this by editing the `store.type` configuration option, and setting it to one of the supported values. Now configure the backend of your choice with the relevant options, if needed. @@ -272,7 +277,14 @@ tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' 'Europe/Oslo', ``` - You can see [a list of Supported Timezones at php.net](http://php.net/manual/en/timezones.php). +You can see [a list of Supported Timezones at php.net](http://php.net/manual/en/timezones.php). + +You might consider setting showerrors to `false` to hide error +descriptions and backtraces from the browser. + +```php +'showerrors' => false, +``` ## Configuring PHP @@ -328,15 +340,6 @@ At the bottom of the admin page there are some green lights. SimpleSAMLphp runs required and recommended prerequisites are met. If any of the lights are red, you may have to install some PHP extensions or external PHP packages (e.g. you need the PHP LDAP extension to use the LDAP authentication module). -## Building assets - -Run the following commands to build the default theme. - -```bash -npm install -npm run build -``` - ## Next steps You have now successfully installed SimpleSAMLphp, and the next steps depend on whether you want to setup a Service @@ -378,9 +381,9 @@ There may be several reasons why you want to install SimpleSAMLphp in an alterna The SimpleSAMLphp package contains one folder named `simplesamlphp-x.y.z` (where `x.y.z` is the version number). In this folder there are a lot of subfolders for library, metadata, configuration, etc. One of these folders is named -`www`. **Only this folder should be exposed on the web**. The recommended configuration is to put the whole -`simplesamlphp` folder outside the web root, and then link to the `www` folder by using the `Alias` directive, as -described in [the section called “Configuring Apache”](#section_4 "Configuring Apache"). This is not the only +`public`. **Only this folder should be exposed on the web**. The recommended configuration is to put the whole +`simplesamlphp` folder outside the web root, and then link to the `public` folder by using the `Alias` directive, as +described in [the section called “Configuring Apache”](simplesamlphp-install#configuring-apache). This is not the only possible way, though. As an example, let's see how you can install SimpleSAMLphp in your home directory on a shared hosting server. @@ -397,7 +400,7 @@ As an example, let's see how you can install SimpleSAMLphp in your home director ```bash cd ~/public_html - ln -s ../simplesamlphp/www simplesaml + ln -s ../simplesamlphp/public simplesaml ``` 3. Next, you need to set the `baseurlpath` configuration option with the URL pointing to the `simplesaml` link you @@ -405,7 +408,7 @@ As an example, let's see how you can install SimpleSAMLphp in your home director `https://host.example/~myaccount/`, set the base URL path accordingly: ```bash - 'baseurlpath' => 'https://host.example/~myaccount/simplesaml/', + 'baseurlpath' => 'https://host.example/~myaccount/simplesaml/', ``` Now, you can go to the URL of your installation and check if things work: @@ -415,18 +418,18 @@ As an example, let's see how you can install SimpleSAMLphp in your home director ### Tip Symlinking may fail, because some Apache configurations do not allow you to link to files from outside the -`public_html` folder. If so, you can move the `www` folder instead of symlinking it: +`public_html` folder. If so, you can move the `public` folder instead of symlinking it: ```bash cd ~/public_html -mv ../simplesamlphp/www simplesaml +mv ../simplesamlphp/public simplesaml ``` Now you have the following directory structure. * `~/simplesamlphp` -* `~/public_html/simplesaml` where `simplesaml` is the `www` directory from the `simplesamlphp` installation directory, +* `~/public_html/simplesaml` where `simplesaml` is the `public` directory from the `simplesamlphp` installation directory, either moved or a symlink. Now, we need to make a few configuration changes. First, let's edit `~/public_html/simplesaml/_include.php`: @@ -434,15 +437,15 @@ Now, we need to make a few configuration changes. First, let's edit `~/public_ht Change the two lines from: ```php -require_once(dirname(dirname(__FILE__)) . '/lib/_autoload.php'); +require_once(dirname(_FILE__, 2) . '/lib/_autoload.php'); ``` to something like: -```bash -require_once(dirname(dirname(dirname(__FILE__))) . '/lib/_autoload.php'); +```php +require_once(dirname(__FILE__, 3) . '/lib/_autoload.php'); ``` **Warning**: note that this will make upgrading SimpleSAMLphp much more difficult, since you will need to move the -`www` directory and manually edit files every time you upgrade. It is also possible that this method does not work in +`public` directory and manually edit files every time you upgrade. It is also possible that this method does not work in future versions of SimpleSAMLphp, and therefore it is discouraged and should be used only as a last resort. diff --git a/docs/simplesamlphp-maintenance.md b/docs/simplesamlphp-maintenance.md index 8c209672f8..3259648a0f 100644 --- a/docs/simplesamlphp-maintenance.md +++ b/docs/simplesamlphp-maintenance.md @@ -1,21 +1,14 @@ # SimpleSAMLphp Maintenance - - [TOC] ## SimpleSAMLphp news and documentation Please check the following sources of information to stay up to date with regard to SimpleSAMLphp: -* [SimpleSAMLphp documentation](http://simplesamlphp.org/docs) +* [SimpleSAMLphp documentation](https://simplesamlphp.org/docs) * [SimpleSAMLphp homepage](https://simplesamlphp.org) * [SimpleSAMLphp mailing lists](https://simplesamlphp.org/lists) -* [SimpleSAMLphp in twitter](https://twitter.com/simplesamlphp) ## Session management @@ -55,7 +48,7 @@ SimpleSAMLphp as an Identity Provider, or any other applications using it are no settings by leaving these options unset or setting them to `null`. If you need to restore your session's application after calling SimpleSAMLphp, you can do it by calling the `cleanup()` method of the -`\SimpleSAML\Session` class, like described [here](simplesamlphp-sp#section_6). +`\SimpleSAML\Session` class, like described [here](simplesamlphp-sp#integrating-authentication-with-your-own-application). ### Configuring memcache @@ -205,7 +198,7 @@ Configure your master group by setting `store.redis.mastergroup` (`mymaster` by ## Metadata storage -Several metadata storage backends are available by default, including `flatfile`, `serialize`, `mdq` and +Several metadata storage backends are available by default, including `flatfile`, `directory`, `serialize`, `mdq` and [`pdo`](https://simplesamlphp.org/docs/stable/simplesamlphp-metadata-pdostoragehandler). Here you have an example configuration of different metadata sources in use at the same time: @@ -214,17 +207,26 @@ example configuration of different metadata sources in use at the same time: ['type' => 'flatfile'], ['type' => 'flatfile', 'directory' => 'metadata/metarefresh-kalmar'], ['type' => 'serialize', 'directory' => 'metadata/metarefresh-ukaccess'], + ['type' => 'directory'], + ['type' => 'directory', 'directory' => 'metadata/somewhere-else'], ], ``` +The directory type storage backend will look in subdirectories such as +saml20-idp-hosted.d and saml20-sp-remote.d in the given directory (or +the 'metadatadir' configuration option in 'config.php' by default). +All xml and php files found in those subdirectories will be loaded. It is +currently an error to have subdirectories inside the +saml20-sp-remote.d directories. + You may also implement your own metadata storage handler, in a very similar way to how you would implement your own session handler. Your class **must** extend the `\SimpleSAML\Metadata\MetaDataStorageSource` class and override the methods needed to change the backend used. This class **must** also be located in the -`lib/MetadataStore/` directory of your custom module. +`src/MetadataStore/` directory of your custom module. -Bear in mind that **your class name must follow the PSR-0 autoloading standard**. This means it needs to be -named in a particular way, with the use of namespaces being the preferred convention. For example, if your -module is named `mymodule` and your class is named `MyMetadataHandler`, you should define it like this: +Bear in mind that **your class name must follow the PSR-4 autoloading standard**. This means it needs to be +properly namespaced. For example, if your module is named `mymodule` and your class is named `MyMetadataHandler`, +you should define it like this: ```php 'https://sp.example.org/ACS', - -This is the simplest endpoint format. -It can be used when there is only a single endpoint that uses the default binding. - -Array of strings ----------------- - - 'AssertionConsumerService' => [ - 'https://site1.example.org/ACS', - 'https://site2.example.org/ACS', - ], - -This endpoint format can be used to represent multiple endpoints, all of which use the default binding. - -Array of arrays ---------------- +The various endpoints can be specified in the following format: 'AssertionConsumerService' => [ [ diff --git a/docs/simplesamlphp-metadata-extensions-attributes.md b/docs/simplesamlphp-metadata-extensions-attributes.md index 4e75bbd3b3..82a9fa0599 100644 --- a/docs/simplesamlphp-metadata-extensions-attributes.md +++ b/docs/simplesamlphp-metadata-extensions-attributes.md @@ -111,7 +111,7 @@ entity category support for a service provider in `authsources.php`: ... 'EntityAttributes' => [ 'http://macedir.org/entity-category' => [ - '{urn:oasis:names:tc:SAML:2.0:attrname-format:uri}http://www.geant.net/uri/dataprotection-code-of-conduct/v1' + 'http://www.geant.net/uri/dataprotection-code-of-conduct/v1' ] ], 'UIInfo' =>[ diff --git a/docs/simplesamlphp-metadata-extensions-idpdisc.md b/docs/simplesamlphp-metadata-extensions-idpdisc.md new file mode 100644 index 0000000000..b2d1bee945 --- /dev/null +++ b/docs/simplesamlphp-metadata-extensions-idpdisc.md @@ -0,0 +1,47 @@ +SAML V2.0 Metadata Extensions for Identity Provider Discovery Service Protocol and Profile +============================= + +[TOC] + +This is a reference for the SimpleSAMLphp implementation of the [SAML +V2.0 Metadata Extensions for Identity Provider Discovery Service Protocol and Profile](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-idp-discovery.pdf) +defined by OASIS. + +The metadata extension is available to SP usage of SimpleSAMLphp. The entries are placed inside the relevant +entry in `authsources.php`. + +An example: + + [ + 'saml:SP', + + 'DiscoveryResponse' => [ + [ + 'index' => 1, + 'Binding' => 'urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol', + 'Location' => 'https://simplesamlphp.org/some/endpoint', + 'isDefault' => true, + ], + ], + /* ... */ + ], + ]; + +Generated XML Metadata Examples +---------------- + +The example given above will generate the following XML metadata: + + + + + + + + + + + ... diff --git a/docs/simplesamlphp-metadata-extensions-rpi.md b/docs/simplesamlphp-metadata-extensions-rpi.md index bf136709e5..148e53f4fe 100644 --- a/docs/simplesamlphp-metadata-extensions-rpi.md +++ b/docs/simplesamlphp-metadata-extensions-rpi.md @@ -1,14 +1,6 @@ SAML V2.0 Metadata Extensions for Registration and Publication Information ============================= - - -* Author: Jaime Perez [jaime.perez@uninett.no](mailto:jaime.perez@uninett.no) - [TOC] This is a reference for the SimpleSAMLphp implementation of the [SAML @@ -21,7 +13,7 @@ extension can be used for: * metadata published for a [hosted service provider](./saml:sp). * metadata published for a [hosted identity provider](./simplesamlphp-reference-idp-hosted). -* metadata collected and published by means of the [`aggregator`](./aggregator:aggregator) or [`aggregator2`](./aggregator2:aggregator2) modules. +* metadata collected and published by means of the [`aggregator2`](./aggregator2:aggregator2) module. Currently, only the `` element is supported. @@ -30,7 +22,6 @@ configuration file: * `metadata/saml20-idp-hosted.php` for hosted identity providers. * `config/authsources.php` for hosted service providers. -* `config/module_aggregator.php` for the `aggregator` module. * `config/module_aggregator2.php` for the `aggregator2` module. RegistrationInfo Items @@ -80,22 +71,6 @@ Identity Provider: ], ]; -`aggregator` module: - - $config = [ - 'aggregators' => [ - ... - ], - 'maxDuration' => 60*60*24*5, - 'reconstruct' => FALSE, - ... - 'RegistrationInfo' => [ - 'authority' => 'urn:mace:example.federation', - 'instant' => '2008-01-17T11:28:03Z', - 'policies' => ['en' => 'http://example.org/federation_policy', 'es' => 'https://example.org/politica_federacion'], - ], - ]; - `aggregator2` module: $config = [ diff --git a/docs/simplesamlphp-modules.md b/docs/simplesamlphp-modules.md index c302b530d8..1271b0ee46 100644 --- a/docs/simplesamlphp-modules.md +++ b/docs/simplesamlphp-modules.md @@ -60,25 +60,25 @@ hooks file in this directory represents a single function. See the hook-section in the documentation for more information. -lib +src : This directory contains classes which belong to this module. All classes must be named in the following pattern: `\SimpleSAML\Module\\` When looking up the filename of - a class, SimpleSAMLphp will search for `` in the `lib` + a class, SimpleSAMLphp will search for `` in the `src` directory. Underscores in the class name will be translated into slashes. : Thus, if SimpleSAMLphp needs to load a class named `\SimpleSAML\Module\example\Auth\Source\Example`, it will load the file named - `modules/example/lib/Auth/Source/Example.php`. + `modules/example/src/Auth/Source/Example.php`. templates : These are module-specific templates. To use one of these - templates, specify `: