From 7c640a7a14a0d55602ecf5425a216bf1adf46ddb Mon Sep 17 00:00:00 2001 From: Valentin Date: Tue, 4 Jun 2024 13:16:42 +0200 Subject: [PATCH] =?UTF-8?q?corrections=20de=20probl=C3=A8mes=20de=20liens?= =?UTF-8?q?=20inter=20articles=20et=20de=20display=20du=20about?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yaml | 79 ---- .github/workflows/tests.yaml | 76 ---- .github/workflows/trigger-skeletons.yml | 48 --- CHANGELOG.md | 27 ++ SECURITY.md | 17 +- bin/composer.phar | Bin 2862107 -> 2977479 bytes composer.lock | 357 +++++++++--------- system/blueprints/config/system.yaml | 11 + system/config/system.yaml | 1 + system/defines.php | 6 +- system/languages/sr.yaml | 3 + system/src/Grav/Common/Backup/Backups.php | 2 +- system/src/Grav/Common/Inflector.php | 16 +- .../Media/Traits/ImageDecodingTrait.php | 40 ++ .../Common/Media/Traits/MediaUploadTrait.php | 2 +- .../Grav/Common/Page/Medium/ImageMedium.php | 2 + system/src/Grav/Common/Security.php | 23 +- system/src/Grav/Common/Taxonomy.php | 25 +- system/src/Grav/Common/Twig/Twig.php | 11 +- system/src/Grav/Common/Uri.php | 9 +- system/src/Grav/Common/Utils.php | 8 +- .../DeferredExtension/DeferredBlockNode.php | 0 .../Twig/DeferredExtension/DeferredNode.php | 0 user/config/system.yaml | 5 +- .../ateliers-55/templates/default.html.twig | 9 +- .../templates/partials/about.html.twig | 2 +- .../partials/articles-list.html.twig | 2 +- 27 files changed, 356 insertions(+), 425 deletions(-) delete mode 100644 .github/workflows/build.yaml delete mode 100644 .github/workflows/tests.yaml delete mode 100644 .github/workflows/trigger-skeletons.yml create mode 100644 system/src/Grav/Common/Media/Traits/ImageDecodingTrait.php mode change 100755 => 100644 system/src/Twig/DeferredExtension/DeferredBlockNode.php mode change 100755 => 100644 system/src/Twig/DeferredExtension/DeferredNode.php diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index d21bea1..0000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: Release Builds - -on: - release: - types: [published] - -permissions: {} - -jobs: - build: - permissions: - contents: write # for release creation (svenstaro/upload-release-action) - - if: "!github.event.release.prerelease" - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: Extract Tag - run: echo "PACKAGE_VERSION=${{ github.ref }}" >> $GITHUB_ENV - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.3 - extensions: opcache, gd - tools: composer:v2 - coverage: none - env: - COMPOSER_TOKEN: ${{ secrets.GLOBAL_TOKEN }} - - - name: Install Dependencies - run: | - sudo apt-get -y update -qq < /dev/null > /dev/null - sudo apt-get -y install -qq git zip < /dev/null > /dev/null - - - name: Retrieval of Builder Scripts - run: | - # Real Grav URL - curl --silent -H "Authorization: token ${{ secrets.GLOBAL_TOKEN }}" -H "Accept: application/vnd.github.v3.raw" ${{ secrets.BUILD_SCRIPT_URL }} --output build-grav.sh - - # Development Local URL - # curl ${{ secrets.BUILD_SCRIPT_URL }} --output build-grav.sh - - - name: Grav Builder - run: | - bash ./build-grav.sh - - - name: Upload packages to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ env.PACKAGE_VERSION }} - file: ./grav-dist/*.zip - overwrite: true - file_glob: true - - slack: - permissions: - actions: read # to list jobs for workflow run (technote-space/workflow-conclusion-action) - - name: Slack - needs: build - runs-on: ubuntu-latest - if: always() - steps: - - uses: technote-space/workflow-conclusion-action@v2 - - uses: 8398a7/action-slack@v3 - with: - status: failure - fields: repo,message,author,action - icon_emoji: ':octocat:' - author_name: 'Github Action Build' - text: '🚚 Automated Build Failure' - env: - GITHUB_TOKEN: ${{ secrets.GLOBAL_TOKEN }} - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - if: env.WORKFLOW_CONCLUSION == 'failure' diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml deleted file mode 100644 index 57101de..0000000 --- a/.github/workflows/tests.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: PHP Tests - -on: - push: - branches: [ develop ] - pull_request: - branches: [ develop ] - -permissions: - contents: read # to fetch code (actions/checkout) - -jobs: - - unit-tests: - - runs-on: ${{ matrix.os }} - - strategy: - matrix: - php: [8.3, 8.2, 8.1, 8.0, 7.4, 7.3] - os: [ubuntu-latest] - - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - extensions: opcache, gd - tools: composer:v2 - coverage: none - env: - COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} - -# - name: Update composer -# run: composer update -# -# - name: Validate composer.json and composer.lock -# run: composer validate - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install dependencies - run: composer install --prefer-dist --no-progress - - - name: Run test suite - run: vendor/bin/codecept run - -# slack: -# name: Slack -# needs: unit-tests -# runs-on: ubuntu-latest -# if: always() -# steps: -# - uses: technote-space/workflow-conclusion-action@v2 -# - uses: 8398a7/action-slack@v3 -# with: -# status: failure -# fields: repo,message,author,action -# icon_emoji: ':octocat:' -# author_name: 'Github Action Tests' -# text: '💥 Automated Test Failure' -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} -# if: env.WORKFLOW_CONCLUSION == 'failure' diff --git a/.github/workflows/trigger-skeletons.yml b/.github/workflows/trigger-skeletons.yml deleted file mode 100644 index b42b963..0000000 --- a/.github/workflows/trigger-skeletons.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Trigger Skeletons Build - -on: - workflow_dispatch: - inputs: - version: - description: 'Which Grav release to use' - required: true - default: 'latest' - admin: - description: 'Create also a package with Admin' - required: true - default: true - -permissions: - contents: read # to fetch code (actions/checkout) - -jobs: - build: - runs-on: ubuntu-latest - env: - WORKFLOW: "build-skeleton.yml" - AUTH: ":${{secrets.GLOBAL_TOKEN}}" - steps: - - uses: actions/checkout@v2 - - name: Make it rain ☔️ - run: | - SKELETONS=`curl -s "${{secrets.SKELETONS_JSON_LIST}}"` - echo "$SKELETONS" | jq -cr '.[]' | while read SKELETON; do - KEY=$(echo "$SKELETON" | jq -cr 'keys[0]') - VERSION=$(echo "$SKELETON" | jq -cr '.[]') - URL="https://api.github.com/repos/${KEY}/actions/workflows/${WORKFLOW}/dispatches" - - curl -X POST \ - -u "${AUTH}" \ - -H "Accept: application/vnd.github.everest-preview+json" \ - -H "Content-Type: application/json" \ - -sS \ - ${URL} \ - --data '{ "ref": "develop", - "inputs": { - "tag": "'"$VERSION"'", - "version": "'"$INPUT_VERSION"'", - "admin": "'"$INPUT_ADMIN"'" - } - }' > /dev/null - echo "Dispatched Worfklow for ${KEY}@$VERSION" - done diff --git a/CHANGELOG.md b/CHANGELOG.md index 4994d6a..2989e72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +# v1.7.46 +## 05/15/2024 + +1. [](#improved) + * Better handling of external protocols in `Utils::url()` such as `mailto:`, `tel:`, etc. + * Handle `GRAV_ROOT` or `GRAV_WEBROOT` when `/` [#3667](https://github.com/getgrav/grav/pull/3667) +1. [](#bugfix) + * Fixes for multi-lang taxonomy when reinitializing the languages (e.g. LangSwitcher plugin) + * Ensure the full filepath is checked for invalid filename in `MediaUploadTrait::checkFileMetadata()` + * Fixed a bug in the `on_events` REGEX pattern of `Security::detectXss()` as it was not matching correctly. + * Fixed an issue where `read_file()` Twig function could be used nefariously in content [#GHSA-f8v5-jmfh-pr69](https://github.com/getgrav/grav/security/advisories/GHSA-f8v5-jmfh-pr69) + +# v1.7.45 +## 03/18/2024 + +1. [](#new) + * Added new Image trait for `decoding` attribute [#3796](https://github.com/getgrav/grav/pull/3796) +1. [](#bugfix) + * Fixed some multibyte issues in Inflector class [#732](https://github.com/getgrav/grav/issues/732) + * Fallback to page modified date if Page date provided is invalid and can't be parsed [getgrav/grav-plugin-admin#2394](https://github.com/getgrav/grav-plugin-admin/issues/2394) + * Fixed a path traversal vulnerability with file uploads [#GHSA-m7hx-hw6h-mqmc](https://github.com/getgrav/grav/security/advisories/GHSA-m7hx-hw6h-mqmc) + * Fixed a security issue with insecure Twig functions be processed [#GHSA-2m7x-c7px-hp58](https://github.com/getgrav/grav/security/advisories/GHSA-2m7x-c7px-hp58) [#GHSA-r6vw-8v8r-pmp4](https://github.com/getgrav/grav/security/advisories/GHSA-r6vw-8v8r-pmp4) [#GHSA-qfv4-q44r-g7rv](https://github.com/getgrav/grav/security/advisories/GHSA-qfv4-q44r-g7rv) [#GHSA-c9gp-64c4-2rrh](https://github.com/getgrav/grav/security/advisories/GHSA-c9gp-64c4-2rrh) +1. [](#improved) + * Updated composer packages + * Updated `bin/composer.phar` to latest `2.7.2` + # v1.7.44 ## 01/05/2024 @@ -103,6 +129,7 @@ 1. [](#improved) * Removed outdated `xcache` setting [#3615](https://github.com/getgrav/grav/pull/3615) * Updated `robots.txt` [#3625](https://github.com/getgrav/grav/pull/3625) + * Handle the situation when GRAV_ROOT or GRAV_WEBROOT are `/` [#3625](https://github.com/getgrav/grav/pull/3667) 1. [](#bugfix) * Fixed `force_ssl` redirect in case of undefined hostname [#3702](https://github.com/getgrav/grav/pull/3702) * Fixed an issue with duplicate identical page paths diff --git a/SECURITY.md b/SECURITY.md index ffe8f79..e8d4a16 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,22 +7,31 @@ We are focusing our security updates on the following versions | Version | Supported | | ------- | ------------------ | | 1.7.x | :white_check_mark: | -| 1.6.x | :warning: | +| 1.6.x | :x: | | < 1.6 | :x: | +## :pushpin: Note on Security Severity + +> NOTE: Please use the following guidlines when selecting a **Severity**. Submitted advisories that are marked **High** or **Critical** that don't meet the guidelines below will be cliosed. + +* **CRITICAL** - no account required, can modify content, or run malicious code or nefarious activity without any access. +* **HIGH** - publisher level account able to run malicious code or nefarious activity, or other high level security things. +* **MODERATE** - admin level account able to run malicious code or do nefarious things. other moderate security things. +* **LOW** - super admin level account able to run malicious code or do nefarious things. other minor security things. + ## :warning: Versions Versions with :warning: will be supported for security issues, however you won't be able to update to them, you will need to manually update through the [`direct-install` command](https://learn.getgrav.org/17/admin-panel/tools). If you cannot update to the latest stable version available because, for example, your server does not meet the minimum PHP requirements, you can manually install a previous version by downloading the package from our Releases directory (https://github.com/getgrav/grav/releases). -## Reporting a Vulnerability +## :pencil: Reporting a Vulnerability Please contact security@getgrav.org with a detailed explanation of the security issue found. If it appears to be a legitimate issues, please submit an **advisory via GitHub Security**: https://github.com/getgrav/grav/security/advisories ->> NOTE: Please do not use 3rd party security issue reporting services, we like to keep everything in the GitHub ecosystem for easier manageability. +> NOTE: Please do not use 3rd party security issue reporting services, we like to keep everything in the GitHub ecosystem for easier manageability. -## Bug Bounties +## :bug: Bug Bounties We do greatly appreciate your efforts to improve Grav, but unfortunately because we are a small open source project, we **do not have the resources to offer bounties** for security issues found. diff --git a/bin/composer.phar b/bin/composer.phar index 4723b1b33da03741330470031e50fcb51c7c2cce..e6ba7bbadc93b5fc256ac8a80023ae73deacb942 100755 GIT binary patch delta 83149 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 delta 20415 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.6" }, + "suggest": { + "ext-pdo": "Needed in order to use a SQL database for metadata storage", + "ext-pdo_mysql": "Needed in order to use MySQL for metadata storage", + "ext-pdo_postgres": "Needed in order to use Postgres for metadata storage", + "ext-pdo_sqlite": "Needed in order to use a SQLite for metadata storage", + "ext-redis": "Needed in order to use Redis for metadata storage" + }, "type": "library", "extra": { "laravel": { @@ -945,7 +952,7 @@ ], "support": { "issues": "https://github.com/itsgoingd/clockwork/issues", - "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.12" + "source": "https://github.com/itsgoingd/clockwork/tree/v5.2.0" }, "funding": [ { @@ -953,7 +960,7 @@ "type": "github" } ], - "time": "2022-12-13T00:04:12+00:00" + "time": "2024-02-20T22:36:44+00:00" }, { "name": "league/climate", @@ -1022,16 +1029,16 @@ }, { "name": "matthiasmullie/minify", - "version": "1.3.71", + "version": "1.3.73", "source": { "type": "git", "url": "https://github.com/matthiasmullie/minify.git", - "reference": "ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1" + "reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1", - "reference": "ae42a47d7fecc1fbb7277b2f2d84c37a33edc3b1", + "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/cb7a9297b4ab070909cefade30ee95054d4ae87a", + "reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a", "shasum": "" }, "require": { @@ -1081,7 +1088,7 @@ ], "support": { "issues": "https://github.com/matthiasmullie/minify/issues", - "source": "https://github.com/matthiasmullie/minify/tree/1.3.71" + "source": "https://github.com/matthiasmullie/minify/tree/1.3.73" }, "funding": [ { @@ -1089,7 +1096,7 @@ "type": "github" } ], - "time": "2023-04-25T20:33:03+00:00" + "time": "2024-03-15T10:27:10+00:00" }, { "name": "matthiasmullie/path-converter", @@ -1146,22 +1153,22 @@ }, { "name": "maximebf/debugbar", - "version": "v1.19.1", + "version": "v1.21.3", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523" + "reference": "0b407703b08ea0cf6ebc61e267cc96ff7000911b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/03dd40a1826f4d585ef93ef83afa2a9874a00523", - "reference": "03dd40a1826f4d585ef93ef83afa2a9874a00523", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0b407703b08ea0cf6ebc61e267cc96ff7000911b", + "reference": "0b407703b08ea0cf6ebc61e267cc96ff7000911b", "shasum": "" }, "require": { "php": "^7.1|^8", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4|^5|^6" + "symfony/var-dumper": "^4|^5|^6|^7" }, "require-dev": { "phpunit/phpunit": ">=7.5.20 <10.0", @@ -1175,7 +1182,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-master": "1.21-dev" } }, "autoload": { @@ -1206,9 +1213,9 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.19.1" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.21.3" }, - "time": "2023-10-12T08:10:52+00:00" + "time": "2024-03-12T14:23:07+00:00" }, { "name": "miljar/php-exif", @@ -2569,16 +2576,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -2592,9 +2599,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2631,7 +2635,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -2647,20 +2651,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1" + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1", - "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "shasum": "" }, "require": { @@ -2674,9 +2678,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2714,7 +2715,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0" }, "funding": [ { @@ -2730,20 +2731,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -2757,9 +2758,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2797,7 +2795,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -2813,20 +2811,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php74", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php74.git", - "reference": "8b755b41a155c89f1af29cc33305538499fa05ea" + "reference": "da301202eb63b838aed1e62134e2302f826ca600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php74/zipball/8b755b41a155c89f1af29cc33305538499fa05ea", - "reference": "8b755b41a155c89f1af29cc33305538499fa05ea", + "url": "https://api.github.com/repos/symfony/polyfill-php74/zipball/da301202eb63b838aed1e62134e2302f826ca600", + "reference": "da301202eb63b838aed1e62134e2302f826ca600", "shasum": "" }, "require": { @@ -2834,9 +2832,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2877,7 +2872,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php74/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php74/tree/v1.29.0" }, "funding": [ { @@ -2893,20 +2888,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -2914,9 +2909,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2960,7 +2952,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -2976,20 +2968,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -2997,9 +2989,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3039,7 +3028,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -3055,7 +3044,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", @@ -4282,21 +4271,21 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -4332,26 +4321,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-17T08:10:35+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", @@ -4392,9 +4382,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", @@ -4449,16 +4445,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.52", + "version": "1.10.63", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "0cd0c330081d4f1e1d630701fe4f342c3b659685" + "reference": "ad12836d9ca227301f5fb9960979574ed8628339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0cd0c330081d4f1e1d630701fe4f342c3b659685", - "reference": "0cd0c330081d4f1e1d630701fe4f342c3b659685", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339", + "reference": "ad12836d9ca227301f5fb9960979574ed8628339", "shasum": "" }, "require": { @@ -4507,7 +4503,7 @@ "type": "tidelift" } ], - "time": "2024-01-05T09:51:32+00:00" + "time": "2024-03-18T16:53:53+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -4559,16 +4555,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.30", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { @@ -4625,7 +4621,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "funding": [ { @@ -4633,7 +4629,7 @@ "type": "github" } ], - "time": "2023-12-22T06:47:57+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4878,16 +4874,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.15", + "version": "9.6.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" + "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1a156980d78a6666721b7e8e8502fe210b587fcd", + "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd", "shasum": "" }, "require": { @@ -4961,7 +4957,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.17" }, "funding": [ { @@ -4977,7 +4973,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T16:55:19+00:00" + "time": "2024-02-23T13:14:51+00:00" }, { "name": "psr/http-client", @@ -5033,16 +5029,16 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "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/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -5077,7 +5073,7 @@ "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" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -5085,7 +5081,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -5331,16 +5327,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -5385,7 +5381,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -5393,7 +5389,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -5460,16 +5456,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -5525,7 +5521,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -5533,20 +5529,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -5589,7 +5585,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -5597,7 +5593,7 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", @@ -5833,16 +5829,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -5854,7 +5850,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -5875,8 +5871,7 @@ "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" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -5884,7 +5879,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -5997,16 +5992,16 @@ }, { "name": "symfony/browser-kit", - "version": "v5.4.31", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "0ed1f634a36606f2065eec221b3975e05016cbbe" + "reference": "2f6f979b579ed1c051465c3c2fb81daf5bb4a002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/0ed1f634a36606f2065eec221b3975e05016cbbe", - "reference": "0ed1f634a36606f2065eec221b3975e05016cbbe", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/2f6f979b579ed1c051465c3c2fb81daf5bb4a002", + "reference": "2f6f979b579ed1c051465c3c2fb81daf5bb4a002", "shasum": "" }, "require": { @@ -6049,7 +6044,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.4.31" + "source": "https://github.com/symfony/browser-kit/tree/v5.4.35" }, "funding": [ { @@ -6065,20 +6060,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T07:58:33+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a" + "reference": "9e615d367e2bed41f633abb383948c96a2dbbfae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", - "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/9e615d367e2bed41f633abb383948c96a2dbbfae", + "reference": "9e615d367e2bed41f633abb383948c96a2dbbfae", "shasum": "" }, "require": { @@ -6115,7 +6110,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.26" + "source": "https://github.com/symfony/css-selector/tree/v5.4.35" }, "funding": [ { @@ -6131,7 +6126,7 @@ "type": "tidelift" } ], - "time": "2023-07-07T06:10:25+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6202,16 +6197,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v5.4.32", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "728f1fc136252a626ba5a69c02bd66a3697ff201" + "reference": "e3b4806f88abf106a411847a78619a542e71de29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/728f1fc136252a626ba5a69c02bd66a3697ff201", - "reference": "728f1fc136252a626ba5a69c02bd66a3697ff201", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/e3b4806f88abf106a411847a78619a542e71de29", + "reference": "e3b4806f88abf106a411847a78619a542e71de29", "shasum": "" }, "require": { @@ -6257,7 +6252,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.4.32" + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.35" }, "funding": [ { @@ -6273,20 +6268,20 @@ "type": "tidelift" } ], - "time": "2023-11-17T20:43:48+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/finder", - "version": "v5.4.27", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", "shasum": "" }, "require": { @@ -6320,7 +6315,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.27" + "source": "https://github.com/symfony/finder/tree/v5.4.35" }, "funding": [ { @@ -6336,20 +6331,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:02:31+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -6378,7 +6373,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -6386,7 +6381,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index 1fb67d1..b0ad371 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -1300,6 +1300,17 @@ form: auto: Auto lazy: Lazy eager: Eager + + images.defaults.decoding: + type: select + size: small + label: PLUGIN_ADMIN.IMAGES_DECODING + help: PLUGIN_ADMIN.IMAGES_DECODING_HELP + highlight: auto + options: + auto: Auto + sync: Sync + async: Async images.seofriendly: type: toggle diff --git a/system/config/system.yaml b/system/config/system.yaml index 8bcc280..3495c44 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -168,6 +168,7 @@ images: retina_scale: 1 # scale to adjust auto-sizes for better handling of HiDPI resolutions defaults: loading: auto # Let browser pick [auto|lazy|eager] + decoding: auto # Let browser pick [auto|sync|async] watermark: image: 'system://images/watermark.png' # Path to a watermark image position_y: 'center' # top|center|bottom diff --git a/system/defines.php b/system/defines.php index deb7f73..f090bde 100644 --- a/system/defines.php +++ b/system/defines.php @@ -9,7 +9,7 @@ // Some standard defines define('GRAV', true); -define('GRAV_VERSION', '1.7.44'); +define('GRAV_VERSION', '1.7.46'); define('GRAV_SCHEMA', '1.7.0_2020-11-20_1'); define('GRAV_TESTING', false); @@ -26,12 +26,12 @@ if (!defined('DS')) { // Absolute path to Grav root. This is where Grav is installed into. if (!defined('GRAV_ROOT')) { $path = rtrim(str_replace(DIRECTORY_SEPARATOR, DS, getenv('GRAV_ROOT') ?: getcwd()), DS); - define('GRAV_ROOT', $path); + define('GRAV_ROOT', $path ?: DS); } // Absolute path to Grav webroot. This is the path where your site is located in. if (!defined('GRAV_WEBROOT')) { $path = rtrim(getenv('GRAV_WEBROOT') ?: GRAV_ROOT, DS); - define('GRAV_WEBROOT', $path); + define('GRAV_WEBROOT', $path ?: DS); } // Relative path to user folder. This path needs to be located under GRAV_WEBROOT. if (!defined('GRAV_USER_PATH')) { diff --git a/system/languages/sr.yaml b/system/languages/sr.yaml index 3368bdf..498d182 100644 --- a/system/languages/sr.yaml +++ b/system/languages/sr.yaml @@ -104,6 +104,7 @@ GRAV: VALIDATION_FAIL: 'Провера неуспела:' INVALID_INPUT: 'Неисправан унос у' MISSING_REQUIRED_FIELD: 'Недостаје обавезн поље:' + XSS_ISSUES: "Потенцијална грешка у XSS-у детектована у пољу '%s' " MONTHS_OF_THE_YEAR: - 'Јануар' - 'Фебруар' @@ -125,6 +126,8 @@ GRAV: - 'Петак' - 'Субота' - 'Недеља' + YES: "Да" + NO: "Не" CRON: EVERY: сваки EVERY_HOUR: сваки сат diff --git a/system/src/Grav/Common/Backup/Backups.php b/system/src/Grav/Common/Backup/Backups.php index 5114634..dd2cf37 100644 --- a/system/src/Grav/Common/Backup/Backups.php +++ b/system/src/Grav/Common/Backup/Backups.php @@ -218,7 +218,7 @@ class Backups if ($locator->isStream($backup_root)) { $backup_root = $locator->findResource($backup_root); } else { - $backup_root = rtrim(GRAV_ROOT . $backup_root, '/'); + $backup_root = rtrim(GRAV_ROOT . $backup_root, DS) ?: DS; } if (!$backup_root || !file_exists($backup_root)) { diff --git a/system/src/Grav/Common/Inflector.php b/system/src/Grav/Common/Inflector.php index ed64951..284b8dd 100644 --- a/system/src/Grav/Common/Inflector.php +++ b/system/src/Grav/Common/Inflector.php @@ -161,9 +161,15 @@ class Inflector */ public static function titleize($word, $uppercase = '') { - $uppercase = $uppercase === 'first' ? 'ucfirst' : 'ucwords'; + $humanize_underscorize = static::humanize(static::underscorize($word)); + + if ($uppercase === 'first') { + $firstLetter = mb_strtoupper(mb_substr($humanize_underscorize, 0, 1, "UTF-8"), "UTF-8"); + return $firstLetter . mb_substr($humanize_underscorize, 1, mb_strlen($humanize_underscorize, "UTF-8"), "UTF-8"); + } else { + return mb_convert_case($humanize_underscorize, MB_CASE_TITLE, 'UTF-8'); + } - return $uppercase(static::humanize(static::underscorize($word))); } /** @@ -180,7 +186,7 @@ class Inflector */ public static function camelize($word) { - return str_replace(' ', '', ucwords(preg_replace('/[^A-Z^a-z^0-9]+/', ' ', $word))); + return str_replace(' ', '', ucwords(preg_replace('/[^\p{L}^0-9]+/', ' ', $word))); } /** @@ -198,7 +204,7 @@ class Inflector { $regex1 = preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2', $word); $regex2 = preg_replace('/([a-zd])([A-Z])/', '\1_\2', $regex1); - $regex3 = preg_replace('/[^A-Z^a-z^0-9]+/', '_', $regex2); + $regex3 = preg_replace('/[^\p{L}^0-9]+/u', '_', $regex2); return strtolower($regex3); } @@ -219,7 +225,7 @@ class Inflector $regex1 = preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1-\2', $word); $regex2 = preg_replace('/([a-z])([A-Z])/', '\1-\2', $regex1); $regex3 = preg_replace('/([0-9])([A-Z])/', '\1-\2', $regex2); - $regex4 = preg_replace('/[^A-Z^a-z^0-9]+/', '-', $regex3); + $regex4 = preg_replace('/[^\p{L}^0-9]+/', '-', $regex3); $regex4 = trim($regex4, '-'); diff --git a/system/src/Grav/Common/Media/Traits/ImageDecodingTrait.php b/system/src/Grav/Common/Media/Traits/ImageDecodingTrait.php new file mode 100644 index 0000000..7ea01e9 --- /dev/null +++ b/system/src/Grav/Common/Media/Traits/ImageDecodingTrait.php @@ -0,0 +1,40 @@ +get('system.images.defaults.decoding', 'auto'); + } + + // Validate the provided value (similar to loading) + if ($value !== null && $value !== 'auto') { + $this->attributes['decoding'] = $value; + } + + return $this; + } + +} \ No newline at end of file diff --git a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php index 36becdf..2b1c3bb 100644 --- a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php @@ -156,7 +156,7 @@ trait MediaUploadTrait $filepath = $folder . $filename; // Check if the filename is allowed. - if (!Utils::checkFilename($filename)) { + if (!Utils::checkFilename($filepath)) { throw new RuntimeException( sprintf($this->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD'), $filepath, $this->translate('PLUGIN_ADMIN.BAD_FILENAME')) ); diff --git a/system/src/Grav/Common/Page/Medium/ImageMedium.php b/system/src/Grav/Common/Page/Medium/ImageMedium.php index 30e369b..4de211b 100644 --- a/system/src/Grav/Common/Page/Medium/ImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/ImageMedium.php @@ -15,6 +15,7 @@ use Grav\Common\Media\Interfaces\ImageManipulateInterface; use Grav\Common\Media\Interfaces\ImageMediaInterface; use Grav\Common\Media\Interfaces\MediaLinkInterface; use Grav\Common\Media\Traits\ImageLoadingTrait; +use Grav\Common\Media\Traits\ImageDecodingTrait; use Grav\Common\Media\Traits\ImageMediaTrait; use Grav\Common\Utils; use Gregwar\Image\Image; @@ -30,6 +31,7 @@ class ImageMedium extends Medium implements ImageMediaInterface, ImageManipulate { use ImageMediaTrait; use ImageLoadingTrait; + use ImageDecodingTrait; /** * @var mixed|string diff --git a/system/src/Grav/Common/Security.php b/system/src/Grav/Common/Security.php index 55bcde5..6fabf4e 100644 --- a/system/src/Grav/Common/Security.php +++ b/system/src/Grav/Common/Security.php @@ -225,7 +225,7 @@ class Security // Set the patterns we'll test against $patterns = [ // Match any attribute starting with "on" or xmlns - 'on_events' => '#(<[^>]+[[a-z\x00-\x20\"\'\/])([\s\/]on|\sxmlns)[a-z].*=>?#iUu', + 'on_events' => '#(<[^>]+[a-z\x00-\x20\"\'\/])(on[a-z]+|xmlns)\s*=[\s|\'\"].*[\s|\'\"]>#iUu', // Match javascript:, livescript:, vbscript:, mocha:, feed: and data: protocols 'invalid_protocols' => '#(' . implode('|', array_map('preg_quote', $invalid_protocols, ['#'])) . ')(:|\&\#58)\S.*?#iUu', @@ -263,4 +263,25 @@ class Security 'invalid_protocols' => array_map('trim', $config->get('security.xss_invalid_protocols')), ]; } + + public static function cleanDangerousTwig(string $string): string + { + if ($string === '') { + return $string; + } + + $bad_twig = [ + 'twig_array_map', + 'twig_array_filter', + 'call_user_func', + 'registerUndefinedFunctionCallback', + 'undefined_functions', + 'twig.getFunction', + 'core.setEscaper', + 'twig.safe_functions', + 'read_file', + ]; + $string = preg_replace('/(({{\s*|{%\s*)[^}]*?(' . implode('|', $bad_twig) . ')[^}]*?(\s*}}|\s*%}))/i', '{# $1 #}', $string); + return $string; + } } diff --git a/system/src/Grav/Common/Taxonomy.php b/system/src/Grav/Common/Taxonomy.php index d9cb930..3ce2173 100644 --- a/system/src/Grav/Common/Taxonomy.php +++ b/system/src/Grav/Common/Taxonomy.php @@ -10,6 +10,7 @@ namespace Grav\Common; use Grav\Common\Config\Config; +use Grav\Common\Language\Language; use Grav\Common\Page\Collection; use Grav\Common\Page\Interfaces\PageInterface; use function is_string; @@ -37,6 +38,8 @@ class Taxonomy protected $taxonomy_map; /** @var Grav */ protected $grav; + /** @var Language */ + protected $language; /** * Constructor that resets the map @@ -45,8 +48,9 @@ class Taxonomy */ public function __construct(Grav $grav) { - $this->taxonomy_map = []; $this->grav = $grav; + $this->language = $grav['language']; + $this->taxonomy_map[$this->language->getLanguage()] = []; } /** @@ -107,7 +111,8 @@ class Taxonomy if (!empty($key)) { $taxonomy .= $key; } - $this->taxonomy_map[$taxonomy][(string) $value][$page->path()] = ['slug' => $page->slug()]; + $active = $this->language->getLanguage(); + $this->taxonomy_map[$active][$taxonomy][(string) $value][$page->path()] = ['slug' => $page->slug()]; } } @@ -123,14 +128,11 @@ class Taxonomy { $matches = []; $results = []; + $active = $this->language->getLanguage(); foreach ((array)$taxonomies as $taxonomy => $items) { foreach ((array)$items as $item) { - if (isset($this->taxonomy_map[$taxonomy][$item])) { - $matches[] = $this->taxonomy_map[$taxonomy][$item]; - } else { - $matches[] = []; - } + $matches[] = $this->taxonomy_map[$active][$taxonomy][$item] ?? []; } } @@ -156,11 +158,13 @@ class Taxonomy */ public function taxonomy($var = null) { + $active = $this->language->getLanguage(); + if ($var) { - $this->taxonomy_map = $var; + $this->taxonomy_map[$active] = $var; } - return $this->taxonomy_map; + return $this->taxonomy_map[$active] ?? []; } /** @@ -171,6 +175,7 @@ class Taxonomy */ public function getTaxonomyItemKeys($taxonomy) { - return isset($this->taxonomy_map[$taxonomy]) ? array_keys($this->taxonomy_map[$taxonomy]) : []; + $active = $this->language->getLanguage(); + return isset($this->taxonomy_map[$active][$taxonomy]) ? array_keys($this->taxonomy_map[$active][$taxonomy]) : []; } } diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php index 14f33f0..6e50916 100644 --- a/system/src/Grav/Common/Twig/Twig.php +++ b/system/src/Grav/Common/Twig/Twig.php @@ -16,6 +16,7 @@ use Grav\Common\Language\Language; use Grav\Common\Language\LanguageCodes; use Grav\Common\Page\Interfaces\PageInterface; use Grav\Common\Page\Pages; +use Grav\Common\Security; use Grav\Common\Twig\Exception\TwigException; use Grav\Common\Twig\Extension\FilesystemExtension; use Grav\Common\Twig\Extension\GravExtension; @@ -319,6 +320,7 @@ class Twig public function processPage(PageInterface $item, $content = null) { $content = $content ?? $item->content(); + $content = Security::cleanDangerousTwig($content); // override the twig header vars for local resolution $this->grav->fireEvent('onTwigPageVariables', new Event(['page' => $item])); @@ -392,6 +394,8 @@ class Twig $this->grav->fireEvent('onTwigStringVariables'); $vars += $this->twig_vars; + $string = Security::cleanDangerousTwig($string); + $name = '@Var:' . $string; $this->setTemplate($name, $string); @@ -418,7 +422,7 @@ class Twig try { $grav = $this->grav; - // set the page now its been processed + // set the page now it's been processed $grav->fireEvent('onTwigSiteVariables'); /** @var Pages $pages */ @@ -427,13 +431,15 @@ class Twig /** @var PageInterface $page */ $page = $grav['page']; + $content = Security::cleanDangerousTwig($page->content()); + $twig_vars = $this->twig_vars; $twig_vars['theme'] = $grav['config']->get('theme'); $twig_vars['pages'] = $pages->root(); $twig_vars['page'] = $page; $twig_vars['header'] = $page->header(); $twig_vars['media'] = $page->media(); - $twig_vars['content'] = $page->content(); + $twig_vars['content'] = $content; // determine if params are set, if so disable twig cache $params = $grav['uri']->params(null, true); @@ -568,4 +574,5 @@ class Twig $this->autoescape = (bool) $state; } + } diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index 9d3ef5b..2d43860 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -206,7 +206,7 @@ class Uri $uri = $language->setActiveFromUri($uri); // split the URL and params (and make sure that the path isn't seen as domain) - $bits = parse_url('http://domain.com' . $uri); + $bits = static::parseUrl('http://domain.com' . $uri); //process fragment if (isset($bits['fragment'])) { @@ -265,6 +265,7 @@ class Uri return $this->paths; } + /** * Return route to the current URI. By default route doesn't include base path. * @@ -742,7 +743,7 @@ class Uri */ public static function isExternal($url) { - return (0 === strpos($url, 'http://') || 0 === strpos($url, 'https://') || 0 === strpos($url, '//')); + return (0 === strpos($url, 'http://') || 0 === strpos($url, 'https://') || 0 === strpos($url, '//') || 0 === strpos($url, 'mailto:') || 0 === strpos($url, 'tel:') || 0 === strpos($url, 'ftp://') || 0 === strpos($url, 'ftps://') || 0 === strpos($url, 'news:') || 0 === strpos($url, 'irc:') || 0 === strpos($url, 'gopher:') || 0 === strpos($url, 'nntp:') || 0 === strpos($url, 'feed:') || 0 === strpos($url, 'cvs:') || 0 === strpos($url, 'ssh:') || 0 === strpos($url, 'git:') || 0 === strpos($url, 'svn:') || 0 === strpos($url, 'hg:')); } /** @@ -954,9 +955,7 @@ class Uri $grav = Grav::instance(); // Remove extra slash from streams, parse_url() doesn't like it. - if ($pos = strpos($url, ':///')) { - $url = substr_replace($url, '://', $pos, 4); - } + $url = preg_replace('/([^:])(\/{2,})/', '$1/', $url); $encodedUrl = preg_replace_callback( '%[^:/@?&=#]+%usD', diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php index a0fb949..a518ec1 100644 --- a/system/src/Grav/Common/Utils.php +++ b/system/src/Grav/Common/Utils.php @@ -989,6 +989,8 @@ abstract class Utils || strtr($filename, "\t\v\n\r\0\\/", '_______') !== $filename // Filename should not start or end with dot or space. || trim($filename, '. ') !== $filename + // Filename should not contain path traversal + || str_replace('..', '', $filename) !== $filename // File extension should not be part of configured dangerous extensions || in_array($extension, $dangerous_extensions) ); @@ -1330,7 +1332,11 @@ abstract class Utils if ($dateformat) { $datetime = DateTime::createFromFormat($dateformat, $date); } else { - $datetime = new DateTime($date); + try { + $datetime = new DateTime($date); + } catch (Exception $e) { + $datetime = false; + } } // fallback to strtotime() if DateTime approach failed diff --git a/system/src/Twig/DeferredExtension/DeferredBlockNode.php b/system/src/Twig/DeferredExtension/DeferredBlockNode.php old mode 100755 new mode 100644 diff --git a/system/src/Twig/DeferredExtension/DeferredNode.php b/system/src/Twig/DeferredExtension/DeferredNode.php old mode 100755 new mode 100644 diff --git a/user/config/system.yaml b/user/config/system.yaml index 28f6c0c..16b3d56 100644 --- a/user/config/system.yaml +++ b/user/config/system.yaml @@ -160,7 +160,7 @@ log: tag: grav debugger: enabled: false - provider: clockwork + provider: debugbar censored: false shutdown: close_connection: true @@ -178,6 +178,7 @@ images: retina_scale: '1' defaults: loading: auto + decoding: auto watermark: image: 'system://images/watermark.png' position_y: center @@ -189,7 +190,7 @@ media: unsupported_inline_types: null allowed_fallback_types: null auto_metadata_exif: false - upload_limit: 2097152 + upload_limit: 2147483648 session: enabled: true initialize: true diff --git a/user/themes/ateliers-55/templates/default.html.twig b/user/themes/ateliers-55/templates/default.html.twig index d540aa1..58d1776 100644 --- a/user/themes/ateliers-55/templates/default.html.twig +++ b/user/themes/ateliers-55/templates/default.html.twig @@ -8,13 +8,14 @@
{% if page.parent.title == "Articles" %}
- {% if not page.isFirst %} - {{ page.nextSibling.title }} Article suivant + {{ dump(page.parent.collection.prevSibling(page.path)) }} + {% if not page.parent.collection.isFirst(page.path) %} + Article suivant {% else %}
{% endif %} - {% if not page.isLast %} - {{ page.prevSibling.title }} Article précédent + {% if not page.parent.collection.isLast(page.path) %} + Article précédent {% endif %}
{% endif %} diff --git a/user/themes/ateliers-55/templates/partials/about.html.twig b/user/themes/ateliers-55/templates/partials/about.html.twig index e8acf21..dec7fb0 100644 --- a/user/themes/ateliers-55/templates/partials/about.html.twig +++ b/user/themes/ateliers-55/templates/partials/about.html.twig @@ -3,7 +3,7 @@ {{ page.find('/a-propos').summary|raw }}
- {{ page.find('/a-propos').content|slice(page.summary|length, page.content|length)|markdown(false) }} + {{ page.find('/a-propos').content|slice(page.find('/a-propos').summary|length, page.find('/a-propos').content|length)|markdown(false) }}
diff --git a/user/themes/ateliers-55/templates/partials/articles-list.html.twig b/user/themes/ateliers-55/templates/partials/articles-list.html.twig index 611a51c..1782053 100644 --- a/user/themes/ateliers-55/templates/partials/articles-list.html.twig +++ b/user/themes/ateliers-55/templates/partials/articles-list.html.twig @@ -1,5 +1,5 @@
- {% for article in page.find('/articles').children.published.order('date', 'desc') %} + {% for article in page.find('/articles').collection %}