diff --git a/.env.ci b/.env.ci index e893452d4..1a9e848e3 100644 --- a/.env.ci +++ b/.env.ci @@ -8,7 +8,7 @@ APP_ENVIRONMENT_ONLY=true DB_CONNECTION=mysql DB_HOST=127.0.0.1 -DB_DATABASE=panel_test +DB_DATABASE=testing DB_USERNAME=root DB_PASSWORD= diff --git a/.env.example b/.env.example index b852f8d86..fc97db959 100644 --- a/.env.example +++ b/.env.example @@ -23,7 +23,7 @@ REDIS_PASSWORD=null REDIS_PORT=6379 CACHE_DRIVER=file -QUEUE_CONNECTION=sync +QUEUE_CONNECTION=redis SESSION_DRIVER=file HASHIDS_SALT= @@ -41,4 +41,4 @@ MAIL_FROM_NAME="Pterodactyl Panel" # mail servers such as Gmail to reject your mail. # # @see: https://github.com/pterodactyl/panel/pull/3110 -# SERVER_NAME=panel.example.com +# MAIL_EHLO_DOMAIN=panel.example.com diff --git a/.eslintrc.js b/.eslintrc.js index 77547d879..a0bb5e9eb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,3 @@ -const prettier = { - singleQuote: true, - jsxSingleQuote: true, - printWidth: 120, -}; - /** @type {import('eslint').Linter.Config} */ module.exports = { parser: '@typescript-eslint/parser', @@ -21,20 +15,15 @@ module.exports = { version: 'detect', }, linkComponents: [ - {name: 'Link', linkAttribute: 'to'}, - {name: 'NavLink', linkAttribute: 'to'}, + { name: 'Link', linkAttribute: 'to' }, + { name: 'NavLink', linkAttribute: 'to' }, ], }, env: { browser: true, es6: true, }, - plugins: [ - 'react', - 'react-hooks', - 'prettier', - '@typescript-eslint', - ], + plugins: ['react', 'react-hooks', 'prettier', '@typescript-eslint'], extends: [ // 'standard', 'eslint:recommended', @@ -44,7 +33,7 @@ module.exports = { ], rules: { eqeqeq: 'error', - 'prettier/prettier': ['error', prettier], + 'prettier/prettier': ['error', {}, { usePrettierrc: true }], // TypeScript can infer this significantly better than eslint ever can. 'react/prop-types': 0, 'react/display-name': 0, @@ -56,7 +45,7 @@ module.exports = { // @see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-use-before-define.md#how-to-use 'no-use-before-define': 0, '@typescript-eslint/no-use-before-define': 'warn', - '@typescript-eslint/no-unused-vars': ['warn', {argsIgnorePattern: '^_', varsIgnorePattern: '^_'}], - '@typescript-eslint/ban-ts-comment': ['error', {'ts-expect-error': 'allow-with-description'}], - } + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + '@typescript-eslint/ban-ts-comment': ['error', { 'ts-expect-error': 'allow-with-description' }], + }, }; diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index adf3d2738..c7bc63aad 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -68,8 +68,8 @@ body: Run the following command to collect logs on your system. Wings: `sudo wings diagnostics` - Panel: `tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log | nc bin.ptdl.co 99` - placeholder: "https://bin.ptdl.co/a1h6z" + Panel: `tail -n 150 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log | nc pteropaste.com 99` + placeholder: "https://pteropaste.com/a1h6z" render: bash validations: required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 09011627c..fee5ad948 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,4 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: Installation Help url: https://discord.gg/pterodactyl diff --git a/.github/docker/entrypoint.sh b/.github/docker/entrypoint.sh index d3df9c150..9cd4c9b0f 100644 --- a/.github/docker/entrypoint.sh +++ b/.github/docker/entrypoint.sh @@ -3,7 +3,7 @@ cd /app mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php7/ \ && chmod 777 /var/log/panel/logs/ \ - && ln -s /var/log/panel/logs/ /app/storage/logs/ + && ln -s /app/storage/logs/ /var/log/panel/ ## check for .env file and generate app keys if missing if [ -f /app/var/.env ]; then diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0e6f93b66..1c8130552 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,14 +17,14 @@ jobs: strategy: fail-fast: false matrix: - php: [8.0, 8.1] + php: [8.1, 8.2] database: ["mariadb:10.2", "mysql:8"] services: database: image: ${{ matrix.database }} env: MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: panel_test + MYSQL_DATABASE: testing ports: - 3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 0e1a2b77e..ffa30b349 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -1,61 +1,68 @@ -name: Publish Docker Image +name: Docker on: push: branches: - - "develop" - - "release/v*" + - develop + - 1.0-develop + pull_request: + branches: + - develop + - 1.0-develop + release: + types: + - published jobs: push: - name: Push Image to GitHub Packages + name: Push runs-on: ubuntu-20.04 - # Always run against a tag, even if the commit into the tag has [docker skip] - # within the commit message. if: "!contains(github.ref, 'develop') || (!contains(github.event.head_commit.message, 'skip docker') && !contains(github.event.head_commit.message, 'docker skip'))" steps: - - name: Code Checkout + - name: Code checkout uses: actions/checkout@v3 - - name: Docker Metadata - uses: docker/metadata-action@v4 + - name: Docker metadata id: docker_meta + uses: docker/metadata-action@v4 with: images: ghcr.io/pterodactyl/panel + flavor: | + latest=false + tags: | + type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.action == 'published' && github.event.release.prerelease == false }} + type=ref,event=tag + type=ref,event=branch - name: Setup QEMU uses: docker/setup-qemu-action@v2 - - name: Setup Docker Buildx + - name: Setup Docker buildx uses: docker/setup-buildx-action@v2 - - name: Docker Login + - name: Login to GitHub Container Registry uses: docker/login-action@v2 + if: "github.event_name != 'pull_request'" with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.REGISTRY_TOKEN }} - - name: Release production build - uses: docker/build-push-action@v2 - if: "contains(github.ref, 'release/v')" - with: - context: . - file: ./Dockerfile - push: true - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.docker_meta.outputs.tags }} - labels: ${{ steps.docker_meta.outputs.labels }} + - name: Update version + if: "github.event_name == 'release' && github.event.action == 'published'" + env: + REF: ${{ github.event.release.tag_name }} + run: | + sed -i "s/ 'version' => 'canary',/ 'version' => '${REF:1}',/" config/app.php - - name: Release development build - uses: docker/build-push-action@v2 - if: "contains(github.ref, 'develop')" + - name: Build and Push + uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile push: ${{ github.event_name != 'pull_request' }} platforms: linux/amd64,linux/arm64 - tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} + tags: ${{ steps.docker_meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 09ab86410..cbbb4b05e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -10,7 +10,7 @@ jobs: name: Release runs-on: ubuntu-20.04 steps: - - name: Code Checkout + - name: Code checkout uses: actions/checkout@v3 - name: Setup Node @@ -36,21 +36,19 @@ jobs: git push -u origin $BRANCH sed -i "s/ 'version' => 'canary',/ 'version' => '${REF:11}',/" config/app.php git add config/app.php - git commit -m "bump version for release" + git commit -m "ci(release): bump version" git push - name: Create release archive run: | - rm -rf node_modules/ test/ codecov.yml CODE_OF_CONDUCT.md CONTRIBUTING.md phpunit.xml Vagrantfile - tar -czf panel.tar.gz * .env.example .eslintignore .eslintrc.js + rm -rf node_modules tests CODE_OF_CONDUCT.md CONTRIBUTING.md flake.lock flake.nix phpunit.xml shell.nix + tar -czf panel.tar.gz * .editorconfig .env.example .eslintignore .eslintrc.js .gitignore .prettierrc.json - name: Extract changelog - id: extract_changelog env: REF: ${{ github.ref }} run: | sed -n "/^## ${REF:10}/,/^## /{/^## /b;p}" CHANGELOG.md > ./RELEASE_CHANGELOG - echo ::set-output name=version_name::`sed -nr "s/^## (${REF:10} .*)$/\1/p" CHANGELOG.md` - name: Create checksum and add to changelog run: | @@ -58,17 +56,15 @@ jobs: echo -e "\n#### SHA256 Checksum\n\n\`\`\`\n$SUM\n\`\`\`\n" >> ./RELEASE_CHANGELOG echo $SUM > checksum.txt - - name: Create Release + - name: Create release id: create_release - uses: actions/create-release@v1 + uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ github.ref }} - release_name: ${{ steps.extract_changelog.outputs.version_name }} - body_path: ./RELEASE_CHANGELOG draft: true - prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }} + prerelease: ${{ contains(github.ref, 'rc') || contains(github.ref, 'beta') || contains(github.ref, 'alpha') }} + body_path: ./RELEASE_CHANGELOG - name: Upload release archive id: upload-release-archive diff --git a/.gitignore b/.gitignore index 4b5d02246..2c9fda4ca 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,8 @@ misc coverage.xml resources/lang/locales.js .phpunit.result.cache + +/public/build +/public/hot +result +docker-compose.yaml diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..d000a2241 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 120, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": true, + "endOfLine": "lf" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index cf7433419..3e9e805eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,100 @@ This file is a running track of new features and fixes to each version of the pa This project follows [Semantic Versioning](http://semver.org) guidelines. -## [Unreleased] +## v1.11.5 +### Fixed +* Rust egg using the wrong Docker image, breaking Rust modding frameworks. + +## v1.11.4 +### Added +* Added support for the `server.queryport` option on the Rust egg. +* Added support for the Carbon modding framework to the Rust egg. + ### Changed -* Changed minimum PHP version is now 8.0 instead of `7.4`. +* Upgraded to Laravel 10. +* Sensitive data is no longer shown in the CopyOnClick toast notification. + +### Fixed +* Allow SVGs to be edited in the server's file manager. +* Properly validate the request body when creating a backup. +* Fixed issue with schedules running at the wrong time when the panel utilized a timezone with non-hour offsets (such as `Australia/Darwin`). +* Fixes the log directory when running the Panel in a container. +* Fixes the permission name used to check if a user has permission to read files/folders. +* Fixes the ability to unset a server's description through the client API. +* Fixed the MassActionBar on the server's file manager blocking elements below it, preventing them from being interacted with. + +## v1.11.3 +### Changed +* When updating a server's description through the client API, if no value is specified, the description will now remain unchanged. +* When installing the Panel for the first time, the queue driver will now all default to `redis` instead of `sync`. + +### Fixed +* `php artisan p:environment:mail` not correctly setting the right variable for `MAIL_FROM_ADDRESS`. +* Fixed the conflict state rendering on the UI for a server showing `reinstall_failed` as `restoring_backup`. +* Fixed the unknown column `uuid` error when jobs fail, causing them not to get stored correctly. +* Fixed the server task endpoints in the client API not allowing `sequence_id` and `continue_on_failure` to be set. + +## v1.11.2 +### Changed +* Telemetry no longer sends a map of Egg and Nest UUIDs to the number of servers using them. +* Increased the timeout for the decompress files endpoint in the client API from 15 seconds to 15 minutes. + +### Fixed +* Fixed Panel Docker image having a `v` prefix in the version displayed in the admin area. +* Fixed emails using the wrong queue name, causing them to not be sent. +* Fixed the settings keys used for configuring SMTP settings, causing settings to not save properly. +* Fixed the `MAIL_EHLO_DOMAIN` environment variable not being properly backwards compatible with the old `SERVER_NAME` variable. + +## v1.11.1 +### Fixed +* Fixed Panel Docker image showing `canary` as it's version. + +## v1.11.0 +### Changed (since 1.10.4) +* Changed minimum PHP version requirement from `7.4` to `8.0`. * Upgraded from Laravel 8 to Laravel 9. +* This release requires Wings v1.11.x in order for Server Transfers to work. +* `MB` byte suffixes are now displayed as `MiB` to more accurately reflect the actual value. +* Server re-installation failures are tracked independently of the initial installation process. + +### Fixed (since 1.10.4) +* Node maintenance mode now properly blocks access to servers. +* Fixed the length validation on the Minecraft Forge egg. +* Fixed the password in the JDBC string not being properly URL encoded. +* Fixed an issue where Wings would throw a validation error while attempting to upload activity logs. +* Properly handle a missing `Content-Length` header in the response from the daemon. +* Ensure activity log properties are always returned as an object instead of an empty array. + +### Added (since 1.10.4) +* Added the `server:settings.description` activity log event for when a server description is changed. +* Added the ability to cancel file uploads in the file manager for a server. +* Added a telemetry service to collect anonymous metrics from the panel, this feature is *enabled* by default and can be toggled using the `PTERODACTYL_TELEMETRY_ENABLED` environment variable. + +## v1.11.0-rc.2 +### Changed +* `MB` byte suffixes are now displayed as `MiB` to more accurately reflect the actual value. +* Server re-installation failures are tracked independently of the initial installation process. + +### Fixed +* Properly handle a missing `Content-Length` header in the response from the daemon. +* Ensure activity log properties are always returned as an object instead of an empty array. + +### Added +* Added the `server:settings.description` activity log event for when a server description is changed. +* Added the ability to cancel file uploads in the file manager for a server. +* Added a telemetry service to collect anonymous metrics from the panel, this feature is disabled by default and can be toggled using the `PTERODACTYL_TELEMETRY_ENABLED` environment variable. + +## v1.11.0-rc.1 +### Changed +* Changed minimum PHP version requirement from `7.4` to `8.0`. +* Upgraded from Laravel 8 to Laravel 9. +* This release requires Wings v1.11.x in order for Server Transfers to work. + +### Fixed +* Node maintenance mode now properly blocks access to servers. +* Fixed the length validation on the Minecraft Forge egg. +* Fixed the password in the JDBC string not being properly URL encoded. +* Fixed an issue where Wings would throw a validation error while attempting to upload activity logs. ## v1.10.4 ### Fixed diff --git a/Dockerfile b/Dockerfile index e215d9406..aae05a526 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,6 +23,7 @@ RUN apk add --no-cache --update ca-certificates dcron curl git supervisor tar un && chmod 777 -R bootstrap storage \ && composer install --no-dev --optimize-autoloader \ && rm -rf .env bootstrap/cache/*.php \ + && mkdir -p /app/storage/logs/ \ && chown -R nginx:nginx . RUN rm /usr/local/etc/php-fpm.conf \ diff --git a/README.md b/README.md index 9ac8a0d15..1b3a71e2e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ [![Logo Image](https://cdn.pterodactyl.io/logos/new/pterodactyl_logo.png)](https://pterodactyl.io) -![GitHub Workflow Status](https://img.shields.io/github/workflow/status/pterodactyl/panel/tests?label=Tests&style=for-the-badge) +![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/pterodactyl/panel/ci.yaml?label=Tests&style=for-the-badge&branch=1.0-develop) ![Discord](https://img.shields.io/discord/122900397965705216?label=Discord&logo=Discord&logoColor=white&style=for-the-badge) ![GitHub Releases](https://img.shields.io/github/downloads/pterodactyl/panel/latest/total?style=for-the-badge) ![GitHub contributors](https://img.shields.io/github/contributors/pterodactyl/panel?style=for-the-badge) # Pterodactyl Panel -Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security + +Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users. @@ -15,30 +16,26 @@ Stop settling for less. Make game servers a first class citizen on your platform ![Image](https://cdn.pterodactyl.io/site-assets/pterodactyl_v1_demo.gif) ## Documentation + * [Panel Documentation](https://pterodactyl.io/panel/1.0/getting_started.html) * [Wings Documentation](https://pterodactyl.io/wings/1.0/installing.html) * [Community Guides](https://pterodactyl.io/community/about.html) * Or, get additional help [via Discord](https://discord.gg/pterodactyl) ## Sponsors -I would like to extend my sincere thanks to the following sponsors for helping fund Pterodactyl's developement. + +I would like to extend my sincere thanks to the following sponsors for helping fund Pterodactyl's development. [Interested in becoming a sponsor?](https://github.com/sponsors/matthewpi) -| Company | About | -| ------- | ----- | -| [**WISP**](https://wisp.gg) | Extra features. | -| [**BisectHosting**](https://www.bisecthosting.com/) | BisectHosting provides Minecraft, Valheim and other server hosting services with the highest reliability and lightning fast support since 2012. | -| [**Fragnet**](https://fragnet.net) | Providing low latency, high-end game hosting solutions to gamers, game studios and eSports platforms. | -| [**Tempest**](https://tempest.net/) | Tempest Hosting is a subsidiary of Path Network, Inc. offering unmetered DDoS protected 10Gbps dedicated servers, starting at just $80/month. Full anycast, tons of filters. | -| [**Bloom.host**](https://bloom.host) | Bloom.host offers dedicated core VPS and Minecraft hosting with Ryzen 9 processors. With owned-hardware, we offer truly unbeatable prices on high-performance hosting. | -| [**MineStrator**](https://minestrator.com/) | Looking for the most highend French hosting company for your minecraft server? More than 24,000 members on our discord trust us. Give us a try! | -| [**Skynode**](https://www.skynode.pro/) | Skynode provides blazing fast game servers along with a top-notch user experience. Whatever our clients are looking for, we're able to provide it! | -| [**DeinServerHost**](https://deinserverhost.de/) | DeinServerHost offers Dedicated, vps and Gameservers for many popular Games like Minecraft and Rust in Germany since 2013. | -| [**Aussie Server Hosts**](https://aussieserverhosts.com/) | No frills Australian Owned and operated High Performance Server hosting for some of the most demanding games serving Australia and New Zealand. | -| [**VibeGAMES**](https://vibegames.net/) | VibeGAMES is a game server provider that specializes in DDOS protection for the games we offer. We have multiple locations in the US, Brazil, France, Germany, Singapore, Australia and South Africa.| -| [**Gamenodes**](https://gamenodes.nl) | Gamenodes love quality. For Minecraft, Discord Bots and other services, among others. With our own programmers, we provide just that little bit of extra service! | +| Company | About | +|-----------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [**Aussie Server Hosts**](https://aussieserverhosts.com/) | No frills Australian Owned and operated High Performance Server hosting for some of the most demanding games serving Australia and New Zealand. | +| [**BisectHosting**](https://www.bisecthosting.com/) | BisectHosting provides Minecraft, Valheim and other server hosting services with the highest reliability and lightning fast support since 2012. | +| [**MineStrator**](https://minestrator.com/) | Looking for the most highend French hosting company for your minecraft server? More than 24,000 members on our discord trust us. Give us a try! | +| [**VibeGAMES**](https://vibegames.net/) | VibeGAMES is a game server provider that specializes in DDOS protection for the games we offer. We have multiple locations in the US, Brazil, France, Germany, Singapore, Australia and South Africa. | ### Supported Games + Pterodactyl supports a wide variety of games by utilizing Docker containers to isolate each instance. This gives you the power to run game servers without bloating machines with a host of additional dependencies. @@ -67,6 +64,7 @@ and there are plenty more games available provided by the community. Some of the * [and many more...](https://github.com/parkervcp/eggs) ## License + Pterodactyl® Copyright © 2015 - 2022 Dane Everitt and contributors. Code released under the [MIT License](./LICENSE.md). diff --git a/SECURITY.md b/SECURITY.md index 9d06612dc..e5a9eb0fa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,11 +1,13 @@ # Security Policy ## Supported Versions + The following versions of Pterodactyl are receiving active support and maintenance. Any security vulnerabilities discovered must be reproducible in supported versions. | Panel | Daemon | Supported | |--------|--------------|--------------------| | 1.10.x | wings@1.7.x | :white_check_mark: | +| 1.11.x | wings@1.11.x | :white_check_mark: | | 0.7.x | daemon@0.6.x | :x: | diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index 8b9aad48e..b143719fe 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Console\Commands\Environment; -use DateTimeZone; use Illuminate\Console\Command; use Illuminate\Contracts\Console\Kernel; use Pterodactyl\Traits\Commands\EnvironmentWriterTrait; @@ -44,7 +43,8 @@ class AppSettingsCommand extends Command {--redis-host= : Redis host to use for connections.} {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.} - {--settings-ui= : Enable or disable the settings UI.}'; + {--settings-ui= : Enable or disable the settings UI.} + {--telemetry= : Enable or disable anonymous telemetry.}'; protected array $variables = []; @@ -88,7 +88,7 @@ class AppSettingsCommand extends Command $this->output->comment('The timezone should match one of PHP\'s supported timezones. If you are unsure, please reference https://php.net/manual/en/timezones.php.'); $this->variables['APP_TIMEZONE'] = $this->option('timezone') ?? $this->anticipate( 'Application Timezone', - DateTimeZone::listIdentifiers(), + \DateTimeZone::listIdentifiers(), config('app.timezone') ); @@ -119,6 +119,12 @@ class AppSettingsCommand extends Command $this->variables['APP_ENVIRONMENT_ONLY'] = $this->confirm('Enable UI based settings editor?', true) ? 'false' : 'true'; } + $this->output->comment('Please reference https://pterodactyl.io/panel/1.0/additional_configuration.html#telemetry for more detailed information regarding telemetry data and collection.'); + $this->variables['PTERODACTYL_TELEMETRY_ENABLED'] = $this->option('telemetry') ?? $this->confirm( + 'Enable sending anonymous telemetry data?', + config('pterodactyl.telemetry.enabled', true) + ) ? 'true' : 'false'; + // Make sure session cookies are set as "secure" when using HTTPS if (str_starts_with($this->variables['APP_URL'], 'https://')) { $this->variables['SESSION_SECURE_COOKIE'] = 'true'; diff --git a/app/Console/Commands/Environment/DatabaseSettingsCommand.php b/app/Console/Commands/Environment/DatabaseSettingsCommand.php index 0186a12b1..fb4a2e25b 100644 --- a/app/Console/Commands/Environment/DatabaseSettingsCommand.php +++ b/app/Console/Commands/Environment/DatabaseSettingsCommand.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Console\Commands\Environment; -use PDOException; use Illuminate\Console\Command; use Illuminate\Contracts\Console\Kernel; use Illuminate\Database\DatabaseManager; @@ -72,7 +71,7 @@ class DatabaseSettingsCommand extends Command try { $this->testMySQLConnection(); - } catch (PDOException $exception) { + } catch (\PDOException $exception) { $this->output->error(sprintf('Unable to connect to the MySQL server using the provided credentials. The error returned was "%s".', $exception->getMessage())); $this->output->error('Your connection credentials have NOT been saved. You will need to provide valid connection information before proceeding.'); diff --git a/app/Console/Commands/Environment/EmailSettingsCommand.php b/app/Console/Commands/Environment/EmailSettingsCommand.php index 1fd9a2aee..3a211394c 100644 --- a/app/Console/Commands/Environment/EmailSettingsCommand.php +++ b/app/Console/Commands/Environment/EmailSettingsCommand.php @@ -44,7 +44,7 @@ class EmailSettingsCommand extends Command trans('command/messages.environment.mail.ask_driver'), [ 'smtp' => 'SMTP Server', - 'mail' => 'PHP\'s Internal Mail Function', + 'sendmail' => 'sendmail Binary', 'mailgun' => 'Mailgun Transactional Email', 'mandrill' => 'Mandrill Transactional Email', 'postmark' => 'Postmark Transactional Email', @@ -57,7 +57,7 @@ class EmailSettingsCommand extends Command $this->{$method}(); } - $this->variables['MAIL_FROM'] = $this->option('email') ?? $this->ask( + $this->variables['MAIL_FROM_ADDRESS'] = $this->option('email') ?? $this->ask( trans('command/messages.environment.mail.ask_mail_from'), $this->config->get('mail.from.address') ); @@ -67,12 +67,6 @@ class EmailSettingsCommand extends Command $this->config->get('mail.from.name') ); - $this->variables['MAIL_ENCRYPTION'] = $this->option('encryption') ?? $this->choice( - trans('command/messages.environment.mail.ask_encryption'), - ['tls' => 'TLS', 'ssl' => 'SSL', '' => 'None'], - $this->config->get('mail.encryption', 'tls') - ); - $this->writeToEnvironment($this->variables); $this->line('Updating stored environment configuration file.'); @@ -102,6 +96,12 @@ class EmailSettingsCommand extends Command $this->variables['MAIL_PASSWORD'] = $this->option('password') ?? $this->secret( trans('command/messages.environment.mail.ask_smtp_password') ); + + $this->variables['MAIL_ENCRYPTION'] = $this->option('encryption') ?? $this->choice( + trans('command/messages.environment.mail.ask_encryption'), + ['tls' => 'TLS', 'ssl' => 'SSL', '' => 'None'], + $this->config->get('mail.mailers.smtp.encryption', 'tls') + ); } /** diff --git a/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php b/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php index fa71171ab..f256fe44f 100644 --- a/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php +++ b/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Console\Commands\Maintenance; -use SplFileInfo; use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Contracts\Filesystem\Filesystem; @@ -35,7 +34,7 @@ class CleanServiceBackupFilesCommand extends Command { $files = $this->disk->files('services/.bak'); - collect($files)->each(function (SplFileInfo $file) { + collect($files)->each(function (\SplFileInfo $file) { $lastModified = Carbon::createFromTimestamp($this->disk->lastModified($file->getPath())); if ($lastModified->diffInMinutes(Carbon::now()) > self::BACKUP_THRESHOLD_MINUTES) { $this->disk->delete($file->getPath()); diff --git a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php index b51a415b2..b7a04f8ee 100644 --- a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php +++ b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Console\Commands\Maintenance; use Carbon\CarbonImmutable; -use InvalidArgumentException; use Illuminate\Console\Command; use Pterodactyl\Repositories\Eloquent\BackupRepository; @@ -11,7 +10,7 @@ class PruneOrphanedBackupsCommand extends Command { protected $signature = 'p:maintenance:prune-backups {--prune-age=}'; - protected $description = 'Marks all backups that have not completed in the last "n" minutes as being failed.'; + protected $description = 'Marks all backups older than "n" minutes that have not yet completed as being failed.'; /** * PruneOrphanedBackupsCommand constructor. @@ -25,7 +24,7 @@ class PruneOrphanedBackupsCommand extends Command { $since = $this->option('prune-age') ?? config('backups.prune_age', 360); if (!$since || !is_digit($since)) { - throw new InvalidArgumentException('The "--prune-age" argument must be a value greater than 0.'); + throw new \InvalidArgumentException('The "--prune-age" argument must be a value greater than 0.'); } $query = $this->backupRepository->getBuilder() @@ -39,7 +38,7 @@ class PruneOrphanedBackupsCommand extends Command return; } - $this->warn("Marking $count backups that have not been marked as completed in the last $since minutes as failed."); + $this->warn("Marking $count uncompleted backups that are older than $since minutes as failed."); $query->update([ 'is_successful' => false, diff --git a/app/Console/Commands/Schedule/ProcessRunnableCommand.php b/app/Console/Commands/Schedule/ProcessRunnableCommand.php index 49043f0f8..d3dd134e5 100644 --- a/app/Console/Commands/Schedule/ProcessRunnableCommand.php +++ b/app/Console/Commands/Schedule/ProcessRunnableCommand.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Console\Commands\Schedule; use Exception; -use Throwable; use Illuminate\Console\Command; use Pterodactyl\Models\Schedule; use Illuminate\Support\Facades\Log; @@ -68,7 +67,7 @@ class ProcessRunnableCommand extends Command 'schedule' => $schedule->name, 'hash' => $schedule->hashid, ])); - } catch (Throwable|Exception $exception) { + } catch (\Throwable|\Exception $exception) { Log::error($exception, ['schedule_id' => $schedule->id]); $this->error("An error was encountered while processing Schedule #$schedule->id: " . $exception->getMessage()); diff --git a/app/Console/Commands/TelemetryCommand.php b/app/Console/Commands/TelemetryCommand.php new file mode 100644 index 000000000..3e1b0c2f8 --- /dev/null +++ b/app/Console/Commands/TelemetryCommand.php @@ -0,0 +1,34 @@ +output->info('Collecting telemetry data, this may take a while...'); + + VarDumper::dump($this->telemetryCollectionService->collect()); + } +} diff --git a/app/Console/Commands/UpgradeCommand.php b/app/Console/Commands/UpgradeCommand.php index 54e54e465..6d033a51c 100644 --- a/app/Console/Commands/UpgradeCommand.php +++ b/app/Console/Commands/UpgradeCommand.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Console\Commands; -use Closure; use Illuminate\Console\Command; use Pterodactyl\Console\Kernel; use Symfony\Component\Process\Process; @@ -177,7 +176,7 @@ class UpgradeCommand extends Command $this->info('Panel has been successfully upgraded. Please ensure you also update any Wings instances: https://pterodactyl.io/wings/1.0/upgrading.html'); } - protected function withProgress(ProgressBar $bar, Closure $callback) + protected function withProgress(ProgressBar $bar, \Closure $callback) { $bar->clear(); $callback(); diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 17b3d4de4..56343297c 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,10 +2,13 @@ namespace Pterodactyl\Console; +use Ramsey\Uuid\Uuid; use Pterodactyl\Models\ActivityLog; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Database\Console\PruneCommand; +use Pterodactyl\Repositories\Eloquent\SettingsRepository; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; +use Pterodactyl\Services\Telemetry\TelemetryCollectionService; use Pterodactyl\Console\Commands\Schedule\ProcessRunnableCommand; use Pterodactyl\Console\Commands\Maintenance\PruneOrphanedBackupsCommand; use Pterodactyl\Console\Commands\Maintenance\CleanServiceBackupFilesCommand; @@ -15,7 +18,7 @@ class Kernel extends ConsoleKernel /** * Register the commands for the application. */ - protected function commands() + protected function commands(): void { $this->load(__DIR__ . '/Commands'); } @@ -23,8 +26,11 @@ class Kernel extends ConsoleKernel /** * Define the application's command schedule. */ - protected function schedule(Schedule $schedule) + protected function schedule(Schedule $schedule): void { + // https://laravel.com/docs/10.x/upgrade#redis-cache-tags + $schedule->command('cache:prune-stale-tags')->hourly(); + // Execute scheduled commands for servers every minute, as if there was a normal cron running. $schedule->command(ProcessRunnableCommand::class)->everyMinute()->withoutOverlapping(); $schedule->command(CleanServiceBackupFilesCommand::class)->daily(); @@ -37,5 +43,34 @@ class Kernel extends ConsoleKernel if (config('activity.prune_days')) { $schedule->command(PruneCommand::class, ['--model' => [ActivityLog::class]])->daily(); } + + if (config('pterodactyl.telemetry.enabled')) { + $this->registerTelemetry($schedule); + } + } + + /** + * I wonder what this does. + * + * @throws \Pterodactyl\Exceptions\Model\DataValidationException + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + private function registerTelemetry(Schedule $schedule): void + { + $settingsRepository = app()->make(SettingsRepository::class); + + $uuid = $settingsRepository->get('app:telemetry:uuid'); + if (is_null($uuid)) { + $uuid = Uuid::uuid4()->toString(); + $settingsRepository->set('app:telemetry:uuid', $uuid); + } + + // Calculate a fixed time to run the data push at, this will be the same time every day. + $time = hexdec(str_replace('-', '', substr($uuid, 27))) % 1440; + $hour = floor($time / 60); + $minute = $time % 60; + + // Run the telemetry collector. + $schedule->call(app()->make(TelemetryCollectionService::class))->description('Collect Telemetry')->dailyAt("$hour:$minute"); } } diff --git a/app/Exceptions/AccountNotFoundException.php b/app/Exceptions/AccountNotFoundException.php index 832fbf2d1..3da3de250 100644 --- a/app/Exceptions/AccountNotFoundException.php +++ b/app/Exceptions/AccountNotFoundException.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Exceptions; -use Exception; - -class AccountNotFoundException extends Exception +class AccountNotFoundException extends \Exception { } diff --git a/app/Exceptions/AutoDeploymentException.php b/app/Exceptions/AutoDeploymentException.php index d1d3de5c5..20405fba2 100644 --- a/app/Exceptions/AutoDeploymentException.php +++ b/app/Exceptions/AutoDeploymentException.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Exceptions; -use Exception; - -class AutoDeploymentException extends Exception +class AutoDeploymentException extends \Exception { } diff --git a/app/Exceptions/DisplayException.php b/app/Exceptions/DisplayException.php index c29120f9a..c1440dbe0 100644 --- a/app/Exceptions/DisplayException.php +++ b/app/Exceptions/DisplayException.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Exceptions; use Exception; -use Throwable; use Illuminate\Http\Request; use Psr\Log\LoggerInterface; use Illuminate\Http\Response; @@ -23,7 +22,7 @@ class DisplayException extends PterodactylException implements HttpExceptionInte /** * DisplayException constructor. */ - public function __construct(string $message, ?Throwable $previous = null, protected string $level = self::LEVEL_ERROR, int $code = 0) + public function __construct(string $message, ?\Throwable $previous = null, protected string $level = self::LEVEL_ERROR, int $code = 0) { parent::__construct($message, $code, $previous); } @@ -67,7 +66,7 @@ class DisplayException extends PterodactylException implements HttpExceptionInte */ public function report() { - if (!$this->getPrevious() instanceof Exception || !Handler::isReportable($this->getPrevious())) { + if (!$this->getPrevious() instanceof \Exception || !Handler::isReportable($this->getPrevious())) { return null; } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index bcc636b5c..80816b43f 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -3,8 +3,6 @@ namespace Pterodactyl\Exceptions; use Exception; -use Throwable; -use PDOException; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Illuminate\Http\JsonResponse; @@ -75,13 +73,13 @@ class Handler extends ExceptionHandler * * @noinspection PhpUnusedLocalVariableInspection */ - public function register() + public function register(): void { if (config('app.exceptions.report_all', false)) { $this->dontReport = []; } - $this->reportable(function (PDOException $ex) { + $this->reportable(function (\PDOException $ex) { $ex = $this->generateCleanedExceptionStack($ex); }); @@ -90,7 +88,7 @@ class Handler extends ExceptionHandler }); } - private function generateCleanedExceptionStack(Throwable $exception): string + private function generateCleanedExceptionStack(\Throwable $exception): string { $cleanedStack = ''; foreach ($exception->getTrace() as $index => $item) { @@ -123,7 +121,7 @@ class Handler extends ExceptionHandler * * @throws \Throwable */ - public function render($request, Throwable $e): Response + public function render($request, \Throwable $e): Response { $connections = $this->container->make(Connection::class); @@ -189,7 +187,7 @@ class Handler extends ExceptionHandler /** * Return the exception as a JSONAPI representation for use on API requests. */ - protected function convertExceptionToArray(Throwable $e, array $override = []): array + protected function convertExceptionToArray(\Throwable $e, array $override = []): array { $match = self::$exceptionResponseCodes[get_class($e)] ?? null; @@ -235,7 +233,7 @@ class Handler extends ExceptionHandler /** * Return an array of exceptions that should not be reported. */ - public static function isReportable(Exception $exception): bool + public static function isReportable(\Exception $exception): bool { return (new static(Container::getInstance()))->shouldReport($exception); } @@ -260,11 +258,11 @@ class Handler extends ExceptionHandler * * @return \Throwable[] */ - protected function extractPrevious(Throwable $e): array + protected function extractPrevious(\Throwable $e): array { $previous = []; while ($value = $e->getPrevious()) { - if (!$value instanceof Throwable) { + if (!$value instanceof \Throwable) { break; } $previous[] = $value; @@ -278,7 +276,7 @@ class Handler extends ExceptionHandler * Helper method to allow reaching into the handler to convert an exception * into the expected array response type. */ - public static function toArray(Throwable $e): array + public static function toArray(\Throwable $e): array { return (new self(app()))->convertExceptionToArray($e); } diff --git a/app/Exceptions/Http/Server/ServerStateConflictException.php b/app/Exceptions/Http/Server/ServerStateConflictException.php index f0eb096b1..546024c23 100644 --- a/app/Exceptions/Http/Server/ServerStateConflictException.php +++ b/app/Exceptions/Http/Server/ServerStateConflictException.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Exceptions\Http\Server; -use Throwable; use Pterodactyl\Models\Server; use Symfony\Component\HttpKernel\Exception\ConflictHttpException; @@ -12,11 +11,13 @@ class ServerStateConflictException extends ConflictHttpException * Exception thrown when the server is in an unsupported state for API access or * certain operations within the codebase. */ - public function __construct(Server $server, Throwable $previous = null) + public function __construct(Server $server, \Throwable $previous = null) { $message = 'This server is currently in an unsupported state, please try again later.'; if ($server->isSuspended()) { $message = 'This server is currently suspended and the functionality requested is unavailable.'; + } elseif ($server->node->isUnderMaintenance()) { + $message = 'The node of this server is currently under maintenance and the functionality requested is unavailable.'; } elseif (!$server->isInstalled()) { $message = 'This server has not yet completed its installation process, please try again later.'; } elseif ($server->status === Server::STATUS_RESTORING_BACKUP) { diff --git a/app/Exceptions/Http/TwoFactorAuthRequiredException.php b/app/Exceptions/Http/TwoFactorAuthRequiredException.php index cecb64626..95f300e2e 100644 --- a/app/Exceptions/Http/TwoFactorAuthRequiredException.php +++ b/app/Exceptions/Http/TwoFactorAuthRequiredException.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Exceptions\Http; -use Throwable; use Illuminate\Http\Response; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; @@ -12,7 +11,7 @@ class TwoFactorAuthRequiredException extends HttpException implements HttpExcept /** * TwoFactorAuthRequiredException constructor. */ - public function __construct(Throwable $previous = null) + public function __construct(\Throwable $previous = null) { parent::__construct(Response::HTTP_BAD_REQUEST, 'Two-factor authentication is required on this account in order to access this endpoint.', $previous); } diff --git a/app/Exceptions/ManifestDoesNotExistException.php b/app/Exceptions/ManifestDoesNotExistException.php new file mode 100644 index 000000000..206af362d --- /dev/null +++ b/app/Exceptions/ManifestDoesNotExistException.php @@ -0,0 +1,14 @@ + 'https://github.com/pterodactyl/panel/blob/develop/package.json', + ]; + } +} diff --git a/app/Extensions/Backups/BackupManager.php b/app/Extensions/Backups/BackupManager.php index 944e8d790..41e26c34c 100644 --- a/app/Extensions/Backups/BackupManager.php +++ b/app/Extensions/Backups/BackupManager.php @@ -7,7 +7,6 @@ use Aws\S3\S3Client; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Webmozart\Assert\Assert; -use InvalidArgumentException; use Illuminate\Foundation\Application; use League\Flysystem\FilesystemAdapter; use Pterodactyl\Extensions\Filesystem\S3Filesystem; @@ -70,7 +69,7 @@ class BackupManager $config = $this->getConfig($name); if (empty($config['adapter'])) { - throw new InvalidArgumentException("Backup disk [$name] does not have a configured adapter."); + throw new \InvalidArgumentException("Backup disk [$name] does not have a configured adapter."); } $adapter = $config['adapter']; @@ -88,7 +87,7 @@ class BackupManager return $instance; } - throw new InvalidArgumentException("Adapter [$adapter] is not supported."); + throw new \InvalidArgumentException("Adapter [$adapter] is not supported."); } /** @@ -164,7 +163,7 @@ class BackupManager /** * Register a custom adapter creator closure. */ - public function extend(string $adapter, Closure $callback): self + public function extend(string $adapter, \Closure $callback): self { $this->customCreators[$adapter] = $callback; diff --git a/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php b/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php index e13133c34..e47a3fda0 100644 --- a/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php +++ b/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Extensions\Lcobucci\JWT\Encoding; -use DateTimeImmutable; use Lcobucci\JWT\ClaimsFormatter; use Lcobucci\JWT\Token\RegisteredClaims; @@ -21,7 +20,7 @@ final class TimestampDates implements ClaimsFormatter continue; } - assert($claims[$claim] instanceof DateTimeImmutable); + assert($claims[$claim] instanceof \DateTimeImmutable); $claims[$claim] = $claims[$claim]->getTimestamp(); } diff --git a/app/Helpers/Time.php b/app/Helpers/Time.php index e8e585c2b..d68f35330 100644 --- a/app/Helpers/Time.php +++ b/app/Helpers/Time.php @@ -15,8 +15,6 @@ final class Time */ public static function getMySQLTimezoneOffset(string $timezone): string { - $offset = round(CarbonImmutable::now($timezone)->getTimezone()->getOffset(CarbonImmutable::now('UTC')) / 3600); - - return sprintf('%s%s:00', $offset > 0 ? '+' : '-', str_pad((string) abs($offset), 2, '0', STR_PAD_LEFT)); + return CarbonImmutable::now($timezone)->getTimezone()->toOffsetName(); } } diff --git a/app/Helpers/Utilities.php b/app/Helpers/Utilities.php index f6341c03d..0c468e0c7 100644 --- a/app/Helpers/Utilities.php +++ b/app/Helpers/Utilities.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Helpers; -use Exception; use Carbon\Carbon; use Cron\CronExpression; use Illuminate\Support\Facades\Log; @@ -25,7 +24,7 @@ class Utilities $string = substr_replace($string, $character, random_int(0, $length - 1), 1); } - } catch (Exception $exception) { + } catch (\Exception $exception) { // Just log the error and hope for the best at this point. Log::error($exception); } diff --git a/app/Http/Controllers/Admin/DatabaseController.php b/app/Http/Controllers/Admin/DatabaseController.php index e0dc0dc57..864fb0307 100644 --- a/app/Http/Controllers/Admin/DatabaseController.php +++ b/app/Http/Controllers/Admin/DatabaseController.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Http\Controllers\Admin; use Exception; -use PDOException; use Illuminate\View\View; use Pterodactyl\Models\DatabaseHost; use Illuminate\Http\RedirectResponse; @@ -69,8 +68,8 @@ class DatabaseController extends Controller { try { $host = $this->creationService->handle($request->normalize()); - } catch (Exception $exception) { - if ($exception instanceof PDOException || $exception->getPrevious() instanceof PDOException) { + } catch (\Exception $exception) { + if ($exception instanceof \PDOException || $exception->getPrevious() instanceof \PDOException) { $this->alert->danger( sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) )->flash(); @@ -98,10 +97,10 @@ class DatabaseController extends Controller try { $this->updateService->handle($host->id, $request->normalize()); $this->alert->success('Database host was updated successfully.')->flash(); - } catch (Exception $exception) { + } catch (\Exception $exception) { // Catch any SQL related exceptions and display them back to the user, otherwise just // throw the exception like normal and move on with it. - if ($exception instanceof PDOException || $exception->getPrevious() instanceof PDOException) { + if ($exception instanceof \PDOException || $exception->getPrevious() instanceof \PDOException) { $this->alert->danger( sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) )->flash(); diff --git a/app/Http/Controllers/Admin/Nests/EggController.php b/app/Http/Controllers/Admin/Nests/EggController.php index 010c28af0..e71e48e91 100644 --- a/app/Http/Controllers/Admin/Nests/EggController.php +++ b/app/Http/Controllers/Admin/Nests/EggController.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Controllers\Admin\Nests; -use JavaScript; use Illuminate\View\View; use Pterodactyl\Models\Egg; use Illuminate\Http\RedirectResponse; @@ -40,7 +39,7 @@ class EggController extends Controller public function create(): View { $nests = $this->nestRepository->getWithEggs(); - JavaScript::put(['nests' => $nests->keyBy('id')]); + \JavaScript::put(['nests' => $nests->keyBy('id')]); return $this->view->make('admin.eggs.new', ['nests' => $nests]); } diff --git a/app/Http/Controllers/Admin/Servers/CreateServerController.php b/app/Http/Controllers/Admin/Servers/CreateServerController.php index c7a1653ad..c0fee8c8e 100644 --- a/app/Http/Controllers/Admin/Servers/CreateServerController.php +++ b/app/Http/Controllers/Admin/Servers/CreateServerController.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Controllers\Admin\Servers; -use JavaScript; use Illuminate\View\View; use Pterodactyl\Models\Node; use Pterodactyl\Models\Location; @@ -45,7 +44,7 @@ class CreateServerController extends Controller $nests = $this->nestRepository->getWithEggs(); - JavaScript::put([ + \JavaScript::put([ 'nodeData' => $this->nodeRepository->getNodesForServerCreation(), 'nests' => $nests->map(function ($item) { return array_merge($item->toArray(), [ diff --git a/app/Http/Controllers/Admin/Servers/ServerTransferController.php b/app/Http/Controllers/Admin/Servers/ServerTransferController.php index 096217418..8941ce10c 100644 --- a/app/Http/Controllers/Admin/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Admin/Servers/ServerTransferController.php @@ -2,15 +2,17 @@ namespace Pterodactyl\Http\Controllers\Admin\Servers; +use Carbon\CarbonImmutable; use Illuminate\Http\Request; use Pterodactyl\Models\Server; use Illuminate\Http\RedirectResponse; use Prologue\Alerts\AlertsMessageBag; use Pterodactyl\Models\ServerTransfer; +use Illuminate\Database\ConnectionInterface; use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Services\Servers\TransferService; +use Pterodactyl\Services\Nodes\NodeJWTService; use Pterodactyl\Repositories\Eloquent\NodeRepository; -use Pterodactyl\Repositories\Wings\DaemonConfigurationRepository; +use Pterodactyl\Repositories\Wings\DaemonTransferRepository; use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface; class ServerTransferController extends Controller @@ -21,9 +23,10 @@ class ServerTransferController extends Controller public function __construct( private AlertsMessageBag $alert, private AllocationRepositoryInterface $allocationRepository, - private NodeRepository $nodeRepository, - private TransferService $transferService, - private DaemonConfigurationRepository $daemonConfigurationRepository + private ConnectionInterface $connection, + private DaemonTransferRepository $daemonTransferRepository, + private NodeJWTService $nodeJWTService, + private NodeRepository $nodeRepository ) { } @@ -46,12 +49,15 @@ class ServerTransferController extends Controller // Check if the node is viable for the transfer. $node = $this->nodeRepository->getNodeWithResourceUsage($node_id); - if ($node->isViable($server->memory, $server->disk)) { - // Check if the selected daemon is online. - $this->daemonConfigurationRepository->setNode($node)->getSystemInformation(); + if (!$node->isViable($server->memory, $server->disk)) { + $this->alert->danger(trans('admin/server.alerts.transfer_not_viable'))->flash(); - $server->validateTransferState(); + return redirect()->route('admin.servers.view.manage', $server->id); + } + $server->validateTransferState(); + + $this->connection->transaction(function () use ($server, $node_id, $allocation_id, $additional_allocations) { // Create a new ServerTransfer entry. $transfer = new ServerTransfer(); @@ -68,13 +74,19 @@ class ServerTransferController extends Controller // Add the allocations to the server, so they cannot be automatically assigned while the transfer is in progress. $this->assignAllocationsToServer($server, $node_id, $allocation_id, $additional_allocations); - // Request an archive from the server's current daemon. (this also checks if the daemon is online) - $this->transferService->requestArchive($server); + // Generate a token for the destination node that the source node can use to authenticate with. + $token = $this->nodeJWTService + ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) + ->setSubject($server->uuid) + ->handle($transfer->newNode, $server->uuid, 'sha256'); - $this->alert->success(trans('admin/server.alerts.transfer_started'))->flash(); - } else { - $this->alert->danger(trans('admin/server.alerts.transfer_not_viable'))->flash(); - } + // Notify the source node of the pending outgoing transfer. + $this->daemonTransferRepository->setServer($server)->notify($transfer->newNode, $token); + + return $transfer; + }); + + $this->alert->success(trans('admin/server.alerts.transfer_started'))->flash(); return redirect()->route('admin.servers.view.manage', $server->id); } diff --git a/app/Http/Controllers/Admin/Servers/ServerViewController.php b/app/Http/Controllers/Admin/Servers/ServerViewController.php index 7cf64a2f5..58d8b7d1a 100644 --- a/app/Http/Controllers/Admin/Servers/ServerViewController.php +++ b/app/Http/Controllers/Admin/Servers/ServerViewController.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Controllers\Admin\Servers; -use JavaScript; use Illuminate\View\View; use Illuminate\Http\Request; use Pterodactyl\Models\Nest; @@ -134,7 +133,7 @@ class ServerViewController extends Controller $canTransfer = true; } - JavaScript::put([ + \JavaScript::put([ 'nodeData' => $this->nodeRepository->getNodesForServerCreation(), ]); diff --git a/app/Http/Controllers/Admin/Settings/MailController.php b/app/Http/Controllers/Admin/Settings/MailController.php index 2db87fd58..ab81ec06f 100644 --- a/app/Http/Controllers/Admin/Settings/MailController.php +++ b/app/Http/Controllers/Admin/Settings/MailController.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Controllers\Admin\Settings; -use Exception; use Illuminate\View\View; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -57,8 +56,8 @@ class MailController extends Controller } $values = $request->normalize(); - if (array_get($values, 'mail:password') === '!e') { - $values['mail:password'] = ''; + if (array_get($values, 'mail:mailers:smtp:password') === '!e') { + $values['mail:mailers:smtp:password'] = ''; } foreach ($values as $key => $value) { @@ -82,7 +81,7 @@ class MailController extends Controller try { Notification::route('mail', $request->user()->email) ->notify(new MailTested($request->user())); - } catch (Exception $exception) { + } catch (\Exception $exception) { return response($exception->getMessage(), 500); } diff --git a/app/Http/Controllers/Api/Client/Servers/BackupController.php b/app/Http/Controllers/Api/Client/Servers/BackupController.php index 7a35341c1..11907c5b3 100644 --- a/app/Http/Controllers/Api/Client/Servers/BackupController.php +++ b/app/Http/Controllers/Api/Client/Servers/BackupController.php @@ -18,6 +18,7 @@ use Pterodactyl\Transformers\Api\Client\BackupTransformer; use Pterodactyl\Http\Controllers\Api\Client\ClientApiController; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Pterodactyl\Http\Requests\Api\Client\Servers\Backups\StoreBackupRequest; +use Pterodactyl\Http\Requests\Api\Client\Servers\Backups\RestoreBackupRequest; class BackupController extends ClientApiController { @@ -188,12 +189,8 @@ class BackupController extends ClientApiController * * @throws \Throwable */ - public function restore(Request $request, Server $server, Backup $backup): JsonResponse + public function restore(RestoreBackupRequest $request, Server $server, Backup $backup): JsonResponse { - if (!$request->user()->can(Permission::ACTION_BACKUP_RESTORE, $server)) { - throw new AuthorizationException(); - } - // Cannot restore a backup unless a server is fully installed and not currently // processing a different backup restoration request. if (!is_null($server->status)) { diff --git a/app/Http/Controllers/Api/Client/Servers/ScheduleController.php b/app/Http/Controllers/Api/Client/Servers/ScheduleController.php index 50c04c70f..b955fb16b 100644 --- a/app/Http/Controllers/Api/Client/Servers/ScheduleController.php +++ b/app/Http/Controllers/Api/Client/Servers/ScheduleController.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Controllers\Api\Client\Servers; -use Exception; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -178,7 +177,7 @@ class ScheduleController extends ClientApiController $request->input('month'), $request->input('day_of_week') ); - } catch (Exception $exception) { + } catch (\Exception $exception) { throw new DisplayException('The cron data provided does not evaluate to a valid expression.'); } } diff --git a/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php b/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php index addca2876..e2e4389a1 100644 --- a/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php +++ b/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php @@ -9,6 +9,7 @@ use Pterodactyl\Models\Schedule; use Illuminate\Http\JsonResponse; use Pterodactyl\Facades\Activity; use Pterodactyl\Models\Permission; +use Illuminate\Database\ConnectionInterface; use Pterodactyl\Repositories\Eloquent\TaskRepository; use Pterodactyl\Exceptions\Http\HttpForbiddenException; use Pterodactyl\Transformers\Api\Client\TaskTransformer; @@ -23,8 +24,10 @@ class ScheduleTaskController extends ClientApiController /** * ScheduleTaskController constructor. */ - public function __construct(private TaskRepository $repository) - { + public function __construct( + private ConnectionInterface $connection, + private TaskRepository $repository + ) { parent::__construct(); } @@ -49,14 +52,35 @@ class ScheduleTaskController extends ClientApiController $lastTask = $schedule->tasks()->orderByDesc('sequence_id')->first(); /** @var \Pterodactyl\Models\Task $task */ - $task = $this->repository->create([ - 'schedule_id' => $schedule->id, - 'sequence_id' => ($lastTask->sequence_id ?? 0) + 1, - 'action' => $request->input('action'), - 'payload' => $request->input('payload') ?? '', - 'time_offset' => $request->input('time_offset'), - 'continue_on_failure' => (bool) $request->input('continue_on_failure'), - ]); + $task = $this->connection->transaction(function () use ($request, $schedule, $lastTask) { + $sequenceId = ($lastTask->sequence_id ?? 0) + 1; + $requestSequenceId = $request->integer('sequence_id', $sequenceId); + + // Ensure that the sequence id is at least 1. + if ($requestSequenceId < 1) { + $requestSequenceId = 1; + } + + // If the sequence id from the request is greater than or equal to the next available + // sequence id, we don't need to do anything special. Otherwise, we need to update + // the sequence id of all tasks that are greater than or equal to the request sequence + // id to be one greater than the current value. + if ($requestSequenceId < $sequenceId) { + $schedule->tasks() + ->where('sequence_id', '>=', $requestSequenceId) + ->increment('sequence_id'); + $sequenceId = $requestSequenceId; + } + + return $this->repository->create([ + 'schedule_id' => $schedule->id, + 'sequence_id' => $sequenceId, + 'action' => $request->input('action'), + 'payload' => $request->input('payload') ?? '', + 'time_offset' => $request->input('time_offset'), + 'continue_on_failure' => $request->boolean('continue_on_failure'), + ]); + }); Activity::event('server:task.create') ->subject($schedule, $task) @@ -84,12 +108,34 @@ class ScheduleTaskController extends ClientApiController throw new HttpForbiddenException("A backup task cannot be created when the server's backup limit is set to 0."); } - $this->repository->update($task->id, [ - 'action' => $request->input('action'), - 'payload' => $request->input('payload') ?? '', - 'time_offset' => $request->input('time_offset'), - 'continue_on_failure' => (bool) $request->input('continue_on_failure'), - ]); + $this->connection->transaction(function () use ($request, $schedule, $task) { + $sequenceId = $request->integer('sequence_id', $task->sequence_id); + // Ensure that the sequence id is at least 1. + if ($sequenceId < 1) { + $sequenceId = 1; + } + + // Shift all other tasks in the schedule up or down to make room for the new task. + if ($sequenceId < $task->sequence_id) { + $schedule->tasks() + ->where('sequence_id', '>=', $sequenceId) + ->where('sequence_id', '<', $task->sequence_id) + ->increment('sequence_id'); + } elseif ($sequenceId > $task->sequence_id) { + $schedule->tasks() + ->where('sequence_id', '>', $task->sequence_id) + ->where('sequence_id', '<=', $sequenceId) + ->decrement('sequence_id'); + } + + $this->repository->update($task->id, [ + 'sequence_id' => $sequenceId, + 'action' => $request->input('action'), + 'payload' => $request->input('payload') ?? '', + 'time_offset' => $request->input('time_offset'), + 'continue_on_failure' => $request->boolean('continue_on_failure'), + ]); + }); Activity::event('server:task.update') ->subject($schedule, $task) @@ -117,10 +163,9 @@ class ScheduleTaskController extends ClientApiController throw new HttpForbiddenException('You do not have permission to perform this action.'); } - $schedule->tasks()->where('sequence_id', '>', $task->sequence_id)->update([ - 'sequence_id' => $schedule->tasks()->getConnection()->raw('(sequence_id - 1)'), - ]); - + $schedule->tasks() + ->where('sequence_id', '>', $task->sequence_id) + ->decrement('sequence_id'); $task->delete(); Activity::event('server:task.delete')->subject($schedule, $task)->property('name', $schedule->name)->log(); diff --git a/app/Http/Controllers/Api/Client/Servers/SettingsController.php b/app/Http/Controllers/Api/Client/Servers/SettingsController.php index 7f1946a21..b939f1680 100644 --- a/app/Http/Controllers/Api/Client/Servers/SettingsController.php +++ b/app/Http/Controllers/Api/Client/Servers/SettingsController.php @@ -34,13 +34,22 @@ class SettingsController extends ClientApiController */ public function rename(RenameServerRequest $request, Server $server): JsonResponse { + $name = $request->input('name'); + $description = $request->has('description') ? (string) $request->input('description') : $server->description; $this->repository->update($server->id, [ - 'name' => $request->input('name'), + 'name' => $name, + 'description' => $description, ]); - if ($server->name !== $request->input('name')) { + if ($server->name !== $name) { Activity::event('server:settings.rename') - ->property(['old' => $server->name, 'new' => $request->input('name')]) + ->property(['old' => $server->name, 'new' => $name]) + ->log(); + } + + if ($server->description !== $description) { + Activity::event('server:settings.description') + ->property(['old' => $server->description, 'new' => $description]) ->log(); } diff --git a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php index ac9dd5416..b9d12c248 100644 --- a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php +++ b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php @@ -2,9 +2,7 @@ namespace Pterodactyl\Http\Controllers\Api\Remote; -use Exception; use Carbon\Carbon; -use DateTimeInterface; use Illuminate\Support\Str; use Pterodactyl\Models\User; use Webmozart\Assert\Assert; @@ -37,11 +35,11 @@ class ActivityProcessingController extends Controller try { $when = Carbon::createFromFormat( - DateTimeInterface::RFC3339, + \DateTimeInterface::RFC3339, preg_replace('/(\.\d+)Z$/', 'Z', $datum['timestamp']), 'UTC' ); - } catch (Exception $exception) { + } catch (\Exception $exception) { Log::warning($exception, ['timestamp' => $datum['timestamp']]); // If we cannot parse the value for some reason don't blow up this request, just go ahead diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php index e78843763..8fcfbe064 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php @@ -48,8 +48,18 @@ class ServerInstallController extends Controller public function store(InstallationDataRequest $request, string $uuid): JsonResponse { $server = $this->repository->getByUuid($uuid); + $status = null; - $status = $request->boolean('successful') ? null : Server::STATUS_INSTALL_FAILED; + // Make sure the type of failure is accurate + if (!$request->boolean('successful')) { + $status = Server::STATUS_INSTALL_FAILED; + + if ($request->boolean('reinstall')) { + $status = Server::STATUS_REINSTALL_FAILED; + } + } + + // Keep the server suspended if it's already suspended if ($server->status === Server::STATUS_SUSPENDED) { $status = Server::STATUS_SUSPENDED; } diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php index 6f49d66e0..c14ddea97 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Http\Controllers\Api\Remote\Servers; -use Carbon\CarbonImmutable; -use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Http\JsonResponse; use Pterodactyl\Models\Allocation; @@ -11,10 +9,9 @@ use Illuminate\Support\Facades\Log; use Pterodactyl\Models\ServerTransfer; use Illuminate\Database\ConnectionInterface; use Pterodactyl\Http\Controllers\Controller; -use Pterodactyl\Services\Nodes\NodeJWTService; use Pterodactyl\Repositories\Eloquent\ServerRepository; use Pterodactyl\Repositories\Wings\DaemonServerRepository; -use Pterodactyl\Repositories\Wings\DaemonTransferRepository; +use Symfony\Component\HttpKernel\Exception\ConflictHttpException; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; class ServerTransferController extends Controller @@ -25,52 +22,10 @@ class ServerTransferController extends Controller public function __construct( private ConnectionInterface $connection, private ServerRepository $repository, - private DaemonServerRepository $daemonServerRepository, - private DaemonTransferRepository $daemonTransferRepository, - private NodeJWTService $jwtService + private DaemonServerRepository $daemonServerRepository ) { } - /** - * The daemon notifies us about the archive status. - * - * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException - * @throws \Throwable - */ - public function archive(Request $request, string $uuid): JsonResponse - { - $server = $this->repository->getByUuid($uuid); - - // Unsuspend the server and don't continue the transfer. - if (!$request->input('successful')) { - return $this->processFailedTransfer($server->transfer); - } - - $this->connection->transaction(function () use ($server) { - // This token is used by the new node the server is being transferred to. It allows - // that node to communicate with the old node during the process to initiate the - // actual file transfer. - $token = $this->jwtService - ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) - ->setSubject($server->uuid) - ->handle($server->node, $server->uuid, 'sha256'); - - // Update the archived field on the transfer to make clients connect to the websocket - // on the new node to be able to receive transfer logs. - $server->transfer->forceFill(['archived' => true])->saveOrFail(); - - // On the daemon transfer repository, make sure to set the node after the server - // because setServer() tells the repository to use the server's node and not the one - // we want to specify. - $this->daemonTransferRepository - ->setServer($server) - ->setNode($server->transfer->newNode) - ->notify($server, $token); - }); - - return new JsonResponse([], Response::HTTP_NO_CONTENT); - } - /** * The daemon notifies us about a transfer failure. * @@ -79,8 +34,12 @@ class ServerTransferController extends Controller public function failure(string $uuid): JsonResponse { $server = $this->repository->getByUuid($uuid); + $transfer = $server->transfer; + if (is_null($transfer)) { + throw new ConflictHttpException('Server is not being transferred.'); + } - return $this->processFailedTransfer($server->transfer); + return $this->processFailedTransfer($transfer); } /** @@ -92,6 +51,9 @@ class ServerTransferController extends Controller { $server = $this->repository->getByUuid($uuid); $transfer = $server->transfer; + if (is_null($transfer)) { + throw new ConflictHttpException('Server is not being transferred.'); + } /** @var \Pterodactyl\Models\Server $server */ $server = $this->connection->transaction(function () use ($server, $transfer) { diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c874d2ed5..4c905516d 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -86,7 +86,7 @@ class Kernel extends HttpKernel /** * The application's route middleware. */ - protected $routeMiddleware = [ + protected $middlewareAliases = [ 'auth' => Authenticate::class, 'auth.basic' => AuthenticateWithBasicAuth::class, 'auth.session' => AuthenticateSession::class, diff --git a/app/Http/Middleware/Activity/AccountSubject.php b/app/Http/Middleware/Activity/AccountSubject.php index 99db8c83a..fba1ea087 100644 --- a/app/Http/Middleware/Activity/AccountSubject.php +++ b/app/Http/Middleware/Activity/AccountSubject.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Activity; -use Closure; use Illuminate\Http\Request; use Pterodactyl\Facades\LogTarget; @@ -12,7 +11,7 @@ class AccountSubject * Sets the actor and default subject for all requests passing through this * middleware to be the currently logged in user. */ - public function handle(Request $request, Closure $next) + public function handle(Request $request, \Closure $next) { LogTarget::setActor($request->user()); LogTarget::setSubject($request->user()); diff --git a/app/Http/Middleware/Activity/ServerSubject.php b/app/Http/Middleware/Activity/ServerSubject.php index f5c77b3ed..c4dd160c8 100644 --- a/app/Http/Middleware/Activity/ServerSubject.php +++ b/app/Http/Middleware/Activity/ServerSubject.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Activity; -use Closure; use Illuminate\Http\Request; use Pterodactyl\Models\Server; use Pterodactyl\Facades\LogTarget; @@ -17,7 +16,7 @@ class ServerSubject * If no server is found this is a no-op as the activity log service can always * set the user based on the authmanager response. */ - public function handle(Request $request, Closure $next) + public function handle(Request $request, \Closure $next) { $server = $request->route()->parameter('server'); if ($server instanceof Server) { diff --git a/app/Http/Middleware/Activity/TrackAPIKey.php b/app/Http/Middleware/Activity/TrackAPIKey.php index bf3394a23..78aa7055f 100644 --- a/app/Http/Middleware/Activity/TrackAPIKey.php +++ b/app/Http/Middleware/Activity/TrackAPIKey.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Activity; -use Closure; use Illuminate\Http\Request; use Pterodactyl\Models\ApiKey; use Pterodactyl\Facades\LogTarget; @@ -15,7 +14,7 @@ class TrackAPIKey * request singleton so that all tracked activity log events are properly associated * with the given API key. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { if ($request->user()) { $token = $request->user()->currentAccessToken(); diff --git a/app/Http/Middleware/Admin/Servers/ServerInstalled.php b/app/Http/Middleware/Admin/Servers/ServerInstalled.php index 63c90c397..ae99b896e 100644 --- a/app/Http/Middleware/Admin/Servers/ServerInstalled.php +++ b/app/Http/Middleware/Admin/Servers/ServerInstalled.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Admin\Servers; -use Closure; use Illuminate\Http\Request; use Illuminate\Http\Response; use Pterodactyl\Models\Server; @@ -14,7 +13,7 @@ class ServerInstalled /** * Checks that the server is installed before allowing access through the route. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Pterodactyl\Models\Server|null $server */ $server = $request->route()->parameter('server'); diff --git a/app/Http/Middleware/AdminAuthenticate.php b/app/Http/Middleware/AdminAuthenticate.php index 0bd024506..4c7f48bef 100644 --- a/app/Http/Middleware/AdminAuthenticate.php +++ b/app/Http/Middleware/AdminAuthenticate.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -13,7 +12,7 @@ class AdminAuthenticate * * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { if (!$request->user() || !$request->user()->root_admin) { throw new AccessDeniedHttpException(); diff --git a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php index 2e366c471..e6f83b433 100644 --- a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php +++ b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api\Application; -use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -12,7 +11,7 @@ class AuthenticateApplicationUser * Authenticate that the currently authenticated user is an administrator * and should be allowed to proceed through the application API. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Pterodactyl\Models\User|null $user */ $user = $request->user(); diff --git a/app/Http/Middleware/Api/AuthenticateIPAccess.php b/app/Http/Middleware/Api/AuthenticateIPAccess.php index c55ce8b3f..b8a9937ab 100644 --- a/app/Http/Middleware/Api/AuthenticateIPAccess.php +++ b/app/Http/Middleware/Api/AuthenticateIPAccess.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api; -use Closure; use IPTools\IP; use IPTools\Range; use Illuminate\Http\Request; @@ -18,7 +17,7 @@ class AuthenticateIPAccess * @throws \Exception * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Laravel\Sanctum\TransientToken|\Pterodactyl\Models\ApiKey $token */ $token = $request->user()->currentAccessToken(); diff --git a/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php b/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php index 40a4d0cf1..f60b696c1 100644 --- a/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php +++ b/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api\Client\Server; -use Closure; use Illuminate\Http\Request; use Pterodactyl\Models\Server; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -27,7 +26,7 @@ class AuthenticateServerAccess /** * Authenticate that this server exists and is not suspended or marked as installing. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Pterodactyl\Models\User $user */ $user = $request->user(); @@ -53,7 +52,7 @@ class AuthenticateServerAccess // Still allow users to get information about their server if it is installing or // being transferred. if (!$request->routeIs('api:client:server.view')) { - if ($server->isSuspended() && !$request->routeIs('api:client:server.resources')) { + if (($server->isSuspended() || $server->node->isUnderMaintenance()) && !$request->routeIs('api:client:server.resources')) { throw $exception; } if (!$user->root_admin || !$request->routeIs($this->except)) { diff --git a/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php b/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php index 5d3530d86..1157ddced 100644 --- a/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php +++ b/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php @@ -2,11 +2,9 @@ namespace Pterodactyl\Http\Middleware\Api\Client\Server; -use Closure; use Illuminate\Http\Request; use Pterodactyl\Models\Task; use Pterodactyl\Models\User; -use InvalidArgumentException; use Pterodactyl\Models\Backup; use Pterodactyl\Models\Server; use Pterodactyl\Models\Subuser; @@ -26,11 +24,11 @@ class ResourceBelongsToServer * server that is expected, and that we're not accessing a resource completely * unrelated to the server provided in the request. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { $params = $request->route()->parameters(); if (is_null($params) || !$params['server'] instanceof Server) { - throw new InvalidArgumentException('This middleware cannot be used in a context that is missing a server in the parameters.'); + throw new \InvalidArgumentException('This middleware cannot be used in a context that is missing a server in the parameters.'); } /** @var \Pterodactyl\Models\Server $server */ @@ -79,7 +77,7 @@ class ResourceBelongsToServer default: // Don't return a 404 here since we want to make sure no one relies // on this middleware in a context in which it will not work. Fail safe. - throw new InvalidArgumentException('There is no handler configured for a resource of this type: ' . get_class($model)); + throw new \InvalidArgumentException('There is no handler configured for a resource of this type: ' . get_class($model)); } } diff --git a/app/Http/Middleware/Api/Client/SubstituteClientBindings.php b/app/Http/Middleware/Api/Client/SubstituteClientBindings.php index ec30d80fd..af681467d 100644 --- a/app/Http/Middleware/Api/Client/SubstituteClientBindings.php +++ b/app/Http/Middleware/Api/Client/SubstituteClientBindings.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api\Client; -use Closure; use Pterodactyl\Models\Server; use Illuminate\Routing\Middleware\SubstituteBindings; @@ -11,7 +10,7 @@ class SubstituteClientBindings extends SubstituteBindings /** * @param \Illuminate\Http\Request $request */ - public function handle($request, Closure $next): mixed + public function handle($request, \Closure $next): mixed { // Override default behavior of the model binding to use a specific table // column rather than the default 'id'. diff --git a/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php b/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php index cea8bc5ed..6e5ae2a43 100644 --- a/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php +++ b/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api\Daemon; -use Closure; use Illuminate\Http\Request; use Illuminate\Contracts\Encryption\Encrypter; use Pterodactyl\Repositories\Eloquent\NodeRepository; @@ -32,7 +31,7 @@ class DaemonAuthenticate * * @throws \Symfony\Component\HttpKernel\Exception\HttpException */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { if (in_array($request->route()->getName(), $this->except)) { return $next($request); diff --git a/app/Http/Middleware/Api/IsValidJson.php b/app/Http/Middleware/Api/IsValidJson.php index e35173aac..95101a1b2 100644 --- a/app/Http/Middleware/Api/IsValidJson.php +++ b/app/Http/Middleware/Api/IsValidJson.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Http\Middleware\Api; -use Closure; -use JsonException; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -14,12 +12,12 @@ class IsValidJson * parsing the data. This avoids confusing validation errors where every field is flagged and * it is not immediately clear that there is an issue with the JSON being passed. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { if ($request->isJson() && !empty($request->getContent())) { try { json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $exception) { + } catch (\JsonException $exception) { throw new BadRequestHttpException('The JSON data passed in the request appears to be malformed: ' . $exception->getMessage()); } } diff --git a/app/Http/Middleware/LanguageMiddleware.php b/app/Http/Middleware/LanguageMiddleware.php index 2f0d53b47..e98ad2863 100644 --- a/app/Http/Middleware/LanguageMiddleware.php +++ b/app/Http/Middleware/LanguageMiddleware.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; use Illuminate\Http\Request; use Illuminate\Foundation\Application; @@ -18,7 +17,7 @@ class LanguageMiddleware /** * Handle an incoming request and set the user's preferred language. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { $this->app->setLocale($request->user()->language ?? config('app.locale', 'en')); diff --git a/app/Http/Middleware/MaintenanceMiddleware.php b/app/Http/Middleware/MaintenanceMiddleware.php index 9899542d1..61247b4e0 100644 --- a/app/Http/Middleware/MaintenanceMiddleware.php +++ b/app/Http/Middleware/MaintenanceMiddleware.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; use Illuminate\Http\Request; use Illuminate\Contracts\Routing\ResponseFactory; @@ -18,7 +17,7 @@ class MaintenanceMiddleware /** * Handle an incoming request. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Pterodactyl\Models\Server $server */ $server = $request->attributes->get('server'); diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index c1efd927d..ad3eecdc7 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; use Illuminate\Http\Request; use Illuminate\Auth\AuthManager; @@ -18,7 +17,7 @@ class RedirectIfAuthenticated /** * Handle an incoming request. */ - public function handle(Request $request, Closure $next, string $guard = null): mixed + public function handle(Request $request, \Closure $next, string $guard = null): mixed { if ($this->authManager->guard($guard)->check()) { return redirect()->route('index'); diff --git a/app/Http/Middleware/RequireTwoFactorAuthentication.php b/app/Http/Middleware/RequireTwoFactorAuthentication.php index e3307727f..090e146c4 100644 --- a/app/Http/Middleware/RequireTwoFactorAuthentication.php +++ b/app/Http/Middleware/RequireTwoFactorAuthentication.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; use Illuminate\Support\Str; use Illuminate\Http\Request; use Prologue\Alerts\AlertsMessageBag; @@ -34,7 +33,7 @@ class RequireTwoFactorAuthentication * * @throws \Pterodactyl\Exceptions\Http\TwoFactorAuthRequiredException */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { /** @var \Pterodactyl\Models\User $user */ $user = $request->user(); diff --git a/app/Http/Middleware/VerifyReCaptcha.php b/app/Http/Middleware/VerifyReCaptcha.php index 45ae4bb23..ef251c333 100644 --- a/app/Http/Middleware/VerifyReCaptcha.php +++ b/app/Http/Middleware/VerifyReCaptcha.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Http\Middleware; -use Closure; -use stdClass; use GuzzleHttp\Client; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -24,7 +22,7 @@ class VerifyReCaptcha /** * Handle an incoming request. */ - public function handle(Request $request, Closure $next): mixed + public function handle(Request $request, \Closure $next): mixed { if (!$this->config->get('recaptcha.enabled')) { return $next($request); @@ -61,7 +59,7 @@ class VerifyReCaptcha /** * Determine if the response from the recaptcha servers was valid. */ - private function isResponseVerified(stdClass $result, Request $request): bool + private function isResponseVerified(\stdClass $result, Request $request): bool { if (!$this->config->get('recaptcha.verify_domain')) { return false; diff --git a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php index 4475b08fd..3f014e982 100644 --- a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php +++ b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php @@ -13,11 +13,11 @@ class MailSettingsFormRequest extends AdminFormRequest public function rules(): array { return [ - 'mail:host' => 'required|string', - 'mail:port' => 'required|integer|between:1,65535', - 'mail:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])], - 'mail:username' => 'nullable|string|max:191', - 'mail:password' => 'nullable|string|max:191', + 'mail:mailers:smtp:host' => 'required|string', + 'mail:mailers:smtp:port' => 'required|integer|between:1,65535', + 'mail:mailers:smtp:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])], + 'mail:mailers:smtp:username' => 'nullable|string|max:191', + 'mail:mailers:smtp:password' => 'nullable|string|max:191', 'mail:from:address' => 'required|string|email', 'mail:from:name' => 'nullable|string|max:191', ]; @@ -31,8 +31,8 @@ class MailSettingsFormRequest extends AdminFormRequest { $keys = array_flip(array_keys($this->rules())); - if (empty($this->input('mail:password'))) { - unset($keys['mail:password']); + if (empty($this->input('mail:mailers:smtp:password'))) { + unset($keys['mail:mailers:smtp:password']); } return $this->only(array_flip($keys)); diff --git a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php index bc559083e..4fe705448 100644 --- a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php @@ -24,6 +24,7 @@ class StoreNodeRequest extends ApplicationApiRequest 'fqdn', 'scheme', 'behind_proxy', + 'maintenance_mode', 'memory', 'memory_overallocate', 'disk', diff --git a/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php b/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php index bddea153b..3c8cf89ed 100644 --- a/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php +++ b/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Http\Requests\Api\Client\Account; -use Exception; use phpseclib3\Crypt\DSA; use phpseclib3\Crypt\RSA; use Pterodactyl\Models\UserSSHKey; @@ -71,7 +70,7 @@ class StoreSSHKeyRequest extends ClientApiRequest public function getKeyFingerprint(): string { if (!$this->key) { - throw new Exception('The public key was not properly loaded for this request.'); + throw new \Exception('The public key was not properly loaded for this request.'); } return $this->key->getFingerprint('sha256'); diff --git a/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php b/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php new file mode 100644 index 000000000..d2d427f99 --- /dev/null +++ b/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php @@ -0,0 +1,19 @@ + 'required|boolean']; + } +} diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php index 811b87dfb..5ceb7c8e0 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php @@ -23,6 +23,7 @@ class StoreTaskRequest extends ViewScheduleRequest 'payload' => 'required_unless:action,backup|string|nullable', 'time_offset' => 'required|numeric|min:0|max:900', 'sequence_id' => 'sometimes|required|numeric|min:1', + 'continue_on_failure' => 'sometimes|required|boolean', ]; } } diff --git a/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php b/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php index 8cb5efa35..4a74f0a0e 100644 --- a/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php @@ -11,7 +11,7 @@ class RenameServerRequest extends ClientApiRequest implements ClientPermissionsR { /** * Returns the permissions string indicating which permission should be used to - * validate that the authenticated user has permission to perform this action aganist + * validate that the authenticated user has permission to perform this action against * the given resource (server). */ public function permission(): string @@ -26,6 +26,7 @@ class RenameServerRequest extends ClientApiRequest implements ClientPermissionsR { return [ 'name' => Server::getRules()['name'], + 'description' => 'string|nullable', ]; } } diff --git a/app/Http/Requests/Api/Remote/ActivityEventRequest.php b/app/Http/Requests/Api/Remote/ActivityEventRequest.php index 32ad11ad3..43f527dfa 100644 --- a/app/Http/Requests/Api/Remote/ActivityEventRequest.php +++ b/app/Http/Requests/Api/Remote/ActivityEventRequest.php @@ -17,11 +17,11 @@ class ActivityEventRequest extends FormRequest return [ 'data' => ['required', 'array'], 'data.*' => ['array'], - 'data.*.user' => ['present', 'uuid'], + 'data.*.user' => ['sometimes', 'nullable', 'uuid'], 'data.*.server' => ['required', 'uuid'], 'data.*.event' => ['required', 'string'], 'data.*.metadata' => ['present', 'nullable', 'array'], - 'data.*.ip' => ['present', 'ip'], + 'data.*.ip' => ['sometimes', 'nullable', 'ip'], 'data.*.timestamp' => ['required', 'string'], ]; } diff --git a/app/Http/Requests/Api/Remote/InstallationDataRequest.php b/app/Http/Requests/Api/Remote/InstallationDataRequest.php index c5d1973ec..13b3e77d7 100644 --- a/app/Http/Requests/Api/Remote/InstallationDataRequest.php +++ b/app/Http/Requests/Api/Remote/InstallationDataRequest.php @@ -15,6 +15,7 @@ class InstallationDataRequest extends FormRequest { return [ 'successful' => 'present|boolean', + 'reinstall' => 'sometimes|boolean', ]; } } diff --git a/app/Jobs/Schedule/RunTaskJob.php b/app/Jobs/Schedule/RunTaskJob.php index 1e1ab2bb3..be52a4dba 100644 --- a/app/Jobs/Schedule/RunTaskJob.php +++ b/app/Jobs/Schedule/RunTaskJob.php @@ -6,7 +6,6 @@ use Exception; use Pterodactyl\Jobs\Job; use Carbon\CarbonImmutable; use Pterodactyl\Models\Task; -use InvalidArgumentException; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; @@ -72,9 +71,9 @@ class RunTaskJob extends Job implements ShouldQueue $backupService->setIgnoredFiles(explode(PHP_EOL, $this->task->payload))->handle($server, null, true); break; default: - throw new InvalidArgumentException('Invalid task action provided: ' . $this->task->action); + throw new \InvalidArgumentException('Invalid task action provided: ' . $this->task->action); } - } catch (Exception $exception) { + } catch (\Exception $exception) { // If this isn't a DaemonConnectionException on a task that allows for failures // throw the exception back up the chain so that the task is stopped. if (!($this->task->continue_on_failure && $exception instanceof DaemonConnectionException)) { @@ -89,7 +88,7 @@ class RunTaskJob extends Job implements ShouldQueue /** * Handle a failure while sending the action to the daemon or otherwise processing the job. */ - public function failed(Exception $exception = null) + public function failed(\Exception $exception = null) { $this->markTaskNotQueued(); $this->markScheduleComplete(); diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php index 7d900427a..e8f8a4e30 100644 --- a/app/Models/ActivityLog.php +++ b/app/Models/ActivityLog.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Models; use Carbon\Carbon; -use LogicException; use Illuminate\Support\Facades\Event; use Pterodactyl\Events\ActivityLogged; use Illuminate\Database\Eloquent\Builder; @@ -124,7 +123,7 @@ class ActivityLog extends Model public function prunable() { if (is_null(config('activity.prune_days'))) { - throw new LogicException('Cannot prune activity logs: no "prune_days" configuration value is set.'); + throw new \LogicException('Cannot prune activity logs: no "prune_days" configuration value is set.'); } return static::where('timestamp', '<=', Carbon::now()->subDays(config('activity.prune_days'))); diff --git a/app/Models/ApiKey.php b/app/Models/ApiKey.php index 5bfb89549..e141e89a2 100644 --- a/app/Models/ApiKey.php +++ b/app/Models/ApiKey.php @@ -18,6 +18,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property array|null $allowed_ips * @property string|null $memo * @property \Illuminate\Support\Carbon|null $last_used_at + * @property \Illuminate\Support\Carbon|null $expires_at * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property int $r_servers @@ -97,6 +98,10 @@ class ApiKey extends Model protected $casts = [ 'allowed_ips' => 'array', 'user_id' => 'int', + 'last_used_at' => 'datetime', + 'expires_at' => 'datetime', + self::CREATED_AT => 'datetime', + self::UPDATED_AT => 'datetime', 'r_' . AdminAcl::RESOURCE_USERS => 'int', 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'int', 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'int', @@ -117,6 +122,7 @@ class ApiKey extends Model 'allowed_ips', 'memo', 'last_used_at', + 'expires_at', ]; /** @@ -137,6 +143,7 @@ class ApiKey extends Model 'allowed_ips' => 'nullable|array', 'allowed_ips.*' => 'string', 'last_used_at' => 'nullable|date', + 'expires_at' => 'nullable|date', 'r_' . AdminAcl::RESOURCE_USERS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'integer|min:0|max:3', 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'integer|min:0|max:3', @@ -148,12 +155,6 @@ class ApiKey extends Model 'r_' . AdminAcl::RESOURCE_SERVERS => 'integer|min:0|max:3', ]; - protected $dates = [ - self::CREATED_AT, - self::UPDATED_AT, - 'last_used_at', - ]; - /** * Returns the user this token is assigned to. */ diff --git a/app/Models/Backup.php b/app/Models/Backup.php index 41c94fee2..c9a75ccfc 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -43,10 +43,7 @@ class Backup extends Model 'is_locked' => 'bool', 'ignored_files' => 'array', 'bytes' => 'int', - ]; - - protected $dates = [ - 'completed_at', + 'completed_at' => 'datetime', ]; protected $attributes = [ diff --git a/app/Models/Filters/AdminServerFilter.php b/app/Models/Filters/AdminServerFilter.php index 32580ea51..638946734 100644 --- a/app/Models/Filters/AdminServerFilter.php +++ b/app/Models/Filters/AdminServerFilter.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Models\Filters; -use BadMethodCallException; use Spatie\QueryBuilder\Filters\Filter; use Illuminate\Database\Eloquent\Builder; @@ -17,7 +16,7 @@ class AdminServerFilter implements Filter public function __invoke(Builder $query, $value, string $property) { if ($query->getQuery()->from !== 'servers') { - throw new BadMethodCallException('Cannot use the AdminServerFilter against a non-server model.'); + throw new \BadMethodCallException('Cannot use the AdminServerFilter against a non-server model.'); } $query ->select('servers.*') diff --git a/app/Models/Filters/MultiFieldServerFilter.php b/app/Models/Filters/MultiFieldServerFilter.php index 2aac64e81..fe0a7ebd5 100644 --- a/app/Models/Filters/MultiFieldServerFilter.php +++ b/app/Models/Filters/MultiFieldServerFilter.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Models\Filters; -use BadMethodCallException; use Illuminate\Support\Str; use Spatie\QueryBuilder\Filters\Filter; use Illuminate\Database\Eloquent\Builder; @@ -25,7 +24,7 @@ class MultiFieldServerFilter implements Filter public function __invoke(Builder $query, $value, string $property) { if ($query->getQuery()->from !== 'servers') { - throw new BadMethodCallException('Cannot use the MultiFieldServerFilter against a non-server model.'); + throw new \BadMethodCallException('Cannot use the MultiFieldServerFilter against a non-server model.'); } if (preg_match(self::IPV4_REGEX, $value) || preg_match('/^:\d{1,5}$/', $value)) { diff --git a/app/Models/Node.php b/app/Models/Node.php index 37aec760d..62ec82871 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -186,6 +186,11 @@ class Node extends Model ); } + public function isUnderMaintenance(): bool + { + return $this->maintenance_mode; + } + public function mounts(): HasManyThrough { return $this->hasManyThrough(Mount::class, MountNode::class, 'node_id', 'id', 'id', 'mount_id'); diff --git a/app/Models/Permission.php b/app/Models/Permission.php index 6d27a90d3..b2e00070e 100644 --- a/app/Models/Permission.php +++ b/app/Models/Permission.php @@ -195,7 +195,7 @@ class Permission extends Model 'settings' => [ 'description' => 'Permissions that control a user\'s access to the settings for this server.', 'keys' => [ - 'rename' => 'Allows a user to rename this server.', + 'rename' => 'Allows a user to rename this server and change the description of it.', 'reinstall' => 'Allows a user to trigger a reinstall of this server.', ], ], diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php index 183ebb82b..a61bd3cd8 100644 --- a/app/Models/Schedule.php +++ b/app/Models/Schedule.php @@ -71,14 +71,8 @@ class Schedule extends Model 'is_active' => 'boolean', 'is_processing' => 'boolean', 'only_when_online' => 'boolean', - ]; - - /** - * Columns to mutate to a date. - */ - protected $dates = [ - 'last_run_at', - 'next_run_at', + 'last_run_at' => 'datetime', + 'next_run_at' => 'datetime', ]; protected $attributes = [ diff --git a/app/Models/Server.php b/app/Models/Server.php index 5ad99151a..d53af3038 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -115,6 +115,7 @@ class Server extends Model public const STATUS_INSTALLING = 'installing'; public const STATUS_INSTALL_FAILED = 'install_failed'; + public const STATUS_REINSTALL_FAILED = 'reinstall_failed'; public const STATUS_SUSPENDED = 'suspended'; public const STATUS_RESTORING_BACKUP = 'restoring_backup'; @@ -138,11 +139,6 @@ class Server extends Model */ protected $with = ['allocation']; - /** - * The attributes that should be mutated to dates. - */ - protected $dates = [self::CREATED_AT, self::UPDATED_AT, 'deleted_at', 'installed_at']; - /** * Fields that are not mass assignable. */ @@ -192,6 +188,10 @@ class Server extends Model 'database_limit' => 'integer', 'allocation_limit' => 'integer', 'backup_limit' => 'integer', + self::CREATED_AT => 'datetime', + self::UPDATED_AT => 'datetime', + 'deleted_at' => 'datetime', + 'installed_at' => 'datetime', ]; /** @@ -354,6 +354,7 @@ class Server extends Model { if ( $this->isSuspended() || + $this->node->isUnderMaintenance() || !$this->isInstalled() || $this->status === self::STATUS_RESTORING_BACKUP || !is_null($this->transfer) diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 52c7f1cff..b8812bc66 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -2,6 +2,13 @@ namespace Pterodactyl\Models; +/** + * Pterodactyl\Models\Setting. + * + * @property int $id + * @property string $key + * @property string $value + */ class Setting extends Model { /** diff --git a/app/Models/TaskLog.php b/app/Models/TaskLog.php index 0efd77ff4..81b7fdb78 100644 --- a/app/Models/TaskLog.php +++ b/app/Models/TaskLog.php @@ -23,10 +23,8 @@ class TaskLog extends Model 'id' => 'integer', 'task_id' => 'integer', 'run_status' => 'integer', + 'run_time' => 'datetime', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', ]; - - /** - * The attributes that should be mutated to dates. - */ - protected $dates = ['run_time', 'created_at', 'updated_at']; } diff --git a/app/Models/User.php b/app/Models/User.php index df8271cf4..c22c21c81 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -134,10 +134,9 @@ class User extends Model implements 'root_admin' => 'boolean', 'use_totp' => 'boolean', 'gravatar' => 'boolean', + 'totp_authenticated_at' => 'datetime', ]; - protected $dates = ['totp_authenticated_at']; - /** * The attributes excluded from the model's JSON form. */ diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d4ffdadbb..63c12014b 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,12 +2,12 @@ namespace Pterodactyl\Providers; -use View; -use Cache; use Pterodactyl\Models; use Illuminate\Support\Str; use Illuminate\Support\Facades\URL; use Illuminate\Pagination\Paginator; +use Illuminate\Support\Facades\View; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; use Pterodactyl\Extensions\Themes\Theme; @@ -18,7 +18,7 @@ class AppServiceProvider extends ServiceProvider /** * Bootstrap any application services. */ - public function boot() + public function boot(): void { Schema::defaultStringLength(191); @@ -54,7 +54,7 @@ class AppServiceProvider extends ServiceProvider /** * Register application service providers. */ - public function register() + public function register(): void { // Only load the settings service provider if the environment // is configured to allow it. diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index fed77e15a..9f9556b9a 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -17,14 +17,12 @@ class AuthServiceProvider extends ServiceProvider Server::class => ServerPolicy::class, ]; - public function boot() + public function boot(): void { Sanctum::usePersonalAccessTokenModel(ApiKey::class); - - $this->registerPolicies(); } - public function register() + public function register(): void { Sanctum::ignoreMigrations(); } diff --git a/app/Providers/BackupsServiceProvider.php b/app/Providers/BackupsServiceProvider.php index 3b22a2069..25ce9bd7a 100644 --- a/app/Providers/BackupsServiceProvider.php +++ b/app/Providers/BackupsServiceProvider.php @@ -11,7 +11,7 @@ class BackupsServiceProvider extends ServiceProvider implements DeferrableProvid /** * Register the S3 backup disk. */ - public function register() + public function register(): void { $this->app->singleton(BackupManager::class, function ($app) { return new BackupManager($app); diff --git a/app/Providers/BladeServiceProvider.php b/app/Providers/BladeServiceProvider.php index 16a17a373..3512acfd9 100644 --- a/app/Providers/BladeServiceProvider.php +++ b/app/Providers/BladeServiceProvider.php @@ -9,7 +9,7 @@ class BladeServiceProvider extends ServiceProvider /** * Perform post-registration booting of services. */ - public function boot() + public function boot(): void { $this->app->make('blade.compiler') ->directive('datetimeHuman', function ($expression) { diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php index 3f7c84be4..0630a6377 100644 --- a/app/Providers/BroadcastServiceProvider.php +++ b/app/Providers/BroadcastServiceProvider.php @@ -10,7 +10,7 @@ class BroadcastServiceProvider extends ServiceProvider /** * Bootstrap any application services. */ - public function boot() + public function boot(): void { Broadcast::routes(); diff --git a/app/Providers/HashidsServiceProvider.php b/app/Providers/HashidsServiceProvider.php index f094878d0..e2493e8e4 100644 --- a/app/Providers/HashidsServiceProvider.php +++ b/app/Providers/HashidsServiceProvider.php @@ -11,7 +11,7 @@ class HashidsServiceProvider extends ServiceProvider /** * Register the ability to use Hashids. */ - public function register() + public function register(): void { $this->app->singleton(HashidsInterface::class, function () { /** @var \Illuminate\Contracts\Config\Repository $config */ diff --git a/app/Providers/RepositoryServiceProvider.php b/app/Providers/RepositoryServiceProvider.php index 8a0434f52..b06ca7a13 100644 --- a/app/Providers/RepositoryServiceProvider.php +++ b/app/Providers/RepositoryServiceProvider.php @@ -41,9 +41,9 @@ use Pterodactyl\Contracts\Repository\ServerVariableRepositoryInterface; class RepositoryServiceProvider extends ServiceProvider { /** - * Register all of the repository bindings. + * Register all the repository bindings. */ - public function register() + public function register(): void { // Eloquent Repositories $this->app->bind(AllocationRepositoryInterface::class, AllocationRepository::class); diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 8c39a1c26..1355fbd60 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -19,7 +19,7 @@ class RouteServiceProvider extends ServiceProvider /** * Define your route model bindings, pattern filters, etc. */ - public function boot() + public function boot(): void { $this->configureRateLimiting(); @@ -70,7 +70,7 @@ class RouteServiceProvider extends ServiceProvider /** * Configure the rate limiters for the application. */ - protected function configureRateLimiting() + protected function configureRateLimiting(): void { // Authentication rate limiting. For login and checkpoint endpoints we'll apply // a limit of 10 requests per minute, for the forgot password endpoint apply a diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index 9c8a7445e..dbcca85ea 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -37,13 +37,13 @@ class SettingsServiceProvider extends ServiceProvider * when using the SMTP driver. */ protected array $emailKeys = [ - 'mail:host', - 'mail:port', + 'mail:mailers:smtp:host', + 'mail:mailers:smtp:port', + 'mail:mailers:smtp:encryption', + 'mail:mailers:smtp:username', + 'mail:mailers:smtp:password', 'mail:from:address', 'mail:from:name', - 'mail:encryption', - 'mail:username', - 'mail:password', ]; /** @@ -51,13 +51,13 @@ class SettingsServiceProvider extends ServiceProvider * configuration array. */ protected static array $encrypted = [ - 'mail:password', + 'mail:mailers:smtp:password', ]; /** * Boot the service provider. */ - public function boot(ConfigRepository $config, Encrypter $encrypter, Log $log, SettingsRepositoryInterface $settings) + public function boot(ConfigRepository $config, Encrypter $encrypter, Log $log, SettingsRepositoryInterface $settings): void { // Only set the email driver settings from the database if we // are configured using SMTP as the driver. diff --git a/app/Providers/ViewComposerServiceProvider.php b/app/Providers/ViewComposerServiceProvider.php index 9f484e006..8ab7208c7 100644 --- a/app/Providers/ViewComposerServiceProvider.php +++ b/app/Providers/ViewComposerServiceProvider.php @@ -10,7 +10,7 @@ class ViewComposerServiceProvider extends ServiceProvider /** * Register bindings in the container. */ - public function boot() + public function boot(): void { $this->app->make('view')->composer('*', AssetComposer::class); } diff --git a/app/Repositories/Eloquent/PermissionRepository.php b/app/Repositories/Eloquent/PermissionRepository.php index 780ff3439..603829bc1 100644 --- a/app/Repositories/Eloquent/PermissionRepository.php +++ b/app/Repositories/Eloquent/PermissionRepository.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Repositories\Eloquent; -use Exception; use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface; class PermissionRepository extends EloquentRepository implements PermissionRepositoryInterface @@ -14,6 +13,6 @@ class PermissionRepository extends EloquentRepository implements PermissionRepos */ public function model(): string { - throw new Exception('This functionality is not implemented.'); + throw new \Exception('This functionality is not implemented.'); } } diff --git a/app/Repositories/Repository.php b/app/Repositories/Repository.php index 00683f6d7..3cc0863dd 100644 --- a/app/Repositories/Repository.php +++ b/app/Repositories/Repository.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Repositories; -use InvalidArgumentException; use Illuminate\Foundation\Application; use Illuminate\Database\Eloquent\Model; use Pterodactyl\Contracts\Repository\RepositoryInterface; @@ -97,7 +96,7 @@ abstract class Repository implements RepositoryInterface case 2: return $this->model = call_user_func([$this->app->make($model[0]), $model[1]]); default: - throw new InvalidArgumentException('Model must be a FQDN or an array with a count of two.'); + throw new \InvalidArgumentException('Model must be a FQDN or an array with a count of two.'); } } } diff --git a/app/Repositories/Wings/DaemonConfigurationRepository.php b/app/Repositories/Wings/DaemonConfigurationRepository.php index d24fb7e50..5580f9a8b 100644 --- a/app/Repositories/Wings/DaemonConfigurationRepository.php +++ b/app/Repositories/Wings/DaemonConfigurationRepository.php @@ -14,10 +14,10 @@ class DaemonConfigurationRepository extends DaemonRepository * * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException */ - public function getSystemInformation(): array + public function getSystemInformation(?int $version = null): array { try { - $response = $this->getHttpClient()->get('/api/system'); + $response = $this->getHttpClient()->get('/api/system' . (!is_null($version) ? '?v=' . $version : '')); } catch (TransferException $exception) { throw new DaemonConnectionException($exception); } diff --git a/app/Repositories/Wings/DaemonFileRepository.php b/app/Repositories/Wings/DaemonFileRepository.php index eb3649641..ca757151e 100644 --- a/app/Repositories/Wings/DaemonFileRepository.php +++ b/app/Repositories/Wings/DaemonFileRepository.php @@ -2,9 +2,11 @@ namespace Pterodactyl\Repositories\Wings; +use Illuminate\Support\Arr; use Webmozart\Assert\Assert; use Pterodactyl\Models\Server; use Psr\Http\Message\ResponseInterface; +use GuzzleHttp\Exception\ClientException; use GuzzleHttp\Exception\TransferException; use Pterodactyl\Exceptions\Http\Server\FileSizeTooLargeException; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; @@ -31,12 +33,11 @@ class DaemonFileRepository extends DaemonRepository 'query' => ['file' => $path], ] ); - } catch (TransferException $exception) { + } catch (ClientException|TransferException $exception) { throw new DaemonConnectionException($exception); } - $length = (int) $response->getHeader('Content-Length')[0] ?? 0; - + $length = (int) Arr::get($response->getHeader('Content-Length'), 0, 0); if ($notLargerThan && $length > $notLargerThan) { throw new FileSizeTooLargeException(); } @@ -231,6 +232,9 @@ class DaemonFileRepository extends DaemonRepository 'root' => $root ?? '/', 'file' => $file, ], + // Wait for up to 15 minutes for the decompress to be completed when calling this endpoint + // since it will likely take quite awhile for large directories. + 'timeout' => 60 * 15, ] ); } catch (TransferException $exception) { diff --git a/app/Repositories/Wings/DaemonTransferRepository.php b/app/Repositories/Wings/DaemonTransferRepository.php index 3939a47cd..9c8745232 100644 --- a/app/Repositories/Wings/DaemonTransferRepository.php +++ b/app/Repositories/Wings/DaemonTransferRepository.php @@ -2,8 +2,8 @@ namespace Pterodactyl\Repositories\Wings; +use Pterodactyl\Models\Node; use Lcobucci\JWT\Token\Plain; -use Pterodactyl\Models\Server; use GuzzleHttp\Exception\GuzzleException; use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException; @@ -12,16 +12,16 @@ class DaemonTransferRepository extends DaemonRepository /** * @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException */ - public function notify(Server $server, Plain $token): void + public function notify(Node $targetNode, Plain $token): void { try { - $this->getHttpClient()->post('/api/transfer', [ + $this->getHttpClient()->post(sprintf('/api/servers/%s/transfer', $this->server->uuid), [ 'json' => [ - 'server_id' => $server->uuid, - 'url' => $server->node->getConnectionAddress() . sprintf('/api/servers/%s/archive', $server->uuid), + 'server_id' => $this->server->uuid, + 'url' => $targetNode->getConnectionAddress() . '/api/transfers', 'token' => 'Bearer ' . $token->toString(), 'server' => [ - 'uuid' => $server->uuid, + 'uuid' => $this->server->uuid, 'start_on_completion' => false, ], ], diff --git a/app/Services/Acl/Api/AdminAcl.php b/app/Services/Acl/Api/AdminAcl.php index 59c910c19..cee076e17 100644 --- a/app/Services/Acl/Api/AdminAcl.php +++ b/app/Services/Acl/Api/AdminAcl.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Services\Acl\Api; -use ReflectionClass; use Pterodactyl\Models\ApiKey; class AdminAcl @@ -63,7 +62,7 @@ class AdminAcl */ public static function getResourceList(): array { - $reflect = new ReflectionClass(__CLASS__); + $reflect = new \ReflectionClass(__CLASS__); return collect($reflect->getConstants())->filter(function ($value, $key) { return substr($key, 0, 9) === 'RESOURCE_'; diff --git a/app/Services/Activity/ActivityLogService.php b/app/Services/Activity/ActivityLogService.php index fa4f46936..f86385214 100644 --- a/app/Services/Activity/ActivityLogService.php +++ b/app/Services/Activity/ActivityLogService.php @@ -99,7 +99,7 @@ class ActivityLogService } /** - * Sets a custom property on the activty log instance. + * Sets a custom property on the activity log instance. * * @param string|array $key * @param mixed $value @@ -115,7 +115,7 @@ class ActivityLogService } /** - * Attachs the instance request metadata to the activity log event. + * Attaches the instance request metadata to the activity log event. */ public function withRequestMetadata(): self { diff --git a/app/Services/Allocations/AssignmentService.php b/app/Services/Allocations/AssignmentService.php index ec79d18f1..54994ee72 100644 --- a/app/Services/Allocations/AssignmentService.php +++ b/app/Services/Allocations/AssignmentService.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Services\Allocations; -use Exception; use IPTools\Network; use Pterodactyl\Models\Node; use Illuminate\Database\ConnectionInterface; @@ -54,7 +53,7 @@ class AssignmentService // IP to use, not multiple. $underlying = gethostbyname($data['allocation_ip']); $parsed = Network::parse($underlying); - } catch (Exception $exception) { + } catch (\Exception $exception) { /* @noinspection PhpUndefinedVariableInspection */ throw new DisplayException("Could not parse provided allocation IP address ({$underlying}): {$exception->getMessage()}", $exception); } diff --git a/app/Services/Databases/DatabaseManagementService.php b/app/Services/Databases/DatabaseManagementService.php index b70cb8b4d..20de6a78f 100644 --- a/app/Services/Databases/DatabaseManagementService.php +++ b/app/Services/Databases/DatabaseManagementService.php @@ -3,7 +3,6 @@ namespace Pterodactyl\Services\Databases; use Exception; -use InvalidArgumentException; use Pterodactyl\Models\Server; use Pterodactyl\Models\Database; use Pterodactyl\Helpers\Utilities; @@ -86,7 +85,7 @@ class DatabaseManagementService // Protect against developer mistakes... if (empty($data['database']) || !preg_match(self::MATCH_NAME_REGEX, $data['database'])) { - throw new InvalidArgumentException('The database name passed to DatabaseManagementService::handle MUST be prefixed with "s{server_id}_".'); + throw new \InvalidArgumentException('The database name passed to DatabaseManagementService::handle MUST be prefixed with "s{server_id}_".'); } $data = array_merge($data, [ @@ -117,14 +116,14 @@ class DatabaseManagementService return $database; }); - } catch (Exception $exception) { + } catch (\Exception $exception) { try { if ($database instanceof Database) { $this->repository->dropDatabase($database->database); $this->repository->dropUser($database->username, $database->remote); $this->repository->flush(); } - } catch (Exception $deletionException) { + } catch (\Exception $deletionException) { // Do nothing here. We've already encountered an issue before this point so no // reason to prioritize this error over the initial one. } diff --git a/app/Services/Helpers/AssetHashService.php b/app/Services/Helpers/AssetHashService.php index 2e1c1aaa6..725a56669 100644 --- a/app/Services/Helpers/AssetHashService.php +++ b/app/Services/Helpers/AssetHashService.php @@ -5,6 +5,7 @@ namespace Pterodactyl\Services\Helpers; use Illuminate\Support\Arr; use Illuminate\Filesystem\FilesystemManager; use Illuminate\Contracts\Filesystem\Filesystem; +use Pterodactyl\Exceptions\ManifestDoesNotExistException; class AssetHashService { @@ -106,6 +107,11 @@ class AssetHashService ); } - return static::$manifest; + $manifest = static::$manifest; + if ($manifest === null) { + throw new ManifestDoesNotExistException(); + } + + return $manifest; } } diff --git a/app/Services/Nodes/NodeCreationService.php b/app/Services/Nodes/NodeCreationService.php index e4946bc20..b21589c4a 100644 --- a/app/Services/Nodes/NodeCreationService.php +++ b/app/Services/Nodes/NodeCreationService.php @@ -13,7 +13,7 @@ class NodeCreationService /** * NodeCreationService constructor. */ - public function __construct(private Encrypter $encrypter, protected NodeRepositoryInterface $repository) + public function __construct(protected NodeRepositoryInterface $repository) { } @@ -25,7 +25,7 @@ class NodeCreationService public function handle(array $data): Node { $data['uuid'] = Uuid::uuid4()->toString(); - $data['daemon_token'] = $this->encrypter->encrypt(Str::random(Node::DAEMON_TOKEN_LENGTH)); + $data['daemon_token'] = app(Encrypter::class)->encrypt(Str::random(Node::DAEMON_TOKEN_LENGTH)); $data['daemon_token_id'] = Str::random(Node::DAEMON_TOKEN_ID_LENGTH); return $this->repository->create($data, true, true); diff --git a/app/Services/Nodes/NodeJWTService.php b/app/Services/Nodes/NodeJWTService.php index fc34494e2..105715a40 100644 --- a/app/Services/Nodes/NodeJWTService.php +++ b/app/Services/Nodes/NodeJWTService.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Services\Nodes; -use DateTimeImmutable; use Carbon\CarbonImmutable; use Illuminate\Support\Str; use Pterodactyl\Models\Node; @@ -19,7 +18,7 @@ class NodeJWTService private ?User $user = null; - private ?DateTimeImmutable $expiresAt; + private ?\DateTimeImmutable $expiresAt; private ?string $subject = null; @@ -44,7 +43,7 @@ class NodeJWTService return $this; } - public function setExpiresAt(DateTimeImmutable $date): self + public function setExpiresAt(\DateTimeImmutable $date): self { $this->expiresAt = $date; diff --git a/app/Services/Schedules/ProcessScheduleService.php b/app/Services/Schedules/ProcessScheduleService.php index cfbc7e5ca..56b708499 100644 --- a/app/Services/Schedules/ProcessScheduleService.php +++ b/app/Services/Schedules/ProcessScheduleService.php @@ -56,7 +56,7 @@ class ProcessScheduleService return; } - } catch (Exception $exception) { + } catch (\Exception $exception) { if (!$exception instanceof DaemonConnectionException) { // If we encountered some exception during this process that wasn't just an // issue connecting to Wings run the failed sequence for a job. Otherwise we @@ -78,7 +78,7 @@ class ProcessScheduleService // @see https://github.com/pterodactyl/panel/issues/2550 try { $this->dispatcher->dispatchNow($job); - } catch (Exception $exception) { + } catch (\Exception $exception) { $job->failed($exception); throw $exception; diff --git a/app/Services/Servers/ServerDeletionService.php b/app/Services/Servers/ServerDeletionService.php index be52b0cf4..a83c8feb6 100644 --- a/app/Services/Servers/ServerDeletionService.php +++ b/app/Services/Servers/ServerDeletionService.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Services\Servers; -use Exception; use Illuminate\Http\Response; use Pterodactyl\Models\Server; use Illuminate\Support\Facades\Log; @@ -61,7 +60,7 @@ class ServerDeletionService foreach ($server->databases as $database) { try { $this->databaseManagementService->delete($database); - } catch (Exception $exception) { + } catch (\Exception $exception) { if (!$this->force) { throw $exception; } diff --git a/app/Services/Servers/TransferService.php b/app/Services/Servers/TransferService.php deleted file mode 100644 index 24ef0a588..000000000 --- a/app/Services/Servers/TransferService.php +++ /dev/null @@ -1,27 +0,0 @@ -daemonServerRepository->setServer($server)->requestArchive(); - } -} diff --git a/app/Services/Telemetry/TelemetryCollectionService.php b/app/Services/Telemetry/TelemetryCollectionService.php new file mode 100644 index 000000000..c2fd12830 --- /dev/null +++ b/app/Services/Telemetry/TelemetryCollectionService.php @@ -0,0 +1,187 @@ +collect(); + } catch (Exception) { + return; + } + + Http::post('https://telemetry.pterodactyl.io', $data); + } + + /** + * Collects telemetry data and returns it as an array. + * + * @throws \Pterodactyl\Exceptions\Model\DataValidationException + */ + public function collect(): array + { + $uuid = $this->settingsRepository->get('app:telemetry:uuid'); + if (is_null($uuid)) { + $uuid = Uuid::uuid4()->toString(); + $this->settingsRepository->set('app:telemetry:uuid', $uuid); + } + + $nodes = Node::all()->map(function ($node) { + try { + $info = $this->daemonConfigurationRepository->setNode($node)->getSystemInformation(2); + } catch (Exception) { + return null; + } + + return [ + 'id' => $node->uuid, + 'version' => Arr::get($info, 'version', ''), + + 'docker' => [ + 'version' => Arr::get($info, 'docker.version', ''), + + 'cgroups' => [ + 'driver' => Arr::get($info, 'docker.cgroups.driver', ''), + 'version' => Arr::get($info, 'docker.cgroups.version', ''), + ], + + 'containers' => [ + 'total' => Arr::get($info, 'docker.containers.total', -1), + 'running' => Arr::get($info, 'docker.containers.running', -1), + 'paused' => Arr::get($info, 'docker.containers.paused', -1), + 'stopped' => Arr::get($info, 'docker.containers.stopped', -1), + ], + + 'storage' => [ + 'driver' => Arr::get($info, 'docker.storage.driver', ''), + 'filesystem' => Arr::get($info, 'docker.storage.filesystem', ''), + ], + + 'runc' => [ + 'version' => Arr::get($info, 'docker.runc.version', ''), + ], + ], + + 'system' => [ + 'architecture' => Arr::get($info, 'system.architecture', ''), + 'cpuThreads' => Arr::get($info, 'system.cpu_threads', ''), + 'memoryBytes' => Arr::get($info, 'system.memory_bytes', ''), + 'kernelVersion' => Arr::get($info, 'system.kernel_version', ''), + 'os' => Arr::get($info, 'system.os', ''), + 'osType' => Arr::get($info, 'system.os_type', ''), + ], + ]; + })->filter(fn ($node) => !is_null($node))->toArray(); + + return [ + 'id' => $uuid, + + 'panel' => [ + 'version' => config('app.version'), + 'phpVersion' => phpversion(), + + 'drivers' => [ + 'backup' => [ + 'type' => config('backups.default'), + ], + + 'cache' => [ + 'type' => config('cache.default'), + ], + + 'database' => [ + 'type' => config('database.default'), + 'version' => DB::getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION), + ], + ], + ], + + 'resources' => [ + 'allocations' => [ + 'count' => Allocation::count(), + 'used' => Allocation::whereNotNull('server_id')->count(), + ], + + 'backups' => [ + 'count' => Backup::count(), + 'bytes' => Backup::sum('bytes'), + ], + + 'eggs' => [ + 'count' => Egg::count(), + // Egg UUIDs are generated randomly on import, so there is not a consistent way to + // determine if servers are using default eggs or not. +// 'server_usage' => Egg::all() +// ->flatMap(fn (Egg $egg) => [$egg->uuid => $egg->servers->count()]) +// ->filter(fn (int $count) => $count > 0) +// ->toArray(), + ], + + 'locations' => [ + 'count' => Location::count(), + ], + + 'mounts' => [ + 'count' => Mount::count(), + ], + + 'nests' => [ + 'count' => Nest::count(), + // Nest UUIDs are generated randomly on import, so there is not a consistent way to + // determine if servers are using default eggs or not. +// 'server_usage' => Nest::all() +// ->flatMap(fn (Nest $nest) => [$nest->uuid => $nest->eggs->sum(fn (Egg $egg) => $egg->servers->count())]) +// ->filter(fn (int $count) => $count > 0) +// ->toArray(), + ], + + 'nodes' => [ + 'count' => Node::count(), + ], + + 'servers' => [ + 'count' => Server::count(), + 'suspended' => Server::where('status', Server::STATUS_SUSPENDED)->count(), + ], + + 'users' => [ + 'count' => User::count(), + 'admins' => User::where('root_admin', true)->count(), + ], + ], + + 'nodes' => $nodes, + ]; + } +} diff --git a/app/Services/Users/TwoFactorSetupService.php b/app/Services/Users/TwoFactorSetupService.php index 87f1e5443..9ce832215 100644 --- a/app/Services/Users/TwoFactorSetupService.php +++ b/app/Services/Users/TwoFactorSetupService.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Services\Users; -use Exception; -use RuntimeException; use Pterodactyl\Models\User; use Illuminate\Contracts\Encryption\Encrypter; use Pterodactyl\Contracts\Repository\UserRepositoryInterface; @@ -38,8 +36,8 @@ class TwoFactorSetupService for ($i = 0; $i < $this->config->get('pterodactyl.auth.2fa.bytes', 16); ++$i) { $secret .= substr(self::VALID_BASE32_CHARACTERS, random_int(0, 31), 1); } - } catch (Exception $exception) { - throw new RuntimeException($exception->getMessage(), 0, $exception); + } catch (\Exception $exception) { + throw new \RuntimeException($exception->getMessage(), 0, $exception); } $this->repository->withoutFreshModel()->update($user->id, [ diff --git a/app/Traits/Controllers/JavascriptInjection.php b/app/Traits/Controllers/JavascriptInjection.php index 206d5ed5f..44fec983a 100644 --- a/app/Traits/Controllers/JavascriptInjection.php +++ b/app/Traits/Controllers/JavascriptInjection.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Traits\Controllers; -use JavaScript; use Illuminate\Http\Request; trait JavascriptInjection @@ -24,6 +23,6 @@ trait JavascriptInjection */ public function plainInject(array $args = []): string { - return JavaScript::put($args); + return \JavaScript::put($args); } } diff --git a/app/Traits/Controllers/PlainJavascriptInjection.php b/app/Traits/Controllers/PlainJavascriptInjection.php index eb2f6559f..2c0832cde 100644 --- a/app/Traits/Controllers/PlainJavascriptInjection.php +++ b/app/Traits/Controllers/PlainJavascriptInjection.php @@ -11,6 +11,6 @@ trait PlainJavascriptInjection */ public function injectJavascript($data) { - JavaScript::put($data); + \JavaScript::put($data); } } diff --git a/app/Traits/Services/ValidatesValidationRules.php b/app/Traits/Services/ValidatesValidationRules.php index 32265da74..5456cb017 100644 --- a/app/Traits/Services/ValidatesValidationRules.php +++ b/app/Traits/Services/ValidatesValidationRules.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Traits\Services; -use BadMethodCallException; use Illuminate\Support\Str; use Illuminate\Contracts\Validation\Factory as ValidationFactory; use Pterodactyl\Exceptions\Service\Egg\Variable\BadValidationRuleException; @@ -21,7 +20,7 @@ trait ValidatesValidationRules { try { $this->getValidator()->make(['__TEST' => 'test'], ['__TEST' => $rules])->fails(); - } catch (BadMethodCallException $exception) { + } catch (\BadMethodCallException $exception) { $matches = []; if (preg_match('/Method \[(.+)\] does not exist\./', $exception->getMessage(), $matches)) { throw new BadValidationRuleException(trans('exceptions.nest.variables.bad_validation_rule', ['rule' => Str::snake(str_replace('validate', '', array_get($matches, 1, 'unknownRule')))]), $exception); diff --git a/app/Transformers/Api/Client/ActivityLogTransformer.php b/app/Transformers/Api/Client/ActivityLogTransformer.php index 849fdc865..57c8ac30e 100644 --- a/app/Transformers/Api/Client/ActivityLogTransformer.php +++ b/app/Transformers/Api/Client/ActivityLogTransformer.php @@ -47,10 +47,10 @@ class ActivityLogTransformer extends BaseClientTransformer * Transforms any array values in the properties into a countable field for easier * use within the translation outputs. */ - protected function properties(ActivityLog $model): array + protected function properties(ActivityLog $model): object { if (!$model->properties || $model->properties->isEmpty()) { - return []; + return (object) []; } $properties = $model->properties @@ -76,7 +76,7 @@ class ActivityLogTransformer extends BaseClientTransformer $properties = $properties->merge(['count' => $properties->get($keys[0])])->except($keys[0]); } - return $properties->toArray(); + return (object) $properties->toArray(); } /** diff --git a/app/Transformers/Api/Client/EggVariableTransformer.php b/app/Transformers/Api/Client/EggVariableTransformer.php index 129494251..09c344249 100644 --- a/app/Transformers/Api/Client/EggVariableTransformer.php +++ b/app/Transformers/Api/Client/EggVariableTransformer.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Transformers\Api\Client; -use BadMethodCallException; use Pterodactyl\Models\EggVariable; class EggVariableTransformer extends BaseClientTransformer @@ -18,7 +17,7 @@ class EggVariableTransformer extends BaseClientTransformer // them into the transformer and along to the user. Just throw an exception and break the entire // pathway since you should never be exposing these types of variables to a client. if (!$variable->user_viewable) { - throw new BadMethodCallException('Cannot transform a hidden egg variable in a client transformer.'); + throw new \BadMethodCallException('Cannot transform a hidden egg variable in a client transformer.'); } return [ diff --git a/app/Transformers/Api/Client/ServerTransformer.php b/app/Transformers/Api/Client/ServerTransformer.php index 8ae4ed4a6..9f7bce958 100644 --- a/app/Transformers/Api/Client/ServerTransformer.php +++ b/app/Transformers/Api/Client/ServerTransformer.php @@ -43,6 +43,7 @@ class ServerTransformer extends BaseClientTransformer 'uuid' => $server->uuid, 'name' => $server->name, 'node' => $server->node->name, + 'is_node_under_maintenance' => $server->node->isUnderMaintenance(), 'sftp_details' => [ 'ip' => $server->node->fqdn, 'port' => $server->node->daemonSFTP, diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore old mode 100755 new mode 100644 diff --git a/bootstrap/tests.php b/bootstrap/tests.php index 35479a0cd..5b5449355 100644 --- a/bootstrap/tests.php +++ b/bootstrap/tests.php @@ -1,5 +1,6 @@ bootstrap(); $output = new ConsoleOutput(); $prefix = 'database.connections.' . config('database.default'); -if (config("$prefix.database") !== 'panel_test') { +if (!Str::contains(config("$prefix.database"), 'test')) { $output->writeln(PHP_EOL . 'Cannot run test process against non-testing database.'); $output->writeln(PHP_EOL . 'Environment is currently pointed at: "' . config("$prefix.database") . '".'); exit(1); diff --git a/composer.json b/composer.json index 19d7f4a17..f0a255d21 100644 --- a/composer.json +++ b/composer.json @@ -17,53 +17,53 @@ } ], "require": { - "php": "^8.0.2 || ^8.1", + "php": "^8.1 || ^8.2", "ext-json": "*", "ext-mbstring": "*", "ext-pdo": "*", "ext-pdo_mysql": "*", "ext-posix": "*", "ext-zip": "*", - "aws/aws-sdk-php": "~3.238.2", - "doctrine/dbal": "~3.4.5", + "aws/aws-sdk-php": "~3.260.1", + "doctrine/dbal": "~3.6.0", "guzzlehttp/guzzle": "~7.5.0", - "hashids/hashids": "~4.1.0", - "laracasts/utilities": "~3.2.1", - "laravel/framework": "^9.34.0", - "laravel/helpers": "~1.5.0", - "laravel/sanctum": "~2.15.1", - "laravel/tinker": "~2.7.2", - "laravel/ui": "~3.4.6", - "lcobucci/jwt": "~4.2.1", - "league/flysystem-aws-s3-v3": "~3.5.0", - "league/flysystem-memory": "~3.3.0", + "hashids/hashids": "~5.0.0", + "laracasts/utilities": "~3.2.2", + "laravel/framework": "~10.1.3", + "laravel/helpers": "~1.6.0", + "laravel/sanctum": "~3.2.1", + "laravel/tinker": "~2.8.1", + "laravel/ui": "~4.2.1", + "lcobucci/jwt": "~4.3.0", + "league/flysystem-aws-s3-v3": "~3.12.2", + "league/flysystem-memory": "~3.10.3", "matriphe/iso-639": "~1.2", - "phpseclib/phpseclib": "~3.0", - "pragmarx/google2fa": "~5.0.0", - "predis/predis": "~2.0.2", - "prologue/alerts": "~1.0.0", + "phpseclib/phpseclib": "~3.0.18", + "pragmarx/google2fa": "~8.0.0", + "predis/predis": "~2.1.1", + "prologue/alerts": "~1.1.0", "psr/cache": "~3.0.0", - "s1lentium/iptools": "~1.1.1", - "spatie/laravel-fractal": "~6.0.2", - "spatie/laravel-query-builder": "~5.0.3", - "staudenmeir/belongs-to-through": "~2.12.1", - "symfony/http-client": "~6.0", - "symfony/mailgun-mailer": "~6.0", - "symfony/postmark-mailer": "~6.0", - "symfony/yaml": "~5.4", - "webmozart/assert": "~1.11" + "s1lentium/iptools": "~1.2.0", + "spatie/laravel-fractal": "~6.0.3", + "spatie/laravel-query-builder": "~5.1.2", + "staudenmeir/belongs-to-through": "~2.13", + "symfony/http-client": "~6.2.6", + "symfony/mailgun-mailer": "~6.2.5", + "symfony/postmark-mailer": "~6.2.5", + "symfony/yaml": "~6.2.5", + "webmozart/assert": "~1.11.0" }, "require-dev": { - "barryvdh/laravel-ide-helper": "~2.12.3", - "fakerphp/faker": "~1.20", - "friendsofphp/php-cs-fixer": "~3.11", - "itsgoingd/clockwork": "~5.1", - "laravel/dusk": "^7.1", - "mockery/mockery": "~1.5", - "nunomaduro/collision": "~6.3", - "php-mock/php-mock-phpunit": "~2.6", - "phpunit/phpunit": "~9.5", - "spatie/laravel-ignition": "~1.5" + "barryvdh/laravel-ide-helper": "~2.13.0", + "fakerphp/faker": "~1.21.0", + "friendsofphp/php-cs-fixer": "~3.14.4", + "itsgoingd/clockwork": "~5.1.12", + "laravel/dusk": "^7.12", + "laravel/sail": "~1.21.0", + "mockery/mockery": "~1.5.1", + "nunomaduro/collision": "~7.0.5", + "phpunit/phpunit": "~10.0.11", + "spatie/laravel-ignition": "~2.0.0" }, "autoload": { "files": [ @@ -83,24 +83,25 @@ "scripts": { "cs:fix": "php-cs-fixer fix", "cs:check": "php-cs-fixer fix --dry-run --diff --verbose", + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi || true" + ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ - "@php artisan key:generate" - ], - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover || true" + "@php artisan key:generate --ansi" ] }, - "prefer-stable": true, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true, "platform": { - "php": "8.0.2" + "php": "8.1.0" } - } + }, + "minimum-stability": "stable", + "prefer-stable": true } diff --git a/composer.lock b/composer.lock index 5e6e80859..7a241757d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,27 +4,27 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9df3e017d39b7b7642cc1a958979894c", + "content-hash": "d9326ab9c1f29c749d0683c32f4667b6", "packages": [ { "name": "aws/aws-crt-php", - "version": "v1.0.2", + "version": "v1.0.4", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "3942776a8c99209908ee0b287746263725685732" + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732", - "reference": "3942776a8c99209908ee0b287746263725685732", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/f5c64ee7c5fce196e2519b3d9b7138649efe032d", + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.4.3" + "phpunit/phpunit": "^4.8.35|^5.6.3" }, "type": "library", "autoload": { @@ -52,26 +52,26 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.4" }, - "time": "2021-09-03T22:57:30+00:00" + "time": "2023-01-31T23:08:25+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.238.6", + "version": "3.260.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "79a76b438bd20ae687394561b4f28cb6c10db08e" + "reference": "964653acda337343e64344426fa609cf1df930e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/79a76b438bd20ae687394561b4f28cb6c10db08e", - "reference": "79a76b438bd20ae687394561b4f28cb6c10db08e", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/964653acda337343e64344426fa609cf1df930e1", + "reference": "964653acda337343e64344426fa609cf1df930e1", "shasum": "" }, "require": { - "aws/aws-crt-php": "^1.0.2", + "aws/aws-crt-php": "^1.0.4", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", @@ -146,9 +146,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.238.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.260.1" }, - "time": "2022-10-17T18:17:10+00:00" + "time": "2023-02-22T19:23:27+00:00" }, { "name": "brick/math", @@ -208,16 +208,16 @@ }, { "name": "dflydev/dot-access-data", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + "reference": "f41715465d65213d644d3141a6a93081be5d3549" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", "shasum": "" }, "require": { @@ -228,7 +228,7 @@ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", "scrutinizer/ocular": "1.6.0", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.14" + "vimeo/psalm": "^4.0.0" }, "type": "library", "extra": { @@ -277,9 +277,9 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" }, - "time": "2021-08-13T13:06:58+00:00" + "time": "2022-10-27T11:44:00+00:00" }, { "name": "doctrine/cache", @@ -376,38 +376,39 @@ }, { "name": "doctrine/dbal", - "version": "3.4.5", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "a5a58773109c0abb13e658c8ccd92aeec8d07f9e" + "reference": "85b98cb23c8af471a67abfe14485da696bcabc2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/a5a58773109c0abb13e658c8ccd92aeec8d07f9e", - "reference": "a5a58773109c0abb13e658c8ccd92aeec8d07f9e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/85b98cb23c8af471a67abfe14485da696bcabc2e", + "reference": "85b98cb23c8af471a67abfe14485da696bcabc2e", "shasum": "" }, "require": { "composer-runtime-api": "^2", "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1.0", + "doctrine/event-manager": "^1|^2", "php": "^7.4 || ^8.0", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "10.0.0", - "jetbrains/phpstorm-stubs": "2022.2", - "phpstan/phpstan": "1.8.3", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "9.5.24", - "psalm/plugin-phpunit": "0.17.0", + "doctrine/coding-standard": "11.1.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2022.3", + "phpstan/phpstan": "1.9.14", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "9.6.3", + "psalm/plugin-phpunit": "0.18.4", "squizlabs/php_codesniffer": "3.7.1", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.27.0" + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -467,7 +468,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.4.5" + "source": "https://github.com/doctrine/dbal/tree/3.6.0" }, "funding": [ { @@ -483,7 +484,7 @@ "type": "tidelift" } ], - "time": "2022-09-23T17:48:57+00:00" + "time": "2023-02-07T22:52:03+00:00" }, { "name": "doctrine/deprecations", @@ -530,30 +531,29 @@ }, { "name": "doctrine/event-manager", - "version": "1.2.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, "type": "library", "autoload": { @@ -602,7 +602,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" }, "funding": [ { @@ -618,27 +618,27 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:51:15+00:00" + "time": "2022-10-12T20:59:15+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392" + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/ade2b3bbfb776f27f0558e26eed43b5d9fe1b392", - "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^10", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.3", @@ -693,7 +693,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.5" + "source": "https://github.com/doctrine/inflector/tree/2.0.6" }, "funding": [ { @@ -709,35 +709,36 @@ "type": "tidelift" } ], - "time": "2022-09-07T09:01:28+00:00" + "time": "2022-10-20T09:10:12+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -769,7 +770,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -785,7 +786,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "dragonmantank/cron-expression", @@ -850,27 +851,26 @@ }, { "name": "egulias/email-validator", - "version": "3.2.1", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", "shasum": "" }, "require": { - "doctrine/lexer": "^1.2", - "php": ">=7.2", - "symfony/polyfill-intl-idn": "^1.15" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^8.5.8|^9.3.3", - "vimeo/psalm": "^4" + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -878,7 +878,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -906,7 +906,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" }, "funding": [ { @@ -914,7 +914,7 @@ "type": "github" } ], - "time": "2022-06-18T20:57:19+00:00" + "time": "2023-01-14T14:17:03+00:00" }, { "name": "fruitcake/php-cors", @@ -1263,16 +1263,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.4.1", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" + "reference": "67c26b443f348a51926030c83481b85718457d3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", "shasum": "" }, "require": { @@ -1362,7 +1362,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.1" + "source": "https://github.com/guzzle/psr7/tree/2.4.3" }, "funding": [ { @@ -1378,29 +1378,112 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:45:39+00:00" + "time": "2022-10-26T14:07:24+00:00" }, { - "name": "hashids/hashids", - "version": "4.1.0", + "name": "guzzlehttp/uri-template", + "version": "v1.0.1", "source": { "type": "git", - "url": "https://github.com/vinkla/hashids.git", - "reference": "8cab111f78e0bd9c76953b082919fc9e251761be" + "url": "https://github.com/guzzle/uri-template.git", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vinkla/hashids/zipball/8cab111f78e0bd9c76953b082919fc9e251761be", - "reference": "8cab111f78e0bd9c76953b082919fc9e251761be", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2021-10-07T12:57:01+00:00" + }, + { + "name": "hashids/hashids", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/vinkla/hashids.git", + "reference": "197171016b77ddf14e259e186559152eb3f8cf33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vinkla/hashids/zipball/197171016b77ddf14e259e186559152eb3f8cf33", + "reference": "197171016b77ddf14e259e186559152eb3f8cf33", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "require-dev": { - "phpunit/phpunit": "^8.0 || ^9.4", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-bcmath": "Required to use BC Math arbitrary precision mathematics (*).", @@ -1409,7 +1492,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1446,26 +1529,26 @@ ], "support": { "issues": "https://github.com/vinkla/hashids/issues", - "source": "https://github.com/vinkla/hashids/tree/4.1.0" + "source": "https://github.com/vinkla/hashids/tree/5.0.2" }, - "time": "2020-11-26T19:24:33+00:00" + "time": "2023-02-23T15:00:54+00:00" }, { "name": "laracasts/utilities", - "version": "3.2.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer.git", - "reference": "cfcda21b2425652e869af253d385d78e2129e3a2" + "reference": "1cc5d5b9670e5be392df38e0b648fa4842c5a1f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/PHP-Vars-To-Js-Transformer/zipball/cfcda21b2425652e869af253d385d78e2129e3a2", - "reference": "cfcda21b2425652e869af253d385d78e2129e3a2", + "url": "https://api.github.com/repos/laracasts/PHP-Vars-To-Js-Transformer/zipball/1cc5d5b9670e5be392df38e0b648fa4842c5a1f8", + "reference": "1cc5d5b9670e5be392df38e0b648fa4842c5a1f8", "shasum": "" }, "require": { - "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", "php": ">=5.5.0|>=7.2.5|>=8.0.0" }, "require-dev": { @@ -1507,53 +1590,61 @@ ], "support": { "issues": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer/issues", - "source": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer/tree/3.2.1" + "source": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer/tree/3.2.2" }, - "time": "2022-02-09T14:09:45+00:00" + "time": "2023-02-03T13:22:09+00:00" }, { "name": "laravel/framework", - "version": "v9.36.3", + "version": "v10.1.4", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "80ba0561b3682b96743e1c152fde0698bbdb2412" + "reference": "da95415a83fe6216dc78efebfc311365cf4cade0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/80ba0561b3682b96743e1c152fde0698bbdb2412", - "reference": "80ba0561b3682b96743e1c152fde0698bbdb2412", + "url": "https://api.github.com/repos/laravel/framework/zipball/da95415a83fe6216dc78efebfc311365cf4cade0", + "reference": "da95415a83fe6216dc78efebfc311365cf4cade0", "shasum": "" }, "require": { - "doctrine/inflector": "^2.0", + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.3.2", - "egulias/email-validator": "^3.2.1", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", "ext-mbstring": "*", "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", - "laravel/serializable-closure": "^1.2.2", - "league/commonmark": "^2.2", - "league/flysystem": "^3.0.16", - "monolog/monolog": "^2.0", + "guzzlehttp/uri-template": "^1.0", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", "nesbot/carbon": "^2.62.1", "nunomaduro/termwind": "^1.13", - "php": "^8.0.2", + "php": "^8.1", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "ramsey/uuid": "^4.2.2", - "symfony/console": "^6.0.9", - "symfony/error-handler": "^6.0", - "symfony/finder": "^6.0", - "symfony/http-foundation": "^6.0", - "symfony/http-kernel": "^6.0", - "symfony/mailer": "^6.0", - "symfony/mime": "^6.0", - "symfony/process": "^6.0", - "symfony/routing": "^6.0", - "symfony/uid": "^6.0", - "symfony/var-dumper": "^6.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.2", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", "voku/portable-ascii": "^2.0" @@ -1589,6 +1680,7 @@ "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", "illuminate/routing": "self.version", @@ -1602,8 +1694,9 @@ "require-dev": { "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.235.5", - "doctrine/dbal": "^2.13.3|^3.1.4", - "fakerphp/faker": "^1.9.2", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", "guzzlehttp/guzzle": "^7.5", "league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-ftp": "^3.0", @@ -1611,23 +1704,27 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^7.11", + "orchestra/testbench-core": "^8.0", "pda/pheanstalk": "^4.0", + "phpstan/phpdoc-parser": "^1.15", "phpstan/phpstan": "^1.4.7", - "phpunit/phpunit": "^9.5.8", - "predis/predis": "^1.1.9|^2.0.2", - "symfony/cache": "^6.0" + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", "brianium/paratest": "Required to run tests in parallel (^6.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", - "ext-bcmath": "Required to use the multiple_of validation rule.", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", @@ -1642,21 +1739,21 @@ "mockery/mockery": "Required to use mocking (^1.5.1).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", - "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.x-dev" + "dev-master": "10.x-dev" } }, "autoload": { @@ -1695,24 +1792,24 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-10-19T13:23:53+00:00" + "time": "2023-02-23T12:25:38+00:00" }, { "name": "laravel/helpers", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/laravel/helpers.git", - "reference": "c28b0ccd799d58564c41a62395ac9511a1e72931" + "reference": "4dd0f9436d3911611622a6ced8329a1710576f60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/helpers/zipball/c28b0ccd799d58564c41a62395ac9511a1e72931", - "reference": "c28b0ccd799d58564c41a62395ac9511a1e72931", + "url": "https://api.github.com/repos/laravel/helpers/zipball/4dd0f9436d3911611622a6ced8329a1710576f60", + "reference": "4dd0f9436d3911611622a6ced8329a1710576f60", "shasum": "" }, "require": { - "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0", "php": "^7.1.3|^8.0" }, "require-dev": { @@ -1749,41 +1846,41 @@ "laravel" ], "support": { - "source": "https://github.com/laravel/helpers/tree/v1.5.0" + "source": "https://github.com/laravel/helpers/tree/v1.6.0" }, - "time": "2022-01-12T15:58:51+00:00" + "time": "2023-01-09T14:48:11+00:00" }, { "name": "laravel/sanctum", - "version": "v2.15.1", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473" + "reference": "d09d69bac55708fcd4a3b305d760e673d888baf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473", - "reference": "31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/d09d69bac55708fcd4a3b305d760e673d888baf9", + "reference": "d09d69bac55708fcd4a3b305d760e673d888baf9", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^6.9|^7.0|^8.0|^9.0", - "illuminate/contracts": "^6.9|^7.0|^8.0|^9.0", - "illuminate/database": "^6.9|^7.0|^8.0|^9.0", - "illuminate/support": "^6.9|^7.0|^8.0|^9.0", - "php": "^7.2|^8.0" + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", - "phpunit/phpunit": "^8.0|^9.3" + "orchestra/testbench": "^7.0|^8.0", + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "3.x-dev" }, "laravel": { "providers": [ @@ -1816,20 +1913,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2022-04-08T13:39:49+00:00" + "time": "2023-01-13T15:41:49+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.2.2", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", "shasum": "" }, "require": { @@ -1876,26 +1973,26 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-09-08T13:45:54+00:00" + "time": "2023-01-30T18:31:20+00:00" }, { "name": "laravel/tinker", - "version": "v2.7.2", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "dff39b661e827dae6e092412f976658df82dbac5" + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", - "reference": "dff39b661e827dae6e092412f976658df82dbac5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.10.4|^0.11.1", "symfony/var-dumper": "^4.3.4|^5.0|^6.0" @@ -1905,7 +2002,7 @@ "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." }, "type": "library", "extra": { @@ -1942,38 +2039,39 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.2" + "source": "https://github.com/laravel/tinker/tree/v2.8.1" }, - "time": "2022-03-23T12:38:24+00:00" + "time": "2023-02-15T16:40:09+00:00" }, { "name": "laravel/ui", - "version": "v3.4.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c" + "reference": "05ff7ac1eb55e2dfd10edcfb18c953684d693907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/65ec5c03f7fee2c8ecae785795b829a15be48c2c", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c", + "url": "https://api.github.com/repos/laravel/ui/zipball/05ff7ac1eb55e2dfd10edcfb18c953684d693907", + "reference": "05ff7ac1eb55e2dfd10edcfb18c953684d693907", "shasum": "" }, "require": { - "illuminate/console": "^8.42|^9.0", - "illuminate/filesystem": "^8.42|^9.0", - "illuminate/support": "^8.82|^9.0", - "illuminate/validation": "^8.42|^9.0", - "php": "^7.3|^8.0" + "illuminate/console": "^9.21|^10.0", + "illuminate/filesystem": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "illuminate/validation": "^9.21|^10.0", + "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0" + "orchestra/testbench": "^7.0|^8.0", + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "4.x-dev" }, "laravel": { "providers": [ @@ -2003,37 +2101,40 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v3.4.6" + "source": "https://github.com/laravel/ui/tree/v4.2.1" }, - "time": "2022-05-20T13:38:08+00:00" + "time": "2023-02-17T09:17:24+00:00" }, { "name": "lcobucci/clock", - "version": "2.2.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/lcobucci/clock.git", - "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3" + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/fb533e093fd61321bfcbac08b131ce805fe183d3", - "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc", "shasum": "" }, "require": { - "php": "^8.0", - "stella-maris/clock": "^0.1.4" + "php": "~8.1.0 || ~8.2.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { "infection/infection": "^0.26", - "lcobucci/coding-standard": "^8.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^9.5" + "lcobucci/coding-standard": "^9.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.27" }, "type": "library", "autoload": { @@ -2054,7 +2155,7 @@ "description": "Yet another clock abstraction", "support": { "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/2.2.0" + "source": "https://github.com/lcobucci/clock/tree/3.0.0" }, "funding": [ { @@ -2066,20 +2167,20 @@ "type": "patreon" } ], - "time": "2022-04-19T19:34:17+00:00" + "time": "2022-12-19T15:00:24+00:00" }, { "name": "lcobucci/jwt", - "version": "4.2.1", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "72ac6d807ee51a70ad376ee03a2387e8646e10f3" + "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/72ac6d807ee51a70ad376ee03a2387e8646e10f3", - "reference": "72ac6d807ee51a70ad376ee03a2387e8646e10f3", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4", + "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4", "shasum": "" }, "require": { @@ -2088,7 +2189,7 @@ "ext-mbstring": "*", "ext-openssl": "*", "ext-sodium": "*", - "lcobucci/clock": "^2.0", + "lcobucci/clock": "^2.0 || ^3.0", "php": "^7.4 || ^8.0" }, "require-dev": { @@ -2128,7 +2229,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.2.1" + "source": "https://github.com/lcobucci/jwt/tree/4.3.0" }, "funding": [ { @@ -2140,20 +2241,20 @@ "type": "patreon" } ], - "time": "2022-08-19T23:14:07+00:00" + "time": "2023-01-02T13:28:00+00:00" }, { "name": "league/commonmark", - "version": "2.3.5", + "version": "2.3.9", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257" + "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84d74485fdb7074f4f9dd6f02ab957b1de513257", - "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c1e114f74e518daca2729ea8c4bf1167038fa4b5", + "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5", "shasum": "" }, "require": { @@ -2173,7 +2274,7 @@ "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4", + "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21", @@ -2181,7 +2282,7 @@ "symfony/finder": "^5.3 | ^6.0", "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0" + "vimeo/psalm": "^4.24.0 || ^5.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -2246,20 +2347,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T10:59:45+00:00" + "time": "2023-02-15T14:07:24+00:00" }, { "name": "league/config", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/config.git", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { @@ -2268,7 +2369,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.5", "scrutinizer/ocular": "^1.8.1", "unleashedtech/php-coding-standard": "^3.1", @@ -2328,20 +2429,20 @@ "type": "github" } ], - "time": "2021-08-14T12:15:32+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/flysystem", - "version": "3.9.0", + "version": "3.12.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "60f3760352fe08e918bc3b1acae4e91af092ebe1" + "reference": "81e87e74dd5213795c7846d65089712d2dda90ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/60f3760352fe08e918bc3b1acae4e91af092ebe1", - "reference": "60f3760352fe08e918bc3b1acae4e91af092ebe1", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce", + "reference": "81e87e74dd5213795c7846d65089712d2dda90ce", "shasum": "" }, "require": { @@ -2357,8 +2458,8 @@ }, "require-dev": { "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.0", - "aws/aws-sdk-php": "^3.198.1", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", @@ -2403,7 +2504,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.9.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.12.3" }, "funding": [ { @@ -2419,25 +2520,25 @@ "type": "tidelift" } ], - "time": "2022-10-18T21:02:43+00:00" + "time": "2023-02-18T15:32:41+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.5.0", + "version": "3.12.2", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "adb6633f325c934c15a099c363dc5362bdcb07a2" + "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/adb6633f325c934c15a099c363dc5362bdcb07a2", - "reference": "adb6633f325c934c15a099c363dc5362bdcb07a2", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/645e14e4a80bd2da8b01e57388e7296a695a80c2", + "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.132.4", - "league/flysystem": "^3.0.0", + "aws/aws-sdk-php": "^3.220.0", + "league/flysystem": "^3.10.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, @@ -2473,7 +2574,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.5.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.12.2" }, "funding": [ { @@ -2489,20 +2590,20 @@ "type": "tidelift" } ], - "time": "2022-09-17T21:00:35+00:00" + "time": "2023-01-17T14:15:08+00:00" }, { "name": "league/flysystem-memory", - "version": "3.3.0", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-memory.git", - "reference": "d2a80fbfd3337fac39eeff64c6c0820b6a4902ce" + "reference": "5405162ac81f4de5aa5fa01aae7d07382b7c797b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/d2a80fbfd3337fac39eeff64c6c0820b6a4902ce", - "reference": "d2a80fbfd3337fac39eeff64c6c0820b6a4902ce", + "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/5405162ac81f4de5aa5fa01aae7d07382b7c797b", + "reference": "5405162ac81f4de5aa5fa01aae7d07382b7c797b", "shasum": "" }, "require": { @@ -2536,7 +2637,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-memory/issues", - "source": "https://github.com/thephpleague/flysystem-memory/tree/3.3.0" + "source": "https://github.com/thephpleague/flysystem-memory/tree/3.10.3" }, "funding": [ { @@ -2552,7 +2653,7 @@ "type": "tidelift" } ], - "time": "2022-09-09T10:03:42+00:00" + "time": "2022-10-26T18:30:26+00:00" }, { "name": "league/fractal", @@ -2730,42 +2831,41 @@ }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + "reference": "9b5daeaffce5b926cac47923798bba91059e60e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9b5daeaffce5b926cac47923798bba91059e60e2", + "reference": "9b5daeaffce5b926cac47923798bba91059e60e2", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^9.5.26", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2788,7 +2888,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2816,7 +2916,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + "source": "https://github.com/Seldaek/monolog/tree/3.3.1" }, "funding": [ { @@ -2828,7 +2928,7 @@ "type": "tidelift" } ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2023-02-06T13:46:10+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2893,16 +2993,16 @@ }, { "name": "nesbot/carbon", - "version": "2.62.1", + "version": "2.66.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a" + "reference": "496712849902241f04902033b0441b269effe001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", + "reference": "496712849902241f04902033b0441b269effe001", "shasum": "" }, "require": { @@ -2913,7 +3013,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -2991,29 +3091,29 @@ "type": "tidelift" } ], - "time": "2022-09-02T07:48:13+00:00" + "time": "2023-01-29T18:53:47+00:00" }, { "name": "nette/schema", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.2" + "php": ">=7.1 <8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", + "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.7" }, "type": "library", @@ -3051,34 +3151,36 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.2" + "source": "https://github.com/nette/schema/tree/v1.2.3" }, - "time": "2021-10-15T11:40:02+00:00" + "time": "2022-10-13T01:24:26+00:00" }, { "name": "nette/utils", - "version": "v3.2.8", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", - "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", "shasum": "" }, "require": { - "php": ">=7.2 <8.3" + "php": ">=8.0 <8.3" }, "conflict": { - "nette/di": "<3.0.6" + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "nette/tester": "~2.0", + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.3" + "tracy/tracy": "^2.9" }, "suggest": { "ext-gd": "to use Image", @@ -3092,7 +3194,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3136,22 +3238,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.8" + "source": "https://github.com/nette/utils/tree/v4.0.0" }, - "time": "2022-09-12T23:36:20+00:00" + "time": "2023-02-02T10:41:53+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "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/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -3192,22 +3294,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.14.1", + "version": "v1.15.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "86fc30eace93b9b6d4c844ba6de76db84184e01b" + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/86fc30eace93b9b6d4c844ba6de76db84184e01b", - "reference": "86fc30eace93b9b6d4c844ba6de76db84184e01b", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", "shasum": "" }, "require": { @@ -3264,7 +3366,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.14.1" + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" }, "funding": [ { @@ -3280,7 +3382,7 @@ "type": "github" } ], - "time": "2022-10-17T15:20:29+00:00" + "time": "2023-02-08T01:06:31+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -3476,16 +3578,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.16", + "version": "3.0.18", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "7181378909ed8890be4db53d289faac5b77f8b05" + "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7181378909ed8890be4db53d289faac5b77f8b05", - "reference": "7181378909ed8890be4db53d289faac5b77f8b05", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da", + "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da", "shasum": "" }, "require": { @@ -3566,7 +3668,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.16" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.18" }, "funding": [ { @@ -3582,42 +3684,34 @@ "type": "tidelift" } ], - "time": "2022-09-05T18:03:08+00:00" + "time": "2022-12-17T18:26:50+00:00" }, { "name": "pragmarx/google2fa", - "version": "v5.0.0", + "version": "v8.0.1", "source": { "type": "git", "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4" + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/17c969c82f427dd916afe4be50bafc6299aef1b4", - "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "~1.0|~2.0", - "paragonie/random_compat": ">=1", - "php": ">=5.4", - "symfony/polyfill-php56": "~1.2" + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" }, "require-dev": { - "phpunit/phpunit": "~4|~5|~6" + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" }, "type": "library", - "extra": { - "component": "package", - "branch-alias": { - "dev-master": "2.0-dev" - } - }, "autoload": { "psr-4": { - "PragmaRX\\Google2FA\\": "src/", - "PragmaRX\\Google2FA\\Tests\\": "tests/" + "PragmaRX\\Google2FA\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3640,22 +3734,22 @@ ], "support": { "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/master" + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" }, - "time": "2019-03-19T22:44:16+00:00" + "time": "2022-06-13T21:57:56+00:00" }, { "name": "predis/predis", - "version": "v2.0.3", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "ff59f745815150c65ed388f7d64e7660fe961771" + "reference": "c5b60884e89630f9518a7919f0566db438f0fc9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/ff59f745815150c65ed388f7d64e7660fe961771", - "reference": "ff59f745815150c65ed388f7d64e7660fe961771", + "url": "https://api.github.com/repos/predis/predis/zipball/c5b60884e89630f9518a7919f0566db438f0fc9a", + "reference": "c5b60884e89630f9518a7919f0566db438f0fc9a", "shasum": "" }, "require": { @@ -3665,8 +3759,7 @@ "phpunit/phpunit": "^8.0 || ~9.4.4" }, "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + "ext-curl": "Allows access to Webdis when paired with phpiredis" }, "type": "library", "extra": { @@ -3684,16 +3777,16 @@ "MIT" ], "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net", - "role": "Creator & Maintainer" - }, { "name": "Till Krüss", "homepage": "https://till.im", "role": "Maintainer" + }, + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net", + "role": "Creator" } ], "description": "A flexible and feature-complete Redis client for PHP.", @@ -3705,7 +3798,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.0.3" + "source": "https://github.com/predis/predis/tree/v2.1.1" }, "funding": [ { @@ -3713,30 +3806,30 @@ "type": "github" } ], - "time": "2022-10-11T16:52:29+00:00" + "time": "2023-01-17T20:57:35+00:00" }, { "name": "prologue/alerts", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/prologuephp/alerts.git", - "reference": "b2880e28814b8dba8768e60e00511627381efe14" + "reference": "33e86d1f64dae7a8d6e29e7d6c282abc77a89b97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/prologuephp/alerts/zipball/b2880e28814b8dba8768e60e00511627381efe14", - "reference": "b2880e28814b8dba8768e60e00511627381efe14", + "url": "https://api.github.com/repos/prologuephp/alerts/zipball/33e86d1f64dae7a8d6e29e7d6c282abc77a89b97", + "reference": "33e86d1f64dae7a8d6e29e7d6c282abc77a89b97", "shasum": "" }, "require": { - "illuminate/config": "~9", - "illuminate/session": "~9", - "illuminate/support": "~9" + "illuminate/config": "~9|^10", + "illuminate/session": "~9|^10", + "illuminate/support": "~9|^10" }, "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.1" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^9" }, "type": "library", "extra": { @@ -3780,9 +3873,9 @@ ], "support": { "issues": "https://github.com/prologuephp/alerts/issues", - "source": "https://github.com/prologuephp/alerts/tree/1.0.0" + "source": "https://github.com/prologuephp/alerts/tree/1.1.0" }, - "time": "2022-01-19T09:28:45+00:00" + "time": "2023-02-01T06:54:14+00:00" }, { "name": "psr/cache", @@ -3833,6 +3926,54 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -4199,16 +4340,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.8", + "version": "v0.11.12", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e" + "reference": "52cb7c47d403c31c0adc9bf7710fc355f93c20f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/f455acf3645262ae389b10e9beba0c358aa6994e", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/52cb7c47d403c31c0adc9bf7710fc355f93c20f7", + "reference": "52cb7c47d403c31c0adc9bf7710fc355f93c20f7", "shasum": "" }, "require": { @@ -4269,9 +4410,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.8" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.12" }, - "time": "2022-07-28T14:25:11+00:00" + "time": "2023-01-29T21:24:40+00:00" }, { "name": "ralouphie/getallheaders", @@ -4319,42 +4460,52 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -4382,7 +4533,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -4394,28 +4545,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", - "version": "4.5.1", + "version": "4.7.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d" + "reference": "433b2014e3979047db08a17a205f410ba3869cf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", - "ext-ctype": "*", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.0" + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -4444,7 +4594,6 @@ }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -4476,7 +4625,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.5.1" + "source": "https://github.com/ramsey/uuid/tree/4.7.3" }, "funding": [ { @@ -4488,29 +4637,29 @@ "type": "tidelift" } ], - "time": "2022-09-16T03:22:46+00:00" + "time": "2023-01-12T18:13:24+00:00" }, { "name": "s1lentium/iptools", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/S1lentium/IPTools.git", - "reference": "f6f8ab6132ca7443bd7cced1681f5066d725fd5f" + "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/S1lentium/IPTools/zipball/f6f8ab6132ca7443bd7cced1681f5066d725fd5f", - "reference": "f6f8ab6132ca7443bd7cced1681f5066d725fd5f", + "url": "https://api.github.com/repos/S1lentium/IPTools/zipball/88be1aaaab3c50fc131ebe778e246215ff006d8e", + "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e", "shasum": "" }, "require": { "ext-bcmath": "*", - "php": ">=5.4.0" + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "~1.0" + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^9.0" }, "type": "library", "autoload": { @@ -4541,9 +4690,9 @@ ], "support": { "issues": "https://github.com/S1lentium/IPTools/issues", - "source": "https://github.com/S1lentium/IPTools/tree/master" + "source": "https://github.com/S1lentium/IPTools/tree/v1.2.0" }, - "time": "2018-09-19T06:15:53+00:00" + "time": "2022-08-17T14:28:59+00:00" }, { "name": "spatie/fractalistic", @@ -4608,28 +4757,31 @@ }, { "name": "spatie/laravel-fractal", - "version": "6.0.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/spatie/laravel-fractal.git", - "reference": "1e6b8114389fe8e55eec3a841db02c404458f869" + "reference": "28ea9803d2cba7a7144336a2ba62275316c122c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-fractal/zipball/1e6b8114389fe8e55eec3a841db02c404458f869", - "reference": "1e6b8114389fe8e55eec3a841db02c404458f869", + "url": "https://api.github.com/repos/spatie/laravel-fractal/zipball/28ea9803d2cba7a7144336a2ba62275316c122c8", + "reference": "28ea9803d2cba7a7144336a2ba62275316c122c8", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "league/fractal": "^0.20.1|^0.20", + "nesbot/carbon": "^2.63", "php": "^8.0", - "spatie/fractalistic": "^2.5", + "spatie/fractalistic": "^2.9.5|^2.9", "spatie/laravel-package-tools": "^1.11" }, "require-dev": { "ext-json": "*", - "orchestra/testbench": "^7.0" + "orchestra/testbench": "^7.0|^8.0", + "pestphp/pest": "^1.22" }, "type": "library", "extra": { @@ -4674,8 +4826,7 @@ "transform" ], "support": { - "issues": "https://github.com/spatie/laravel-fractal/issues", - "source": "https://github.com/spatie/laravel-fractal/tree/6.0.2" + "source": "https://github.com/spatie/laravel-fractal/tree/6.0.3" }, "funding": [ { @@ -4683,31 +4834,32 @@ "type": "custom" } ], - "time": "2022-04-04T07:53:13+00:00" + "time": "2023-01-30T22:11:18+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.13.6", + "version": "1.14.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "c377cc7223655c2278c148c1685b8b5a78af5c65" + "reference": "b477dd2f89d0751f0e51ffb3a70181f0bc7ab8df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c377cc7223655c2278c148c1685b8b5a78af5c65", - "reference": "c377cc7223655c2278c148c1685b8b5a78af5c65", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/b477dd2f89d0751f0e51ffb3a70181f0bc7ab8df", + "reference": "b477dd2f89d0751f0e51ffb3a70181f0bc7ab8df", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28", + "illuminate/contracts": "^9.28|^10.0", "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", "phpunit/phpunit": "^9.5.24", - "spatie/test-time": "^1.3" + "spatie/pest-plugin-test-time": "^1.1" }, "type": "library", "autoload": { @@ -4734,7 +4886,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.13.6" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.14.1" }, "funding": [ { @@ -4742,33 +4894,33 @@ "type": "github" } ], - "time": "2022-10-11T06:37:42+00:00" + "time": "2023-01-27T15:33:45+00:00" }, { "name": "spatie/laravel-query-builder", - "version": "5.0.3", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-query-builder.git", - "reference": "2243e3d60fc184ef20ad2b19765bc7006fa9dbfc" + "reference": "5908f58fdff70fb600982b58c187e84855e2b5bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/2243e3d60fc184ef20ad2b19765bc7006fa9dbfc", - "reference": "2243e3d60fc184ef20ad2b19765bc7006fa9dbfc", + "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/5908f58fdff70fb600982b58c187e84855e2b5bc", + "reference": "5908f58fdff70fb600982b58c187e84855e2b5bc", "shasum": "" }, "require": { - "illuminate/database": "^9.0", - "illuminate/http": "^9.0", - "illuminate/support": "^9.0", + "illuminate/database": "^9.0|^10.0", + "illuminate/http": "^9.0|^10.0", + "illuminate/support": "^9.0|^10.0", "php": "^8.0", "spatie/laravel-package-tools": "^1.11" }, "require-dev": { "ext-json": "*", "mockery/mockery": "^1.4", - "orchestra/testbench": "^7.0", + "orchestra/testbench": "^7.0|^8.0", "pestphp/pest": "^1.20", "spatie/laravel-ray": "^1.28" }, @@ -4814,28 +4966,28 @@ "type": "custom" } ], - "time": "2022-07-29T14:19:59+00:00" + "time": "2023-01-24T23:33:10+00:00" }, { "name": "staudenmeir/belongs-to-through", - "version": "v2.12.1", + "version": "v2.13", "source": { "type": "git", "url": "https://github.com/staudenmeir/belongs-to-through.git", - "reference": "8316d274db603f63b16bb1c67379b0fa73209d98" + "reference": "e777027d648971c9686f9d7c284f324db7cce3c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staudenmeir/belongs-to-through/zipball/8316d274db603f63b16bb1c67379b0fa73209d98", - "reference": "8316d274db603f63b16bb1c67379b0fa73209d98", + "url": "https://api.github.com/repos/staudenmeir/belongs-to-through/zipball/e777027d648971c9686f9d7c284f324db7cce3c0", + "reference": "e777027d648971c9686f9d7c284f324db7cce3c0", "shasum": "" }, "require": { - "illuminate/database": "^9.0", - "php": "^8.0.2" + "illuminate/database": "^10.0", + "php": "^8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5.27" }, "type": "library", "autoload": { @@ -4860,7 +5012,7 @@ "description": "Laravel Eloquent BelongsToThrough relationships", "support": { "issues": "https://github.com/staudenmeir/belongs-to-through/issues", - "source": "https://github.com/staudenmeir/belongs-to-through/tree/v2.12.1" + "source": "https://github.com/staudenmeir/belongs-to-through/tree/v2.13" }, "funding": [ { @@ -4868,71 +5020,25 @@ "type": "custom" } ], - "time": "2022-03-10T21:14:19+00:00" - }, - { - "name": "stella-maris/clock", - "version": "0.1.6", - "source": { - "type": "git", - "url": "https://github.com/stella-maris-solutions/clock.git", - "reference": "a94228dac03c9a8411198ce8c8dacbbe99c930c3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stella-maris-solutions/clock/zipball/a94228dac03c9a8411198ce8c8dacbbe99c930c3", - "reference": "a94228dac03c9a8411198ce8c8dacbbe99c930c3", - "shasum": "" - }, - "require": { - "php": "^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "StellaMaris\\Clock\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andreas Heigl", - "role": "Maintainer" - } - ], - "description": "A pre-release of the proposed PSR-20 Clock-Interface", - "homepage": "https://gitlab.com/stella-maris/clock", - "keywords": [ - "clock", - "datetime", - "point in time", - "psr20" - ], - "support": { - "issues": "https://github.com/stella-maris-solutions/clock/issues", - "source": "https://github.com/stella-maris-solutions/clock/tree/0.1.6" - }, - "time": "2022-09-27T15:03:11+00:00" + "time": "2023-01-18T12:40:35+00:00" }, { "name": "symfony/console", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1f89cab8d52c84424f798495b3f10342a7b1a070" + "reference": "3e294254f2191762c1d137aed4b94e966965e985" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1f89cab8d52c84424f798495b3f10342a7b1a070", - "reference": "1f89cab8d52c84424f798495b3f10342a7b1a070", + "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985", + "reference": "3e294254f2191762c1d137aed4b94e966965e985", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.4|^6.0" @@ -4994,7 +5100,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.0.14" + "source": "https://github.com/symfony/console/tree/v6.2.5" }, "funding": [ { @@ -5010,24 +5116,24 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:02:12+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/css-selector", - "version": "v6.0.11", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ab2746acddc4f03a7234c8441822ac5d5c63efe9" + "reference": "bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab2746acddc4f03a7234c8441822ac5d5c63efe9", - "reference": "ab2746acddc4f03a7234c8441822ac5d5c63efe9", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1", + "reference": "bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5059,7 +5165,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.0.11" + "source": "https://github.com/symfony/css-selector/tree/v6.2.5" }, "funding": [ { @@ -5075,29 +5181,29 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:10:44+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.0.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5126,7 +5232,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" }, "funding": [ { @@ -5142,24 +5248,24 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/error-handler", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "81e57c793d9a573f29f8b5296d5d8ee4602badcb" + "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/81e57c793d9a573f29f8b5296d5d8ee4602badcb", - "reference": "81e57c793d9a573f29f8b5296d5d8ee4602badcb", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0092696af0be8e6124b042fbe2890ca1788d7b28", + "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/var-dumper": "^5.4|^6.0" }, @@ -5197,7 +5303,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/v6.0.14" + "source": "https://github.com/symfony/error-handler/tree/v6.2.5" }, "funding": [ { @@ -5213,24 +5319,24 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:02:12+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.0.9", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5c85b58422865d42c6eb46f7693339056db098a8" + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5c85b58422865d42c6eb46f7693339056db098a8", - "reference": "5c85b58422865d42c6eb46f7693339056db098a8", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { @@ -5280,7 +5386,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/v6.0.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5" }, "funding": [ { @@ -5296,24 +5402,24 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:52+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.0.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, "suggest": { @@ -5322,7 +5428,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5359,7 +5465,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" }, "funding": [ { @@ -5375,24 +5481,27 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/finder", - "version": "v6.0.11", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "09cb683ba5720385ea6966e5e06be2a34f2568b1" + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/09cb683ba5720385ea6966e5e06be2a34f2568b1", - "reference": "09cb683ba5720385ea6966e5e06be2a34f2568b1", + "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c", + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" }, "type": "library", "autoload": { @@ -5420,7 +5529,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.0.11" + "source": "https://github.com/symfony/finder/tree/v6.2.5" }, "funding": [ { @@ -5436,25 +5545,26 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:39:48+00:00" + "time": "2023-01-20T17:45:48+00:00" }, { "name": "symfony/http-client", - "version": "v6.0.14", + "version": "v6.2.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "ec183a587e3ad47f03cf1572d4b8437e0fc3e923" + "reference": "6efa9a7521ab7d031a82cf0a759484d1b02a6ad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/ec183a587e3ad47f03cf1572d4b8437e0fc3e923", - "reference": "ec183a587e3ad47f03cf1572d4b8437e0fc3e923", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6efa9a7521ab7d031a82cf0a759484d1b02a6ad9", + "reference": "6efa9a7521ab7d031a82cf0a759484d1b02a6ad9", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/http-client-contracts": "^3", "symfony/service-contracts": "^1.0|^2|^3" }, @@ -5504,7 +5614,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v6.0.14" + "source": "https://github.com/symfony/http-client/tree/v6.2.6" }, "funding": [ { @@ -5520,24 +5630,24 @@ "type": "tidelift" } ], - "time": "2022-10-11T15:20:43+00:00" + "time": "2023-01-30T15:46:28+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.0.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "4184b9b63af1edaf35b6a7974c6f1f9f33294129" + "reference": "c5f587eb445224ddfeb05b5ee703476742d730bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/4184b9b63af1edaf35b6a7974c6f1f9f33294129", - "reference": "4184b9b63af1edaf35b6a7974c6f1f9f33294129", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c5f587eb445224ddfeb05b5ee703476742d730bf", + "reference": "c5f587eb445224ddfeb05b5ee703476742d730bf", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "suggest": { "symfony/http-client-implementation": "" @@ -5545,7 +5655,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5555,7 +5665,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\HttpClient\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5582,7 +5695,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.2.0" }, "funding": [ { @@ -5598,27 +5711,30 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:11:42+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.0.14", + "version": "v6.2.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e8aa505d35660877e6695d68be53df2ceac7cf57" + "reference": "e8dd1f502bc2b3371d05092aa233b064b03ce7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e8aa505d35660877e6695d68be53df2ceac7cf57", - "reference": "e8aa505d35660877e6695d68be53df2ceac7cf57", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e8dd1f502bc2b3371d05092aa233b064b03ce7ed", + "reference": "e8dd1f502bc2b3371d05092aa233b064b03ce7ed", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1" }, + "conflict": { + "symfony/cache": "<6.2" + }, "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^5.4|^6.0", @@ -5657,7 +5773,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.0.14" + "source": "https://github.com/symfony/http-foundation/tree/v6.2.6" }, "funding": [ { @@ -5673,26 +5789,27 @@ "type": "tidelift" } ], - "time": "2022-10-02T08:16:40+00:00" + "time": "2023-01-30T15:46:28+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.0.14", + "version": "v6.2.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc" + "reference": "7122db07b0d8dbf0de682267c84217573aee3ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc", - "reference": "f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7122db07b0d8dbf0de682267c84217573aee3ea7", + "reference": "7122db07b0d8dbf0de682267c84217573aee3ea7", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/error-handler": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^6.1", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", "symfony/polyfill-ctype": "^1.8" @@ -5700,9 +5817,9 @@ "conflict": { "symfony/browser-kit": "<5.4", "symfony/cache": "<5.4", - "symfony/config": "<5.4", + "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.2", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -5719,10 +5836,10 @@ "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", + "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", + "symfony/dependency-injection": "^6.2", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", @@ -5732,6 +5849,7 @@ "symfony/stopwatch": "^5.4|^6.0", "symfony/translation": "^5.4|^6.0", "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -5766,7 +5884,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/v6.0.14" + "source": "https://github.com/symfony/http-kernel/tree/v6.2.6" }, "funding": [ { @@ -5782,37 +5900,42 @@ "type": "tidelift" } ], - "time": "2022-10-12T07:43:45+00:00" + "time": "2023-02-01T08:32:25+00:00" }, { "name": "symfony/mailer", - "version": "v6.0.13", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "6269c872ab4792e8facbf8af27a2fbee8429f217" + "reference": "29729ac0b4e5113f24c39c46746bd6afb79e0aaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/6269c872ab4792e8facbf8af27a2fbee8429f217", - "reference": "6269c872ab4792e8facbf8af27a2fbee8429f217", + "url": "https://api.github.com/repos/symfony/mailer/zipball/29729ac0b4e5113f24c39c46746bd6afb79e0aaa", + "reference": "29729ac0b4e5113f24c39c46746bd6afb79e0aaa", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3", - "php": ">=8.0.2", + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", + "symfony/mime": "^6.2", "symfony/service-contracts": "^1.1|^2|^3" }, "conflict": { - "symfony/http-kernel": "<5.4" + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" }, "require-dev": { + "symfony/console": "^5.4|^6.0", "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/messenger": "^5.4|^6.0" + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" }, "type": "library", "autoload": { @@ -5840,7 +5963,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.0.13" + "source": "https://github.com/symfony/mailer/tree/v6.2.5" }, "funding": [ { @@ -5856,24 +5979,24 @@ "type": "tidelift" } ], - "time": "2022-08-29T06:49:22+00:00" + "time": "2023-01-10T18:53:53+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.0.7", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "f0d032c26683b26f4bc26864e09b1e08fa55226e" + "reference": "d1eb7283e30752f2802ced37bffdee2c67cad42a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/f0d032c26683b26f4bc26864e09b1e08fa55226e", - "reference": "f0d032c26683b26f4bc26864e09b1e08fa55226e", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/d1eb7283e30752f2802ced37bffdee2c67cad42a", + "reference": "d1eb7283e30752f2802ced37bffdee2c67cad42a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/mailer": "^5.4|^6.0" }, "require-dev": { @@ -5905,7 +6028,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.0.7" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.2.5" }, "funding": [ { @@ -5921,24 +6044,24 @@ "type": "tidelift" } ], - "time": "2022-03-24T17:11:42+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/mime", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "c01b88b63418131daf2edd0bdc17fc8a6d1c939a" + "reference": "4b7b349f67d15cd0639955c8179a76c89f6fd610" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/c01b88b63418131daf2edd0bdc17fc8a6d1c939a", - "reference": "c01b88b63418131daf2edd0bdc17fc8a6d1c939a", + "url": "https://api.github.com/repos/symfony/mime/zipball/4b7b349f67d15cd0639955c8179a76c89f6fd610", + "reference": "4b7b349f67d15cd0639955c8179a76c89f6fd610", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -5947,15 +6070,16 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" + "symfony/serializer": "<6.2" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" + "symfony/serializer": "^6.2" }, "type": "library", "autoload": { @@ -5987,7 +6111,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.0.14" + "source": "https://github.com/symfony/mime/tree/v6.2.5" }, "funding": [ { @@ -6003,20 +6127,20 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:02:12+00:00" + "time": "2023-01-10T18:53:53+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -6031,7 +6155,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6069,7 +6193,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -6085,20 +6209,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "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-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -6110,7 +6234,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6150,7 +6274,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -6166,20 +6290,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -6193,7 +6317,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6237,7 +6361,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -6253,20 +6377,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "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-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -6278,7 +6402,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6321,7 +6445,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -6337,20 +6461,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -6365,7 +6489,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6404,7 +6528,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -6420,88 +6544,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-php56", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", - "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "metapackage", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -6510,7 +6566,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6548,7 +6604,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -6564,20 +6620,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -6586,7 +6642,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6631,7 +6687,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -6647,99 +6703,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "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\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23" + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/a41886c1c81dc075a09c71fe6db5b9d68c79de23", - "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", "shasum": "" }, "require": { @@ -6754,7 +6731,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6792,7 +6769,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" }, "funding": [ { @@ -6808,24 +6785,24 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/postmark-mailer", - "version": "v6.0.7", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/postmark-mailer.git", - "reference": "8405569233efb0140e55eb6236c9e55693f058ff" + "reference": "b6630e287f94fbc1f0f0a20a3a147a69ac8f862b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/8405569233efb0140e55eb6236c9e55693f058ff", - "reference": "8405569233efb0140e55eb6236c9e55693f058ff", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/b6630e287f94fbc1f0f0a20a3a147a69ac8f862b", + "reference": "b6630e287f94fbc1f0f0a20a3a147a69ac8f862b", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/mailer": "^5.4|^6.0" }, "require-dev": { @@ -6857,7 +6834,7 @@ "description": "Symfony Postmark Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/postmark-mailer/tree/v6.0.7" + "source": "https://github.com/symfony/postmark-mailer/tree/v6.2.5" }, "funding": [ { @@ -6873,24 +6850,24 @@ "type": "tidelift" } ], - "time": "2022-03-24T17:11:42+00:00" + "time": "2023-01-01T08:36:55+00:00" }, { "name": "symfony/process", - "version": "v6.0.11", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "44270a08ccb664143dede554ff1c00aaa2247a43" + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/44270a08ccb664143dede554ff1c00aaa2247a43", - "reference": "44270a08ccb664143dede554ff1c00aaa2247a43", + "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -6918,7 +6895,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.0.11" + "source": "https://github.com/symfony/process/tree/v6.2.5" }, "funding": [ { @@ -6934,35 +6911,35 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:10:44+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/routing", - "version": "v6.0.11", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "434b64f7d3a582ec33fcf69baaf085473e67d639" + "reference": "589bd742d5d03c192c8521911680fe88f61712fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/434b64f7d3a582ec33fcf69baaf085473e67d639", - "reference": "434b64f7d3a582ec33fcf69baaf085473e67d639", + "url": "https://api.github.com/repos/symfony/routing/zipball/589bd742d5d03c192c8521911680fe88f61712fe", + "reference": "589bd742d5d03c192c8521911680fe88f61712fe", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.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.4|^6.0", + "symfony/config": "^6.2", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", @@ -7006,7 +6983,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.0.11" + "source": "https://github.com/symfony/routing/tree/v6.2.5" }, "funding": [ { @@ -7022,24 +6999,24 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:45:53+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.0.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/container": "^2.0" }, "conflict": { @@ -7051,7 +7028,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -7061,7 +7038,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7088,7 +7068,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" }, "funding": [ { @@ -7104,24 +7084,24 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:58+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/string", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "3db7da820a6e4a584b714b3933c34c6a7db4d86c" + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/3db7da820a6e4a584b714b3933c34c6a7db4d86c", - "reference": "3db7da820a6e4a584b714b3933c34c6a7db4d86c", + "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -7133,6 +7113,7 @@ "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", "symfony/translation-contracts": "^2.0|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, @@ -7173,7 +7154,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.14" + "source": "https://github.com/symfony/string/tree/v6.2.5" }, "funding": [ { @@ -7189,24 +7170,24 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:08+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/translation", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c" + "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/6f99eb179aee4652c0a7cd7c11f2a870d904330c", - "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c", + "url": "https://api.github.com/repos/symfony/translation/zipball/60556925a703cfbc1581cde3b3f35b0bb0ea904c", + "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.3|^3.0" }, @@ -7222,6 +7203,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", "symfony/config": "^5.4|^6.0", "symfony/console": "^5.4|^6.0", @@ -7231,10 +7213,12 @@ "symfony/http-kernel": "^5.4|^6.0", "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", "symfony/service-contracts": "^1.1.2|^2|^3", "symfony/yaml": "^5.4|^6.0" }, "suggest": { + "nikic/php-parser": "To use PhpAstExtractor", "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" @@ -7268,7 +7252,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.0.14" + "source": "https://github.com/symfony/translation/tree/v6.2.5" }, "funding": [ { @@ -7284,24 +7268,24 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:02:12+00:00" + "time": "2023-01-05T07:00:27+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.0.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", - "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7", + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "suggest": { "symfony/translation-implementation": "" @@ -7309,7 +7293,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -7319,7 +7303,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7346,7 +7333,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0" }, "funding": [ { @@ -7362,24 +7349,24 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:10:44+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/uid", - "version": "v6.0.13", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3" + "reference": "8ace895bded57d6496638c9b2d3b788e05b7395b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3", - "reference": "db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3", + "url": "https://api.github.com/repos/symfony/uid/zipball/8ace895bded57d6496638c9b2d3b788e05b7395b", + "reference": "8ace895bded57d6496638c9b2d3b788e05b7395b", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { @@ -7420,7 +7407,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.0.13" + "source": "https://github.com/symfony/uid/tree/v6.2.5" }, "funding": [ { @@ -7436,24 +7423,24 @@ "type": "tidelift" } ], - "time": "2022-09-09T09:33:56+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.0.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "72af925ddd41ca0372d166d004bc38a00c4608cc" + "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72af925ddd41ca0372d166d004bc38a00c4608cc", - "reference": "72af925ddd41ca0372d166d004bc38a00c4608cc", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/44b7b81749fd20c1bdf4946c041050e22bc8da27", + "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -7508,7 +7495,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.0.14" + "source": "https://github.com/symfony/var-dumper/tree/v6.2.5" }, "funding": [ { @@ -7524,32 +7511,31 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:02:12+00:00" + "time": "2023-01-20T17:45:48+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.14", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e83fe9a72011f07c662da46a05603d66deeeb487" + "reference": "2bbfbdacc8a15574f8440c4838ce0d7bb6c86b19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e83fe9a72011f07c662da46a05603d66deeeb487", - "reference": "e83fe9a72011f07c662da46a05603d66deeeb487", + "url": "https://api.github.com/repos/symfony/yaml/zipball/2bbfbdacc8a15574f8440c4838ce0d7bb6c86b19", + "reference": "2bbfbdacc8a15574f8440c4838ce0d7bb6c86b19", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.3" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.3|^6.0" + "symfony/console": "^5.4|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -7583,7 +7569,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.14" + "source": "https://github.com/symfony/yaml/tree/v6.2.5" }, "funding": [ { @@ -7599,20 +7585,20 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:50+00:00" + "time": "2023-01-10T18:53:53+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.5", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", "shasum": "" }, "require": { @@ -7650,9 +7636,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" }, - "time": "2022-09-12T13:28:28+00:00" + "time": "2023-01-03T09:29:04+00:00" }, { "name": "vlucas/phpdotenv", @@ -7874,26 +7860,26 @@ "packages-dev": [ { "name": "barryvdh/laravel-ide-helper", - "version": "v2.12.3", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550" + "reference": "81d5b223ff067a1f38e14c100997e153b837fe4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3ba1e2573b38f72107b8aacc4ee177fcab30a550", - "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/81d5b223ff067a1f38e14c100997e153b837fe4a", + "reference": "81d5b223ff067a1f38e14c100997e153b837fe4a", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.6", - "composer/pcre": "^1 || ^2 || ^3", + "composer/class-map-generator": "^1.0", "doctrine/dbal": "^2.6 || ^3", "ext-json": "*", - "illuminate/console": "^8 || ^9", - "illuminate/filesystem": "^8 || ^9", - "illuminate/support": "^8 || ^9", + "illuminate/console": "^8 || ^9 || ^10", + "illuminate/filesystem": "^8 || ^9 || ^10", + "illuminate/support": "^8 || ^9 || ^10", "nikic/php-parser": "^4.7", "php": "^7.3 || ^8.0", "phpdocumentor/type-resolver": "^1.1.0" @@ -7901,16 +7887,16 @@ "require-dev": { "ext-pdo_sqlite": "*", "friendsofphp/php-cs-fixer": "^2", - "illuminate/config": "^8 || ^9", - "illuminate/view": "^8 || ^9", + "illuminate/config": "^8 || ^9 || ^10", + "illuminate/view": "^8 || ^9 || ^10", "mockery/mockery": "^1.4", - "orchestra/testbench": "^6 || ^7", + "orchestra/testbench": "^6 || ^7 || ^8", "phpunit/phpunit": "^8.5 || ^9", "spatie/phpunit-snapshot-assertions": "^3 || ^4", "vimeo/psalm": "^3.12" }, "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9)." + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10)." }, "type": "library", "extra": { @@ -7952,7 +7938,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.3" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.13.0" }, "funding": [ { @@ -7964,27 +7950,27 @@ "type": "github" } ], - "time": "2022-03-06T14:33:42+00:00" + "time": "2023-02-04T13:56:40+00:00" }, { "name": "barryvdh/reflection-docblock", - "version": "v2.0.6", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" + "reference": "bf44b757feb8ba1734659029357646466ded673e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/bf44b757feb8ba1734659029357646466ded673e", + "reference": "bf44b757feb8ba1734659029357646466ded673e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.0,<4.5" + "phpunit/phpunit": "^8.5.14|^9" }, "suggest": { "dflydev/markdown": "~1.0", @@ -8014,22 +8000,95 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.0" }, - "time": "2018-12-13T10:34:14+00:00" + "time": "2022-10-31T15:35:43+00:00" }, { - "name": "composer/pcre", - "version": "3.0.0", + "name": "composer/class-map-generator", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/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-06-19T11:31:27+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { @@ -8071,7 +8130,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -8087,7 +8146,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", @@ -8238,32 +8297,35 @@ }, { "name": "doctrine/annotations", - "version": "1.13.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^2 || ^3", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", "vimeo/psalm": "^4.10" }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, "type": "library", "autoload": { "psr-4": { @@ -8305,96 +8367,26 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.3" + "source": "https://github.com/doctrine/annotations/tree/2.0.1" }, - "time": "2022-07-02T10:48:51+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.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" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2023-02-02T22:02:53+00:00" }, { "name": "fakerphp/faker", - "version": "v1.20.0", + "version": "v1.21.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -8405,7 +8397,8 @@ "bamarni/composer-bin-plugin": "^1.4.1", "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", @@ -8417,7 +8410,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.20-dev" + "dev-main": "v1.21-dev" } }, "autoload": { @@ -8442,22 +8435,22 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" }, - "time": "2022-07-20T13:12:54+00:00" + "time": "2022-12-13T13:54:32+00:00" }, { "name": "filp/whoops", - "version": "2.14.5", + "version": "2.14.6", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + "reference": "f7948baaa0330277c729714910336383286305da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da", + "reference": "f7948baaa0330277c729714910336383286305da", "shasum": "" }, "require": { @@ -8507,7 +8500,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.5" + "source": "https://github.com/filp/whoops/tree/2.14.6" }, "funding": [ { @@ -8515,55 +8508,56 @@ "type": "github" } ], - "time": "2022-01-07T12:00:00+00:00" + "time": "2022-11-02T16:23:29+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.12.0", + "version": "v3.14.4", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "eae11d945e2885d86e1c080eec1bb30a2aa27998" + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/eae11d945e2885d86e1c080eec1bb30a2aa27998", - "reference": "eae11d945e2885d86e1c080eec1bb30a2aa27998", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b", + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b", "shasum": "" }, "require": { - "composer/semver": "^3.2", + "composer/semver": "^3.3", "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^1.13", + "doctrine/annotations": "^2", + "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0", + "sebastian/diff": "^4.0 || ^5.0", "symfony/console": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/filesystem": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0", "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.23", - "symfony/polyfill-php80": "^1.25", - "symfony/polyfill-php81": "^1.25", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", "symfony/process": "^5.4 || ^6.0", "symfony/stopwatch": "^5.4 || ^6.0" }, "require-dev": { "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.5", - "mikey179/vfsstream": "^1.6.10", - "php-coveralls/php-coveralls": "^2.5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.15", + "phpspec/prophecy": "^1.16", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "phpunitgoodpractices/polyfill": "^1.6", "phpunitgoodpractices/traits": "^1.9.2", - "symfony/phpunit-bridge": "^6.0", + "symfony/phpunit-bridge": "^6.2.3", "symfony/yaml": "^5.4 || ^6.0" }, "suggest": { @@ -8595,8 +8589,8 @@ ], "description": "A tool to automatically fix PHP code style", "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.12.0" + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4" }, "funding": [ { @@ -8604,7 +8598,7 @@ "type": "github" } ], - "time": "2022-10-12T14:20:51+00:00" + "time": "2023-02-09T21:49:13+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8659,16 +8653,16 @@ }, { "name": "itsgoingd/clockwork", - "version": "v5.1.10", + "version": "v5.1.12", "source": { "type": "git", "url": "https://github.com/itsgoingd/clockwork.git", - "reference": "8ceb38246028483750573c05dc4f9c17ddb65b7b" + "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/8ceb38246028483750573c05dc4f9c17ddb65b7b", - "reference": "8ceb38246028483750573c05dc4f9c17ddb65b7b", + "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", + "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", "shasum": "" }, "require": { @@ -8715,7 +8709,7 @@ ], "support": { "issues": "https://github.com/itsgoingd/clockwork/issues", - "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.10" + "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.12" }, "funding": [ { @@ -8723,7 +8717,7 @@ "type": "github" } ], - "time": "2022-10-19T21:46:50+00:00" + "time": "2022-12-13T00:04:12+00:00" }, { "name": "laravel/dusk", @@ -8801,6 +8795,67 @@ }, "time": "2024-02-15T13:38:58+00:00" }, + { + "name": "laravel/sail", + "version": "v1.21.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "758a914fc4da41f3f6ca5522c85902181b228bd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/758a914fc4da41f3f6ca5522c85902181b228bd1", + "reference": "758a914fc4da41f3f6ca5522c85902181b228bd1", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^7.3|^8.0", + "symfony/yaml": "^6.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2023-02-16T19:16:27+00:00" + }, { "name": "mockery/mockery", "version": "1.5.1", @@ -8934,38 +8989,39 @@ }, { "name": "nunomaduro/collision", - "version": "v6.3.1", + "version": "v7.0.5", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b" + "reference": "5c654ee5fa187cf2f4cb226d773582ec6d402a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/0f6349c3ed5dd28467087b08fb59384bb458a22b", - "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/5c654ee5fa187cf2f4cb226d773582ec6d402a55", + "reference": "5c654ee5fa187cf2f4cb226d773582ec6d402a55", "shasum": "" }, "require": { - "filp/whoops": "^2.14.5", - "php": "^8.0.0", - "symfony/console": "^6.0.2" + "filp/whoops": "^2.14.6", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.2.5" }, "require-dev": { - "brianium/paratest": "^6.4.1", - "laravel/framework": "^9.26.1", - "laravel/pint": "^1.1.1", - "nunomaduro/larastan": "^1.0.3", - "nunomaduro/mock-final-classes": "^1.1.0", - "orchestra/testbench": "^7.7", - "phpunit/phpunit": "^9.5.23", - "spatie/ignition": "^1.4.1" + "laravel/framework": "^10.0.3", + "laravel/pint": "^1.5.0", + "laravel/sail": "^1.20.2", + "laravel/sanctum": "^3.2.1", + "laravel/tinker": "^2.8.0", + "nunomaduro/larastan": "^2.4.1", + "orchestra/testbench-core": "^8.0.1", + "pestphp/pest": "^2.0.0", + "phpunit/phpunit": "^10.0.9", + "sebastian/environment": "^6.0.0", + "spatie/laravel-ignition": "^2.0.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-develop": "6.x-dev" - }, "laravel": { "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" @@ -8973,6 +9029,9 @@ } }, "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], "psr-4": { "NunoMaduro\\Collision\\": "src/" } @@ -9018,7 +9077,7 @@ "type": "patreon" } ], - "time": "2022-09-29T12:29:49+00:00" + "time": "2023-02-19T16:25:13+00:00" }, { "name": "phar-io/manifest", @@ -9131,238 +9190,40 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "php-mock/php-mock", - "version": "2.3.1", - "source": { - "type": "git", - "url": "https://github.com/php-mock/php-mock.git", - "reference": "9a55bd8ba40e6da2e97a866121d2c69dedd4952b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock/zipball/9a55bd8ba40e6da2e97a866121d2c69dedd4952b", - "reference": "9a55bd8ba40e6da2e97a866121d2c69dedd4952b", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0", - "phpunit/php-text-template": "^1 || ^2" - }, - "replace": { - "malkusch/php-mock": "*" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock." - }, - "type": "library", - "autoload": { - "files": [ - "autoload.php" - ], - "psr-4": { - "phpmock\\": [ - "classes/", - "tests/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "WTFPL" - ], - "authors": [ - { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", - "role": "Developer" - } - ], - "description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.", - "homepage": "https://github.com/php-mock/php-mock", - "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "stub", - "test", - "test double" - ], - "support": { - "issues": "https://github.com/php-mock/php-mock/issues", - "source": "https://github.com/php-mock/php-mock/tree/2.3.1" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2022-02-07T18:57:52+00:00" - }, - { - "name": "php-mock/php-mock-integration", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-mock/php-mock-integration.git", - "reference": "003d585841e435958a02e9b986953907b8b7609b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/003d585841e435958a02e9b986953907b8b7609b", - "reference": "003d585841e435958a02e9b986953907b8b7609b", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "php-mock/php-mock": "^2.2", - "phpunit/php-text-template": "^1 || ^2" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "autoload": { - "psr-4": { - "phpmock\\integration\\": "classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "WTFPL" - ], - "authors": [ - { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", - "role": "Developer" - } - ], - "description": "Integration package for PHP-Mock", - "homepage": "https://github.com/php-mock/php-mock-integration", - "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "stub", - "test", - "test double" - ], - "support": { - "issues": "https://github.com/php-mock/php-mock-integration/issues", - "source": "https://github.com/php-mock/php-mock-integration/tree/2.1.0" - }, - "time": "2020-02-08T14:40:25+00:00" - }, - { - "name": "php-mock/php-mock-phpunit", - "version": "2.6.1", - "source": { - "type": "git", - "url": "https://github.com/php-mock/php-mock-phpunit.git", - "reference": "b9ba2db21e7e1c7deba98bc86dcfc6425fb4647d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/b9ba2db21e7e1c7deba98bc86dcfc6425fb4647d", - "reference": "b9ba2db21e7e1c7deba98bc86dcfc6425fb4647d", - "shasum": "" - }, - "require": { - "php": ">=7", - "php-mock/php-mock-integration": "^2.1", - "phpunit/phpunit": "^6 || ^7 || ^8 || ^9" - }, - "require-dev": { - "phpspec/prophecy": "^1.10.3" - }, - "type": "library", - "autoload": { - "files": [ - "autoload.php" - ], - "psr-4": { - "phpmock\\phpunit\\": "classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "WTFPL" - ], - "authors": [ - { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", - "role": "Developer" - } - ], - "description": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.", - "homepage": "https://github.com/php-mock/php-mock-phpunit", - "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "phpunit", - "stub", - "test", - "test double" - ], - "support": { - "issues": "https://github.com/php-mock/php-mock-phpunit/issues", - "source": "https://github.com/php-mock/php-mock-phpunit/tree/2.6.1" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2022-09-07T20:40:07+00:00" - }, { "name": "php-webdriver/webdriver", - "version": "1.13.1", + "version": "1.15.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", + "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0 || ^7.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-mock/php-mock-phpunit": "^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + "symfony/var-dumper": "^5.0 || ^6.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -9391,9 +9252,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" }, - "time": "2022-10-11T11:49:44+00:00" + "time": "2023-10-20T12:21:20+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -9505,16 +9366,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.17", + "version": "10.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba" }, "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/bf4fbc9c13af7da12b3ea807574fb460f255daba", + "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba", "shasum": "" }, "require": { @@ -9522,18 +9383,18 @@ "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", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcov": "*", @@ -9542,7 +9403,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.0-dev" } }, "autoload": { @@ -9570,7 +9431,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.0" }, "funding": [ { @@ -9578,32 +9439,32 @@ "type": "github" } ], - "time": "2022-08-30T12:24:04+00:00" + "time": "2023-02-03T07:14:34+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd" }, "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/fd9329ab3368f59fe1fe808a189c51086bd4b6bd", + "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd", "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": { @@ -9630,7 +9491,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1" }, "funding": [ { @@ -9638,28 +9499,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-02-10T16:53:14+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": "*" @@ -9667,7 +9528,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -9693,7 +9554,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": [ { @@ -9701,32 +9562,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.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" }, "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/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", "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": { @@ -9752,7 +9613,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" }, "funding": [ { @@ -9760,32 +9621,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-02-03T06:56:46+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": { @@ -9811,7 +9672,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": [ { @@ -9819,24 +9680,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.5.25", + "version": "10.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" + "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d18a18b07e7a9ad52d994b1785f9e301fc84b616", + "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -9846,27 +9706,26 @@ "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.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.0", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "*" }, "bin": [ "phpunit" @@ -9874,7 +9733,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-main": "10.0-dev" } }, "autoload": { @@ -9905,7 +9764,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.11" }, "funding": [ { @@ -9921,32 +9780,32 @@ "type": "tidelift" } ], - "time": "2022-09-25T03:44:45+00:00" + "time": "2023-02-20T16:39:36+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" }, "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/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", "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": { @@ -9969,7 +9828,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/2.0.0" }, "funding": [ { @@ -9977,32 +9836,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+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": { @@ -10025,7 +9884,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": [ { @@ -10033,32 +9892,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": { @@ -10080,7 +9939,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": [ { @@ -10088,34 +9947,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.8", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", "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.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10154,7 +10015,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" }, "funding": [ { @@ -10162,33 +10023,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-02-03T07:07:16+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "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": { @@ -10211,7 +10072,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" }, "funding": [ { @@ -10219,33 +10080,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-02-03T06:59:47+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "70dd1b20bc198da394ad542e988381b44e64e39f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f", + "reference": "70dd1b20bc198da394ad542e988381b44e64e39f", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10277,7 +10138,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0" }, "funding": [ { @@ -10285,27 +10146,27 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-02-03T07:00:31+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b6f3694c6386c7959915a0037652e0c40f6f69cc", + "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -10313,7 +10174,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10332,7 +10193,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", @@ -10340,7 +10201,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.0" }, "funding": [ { @@ -10348,34 +10209,34 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T07:03:04+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", "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.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10417,7 +10278,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/5.0.0" }, "funding": [ { @@ -10425,38 +10286,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-02-03T07:06:49+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "aab257c712de87b90194febd52e4d184551c2d44" }, "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/aab257c712de87b90194febd52e4d184551c2d44", + "reference": "aab257c712de87b90194febd52e4d184551c2d44", "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": { @@ -10481,7 +10339,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" }, "funding": [ { @@ -10489,33 +10347,33 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-02-03T07:07:38+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" }, "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/17c4d940ecafb3d15d2cf916f4108f664e28b130", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "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": { @@ -10538,7 +10396,7 @@ "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" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" }, "funding": [ { @@ -10546,34 +10404,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-02-03T07:08:02+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": { @@ -10595,7 +10453,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": [ { @@ -10603,32 +10461,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": { @@ -10650,7 +10508,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": [ { @@ -10658,32 +10516,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.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "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/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "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": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10710,10 +10568,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -10721,87 +10579,32 @@ "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://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+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": { @@ -10824,7 +10627,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": [ { @@ -10832,29 +10635,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": { @@ -10877,7 +10680,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -10885,20 +10688,20 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "spatie/backtrace", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" + "reference": "7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", - "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1", + "reference": "7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1", "shasum": "" }, "require": { @@ -10934,8 +10737,7 @@ "spatie" ], "support": { - "issues": "https://github.com/spatie/backtrace/issues", - "source": "https://github.com/spatie/backtrace/tree/1.2.1" + "source": "https://github.com/spatie/backtrace/tree/1.2.2" }, "funding": [ { @@ -10947,24 +10749,24 @@ "type": "other" } ], - "time": "2021-11-09T10:57:15+00:00" + "time": "2023-02-21T08:29:12+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.3.0", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca" + "reference": "3e5dd5ac4928f3d2d036bd02de5eb83fd0ef1f42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/b1b974348750925b717fa8c8b97a0db0d1aa40ca", - "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/3e5dd5ac4928f3d2d036bd02de5eb83fd0ef1f42", + "reference": "3e5dd5ac4928f3d2d036bd02de5eb83fd0ef1f42", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0", "php": "^8.0", "spatie/backtrace": "^1.2", "symfony/http-foundation": "^5.0|^6.0", @@ -11008,7 +10810,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.3.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.3.5" }, "funding": [ { @@ -11016,26 +10818,25 @@ "type": "github" } ], - "time": "2022-08-08T10:10:20+00:00" + "time": "2023-01-23T15:58:46+00:00" }, { "name": "spatie/ignition", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1" + "reference": "2cf3833220cfe8fcf639544f8d7067b6469a00b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/dd3d456779108d7078baf4e43f8c2b937d9794a1", - "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1", + "url": "https://api.github.com/repos/spatie/ignition/zipball/2cf3833220cfe8fcf639544f8d7067b6469a00b0", + "reference": "2cf3833220cfe8fcf639544f8d7067b6469a00b0", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "monolog/monolog": "^2.0", "php": "^8.0", "spatie/flare-client-php": "^1.1", "symfony/console": "^5.4|^6.0", @@ -11091,45 +10892,41 @@ "type": "github" } ], - "time": "2022-08-26T11:51:15+00:00" + "time": "2023-01-23T15:28:32+00:00" }, { "name": "spatie/laravel-ignition", - "version": "1.5.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a" + "reference": "70c0e2a22c5c4b691a34db8c98bd6d695660a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a", - "reference": "f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/70c0e2a22c5c4b691a34db8c98bd6d695660a97a", + "reference": "70c0e2a22c5c4b691a34db8c98bd6d695660a97a", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "illuminate/support": "^8.77|^9.27", - "monolog/monolog": "^2.3", - "php": "^8.0", - "spatie/flare-client-php": "^1.0.1", - "spatie/ignition": "^1.4.1", - "symfony/console": "^5.0|^6.0", - "symfony/var-dumper": "^5.0|^6.0" + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.4.3", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" }, "require-dev": { - "filp/whoops": "^2.14", - "livewire/livewire": "^2.8|dev-develop", - "mockery/mockery": "^1.4", - "nunomaduro/larastan": "^1.0", - "orchestra/testbench": "^6.23|^7.0", - "pestphp/pest": "^1.20", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/laravel-ray": "^1.27" + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3" }, "type": "library", "extra": { @@ -11140,6 +10937,9 @@ "aliases": { "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" } + }, + "branch-alias": { + "dev-main": "2.0-dev" } }, "autoload": { @@ -11181,24 +10981,24 @@ "type": "github" } ], - "time": "2022-10-14T12:24:21+00:00" + "time": "2023-01-24T07:20:39+00:00" }, { "name": "symfony/filesystem", - "version": "v6.0.13", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3adca49133bd055ebe6011ed1e012be3c908af79" + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3adca49133bd055ebe6011ed1e012be3c908af79", - "reference": "3adca49133bd055ebe6011ed1e012be3c908af79", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e59e8a4006afd7f5654786a83b4fcb8da98f4593", + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, @@ -11228,7 +11028,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.13" + "source": "https://github.com/symfony/filesystem/tree/v6.2.5" }, "funding": [ { @@ -11244,24 +11044,24 @@ "type": "tidelift" } ], - "time": "2022-09-21T20:25:27+00:00" + "time": "2023-01-20T17:45:48+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.0.3", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "51f7006670febe4cbcbae177cbffe93ff833250d" + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/51f7006670febe4cbcbae177cbffe93ff833250d", - "reference": "51f7006670febe4cbcbae177cbffe93ff833250d", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.1|^3" }, "type": "library", @@ -11295,7 +11095,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.3" + "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" }, "funding": [ { @@ -11311,24 +11111,103 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { - "name": "symfony/stopwatch", - "version": "v6.0.13", + "name": "symfony/polyfill-php81", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "7554fde6848af5ef1178f8ccbdbdb8ae1092c70a" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/7554fde6848af5ef1178f8ccbdbdb8ae1092c70a", - "reference": "7554fde6848af5ef1178f8ccbdbdb8ae1092c70a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", + "shasum": "" + }, + "require": { + "php": ">=8.1", "symfony/service-contracts": "^1|^2|^3" }, "type": "library", @@ -11357,7 +11236,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.0.13" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" }, "funding": [ { @@ -11373,7 +11252,7 @@ "type": "tidelift" } ], - "time": "2022-09-28T15:52:47+00:00" + "time": "2023-01-01T08:36:55+00:00" }, { "name": "theseer/tokenizer", @@ -11432,7 +11311,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.0.2 || ^8.1", + "php": "^8.1 || ^8.2", "ext-json": "*", "ext-mbstring": "*", "ext-pdo": "*", @@ -11442,7 +11321,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "8.0.2" + "php": "8.1.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/config/activity.php b/config/activity.php index 3491d2e2b..6c492d334 100644 --- a/config/activity.php +++ b/config/activity.php @@ -1,7 +1,7 @@ env('APP_ACTIVITY_PRUNE_DAYS', 90), // If set to true activity log entries generated by an admin user that is not also diff --git a/config/mail.php b/config/mail.php index 0f9639291..71c693cff 100644 --- a/config/mail.php +++ b/config/mail.php @@ -27,7 +27,7 @@ return [ | sending an e-mail. You will specify which one you are using for your | mailers below. You are free to add additional mailers as required. | - | Supported: "smtp", "sendmail", "mailgun", "ses", + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", | "postmark", "log", "array", "failover" | */ @@ -41,7 +41,7 @@ return [ 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN'), + 'local_domain' => env('MAIL_EHLO_DOMAIN', env('SERVER_NAME')), ], 'ses' => [ @@ -91,8 +91,8 @@ return [ */ 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), + 'address' => env('MAIL_FROM_ADDRESS', env('MAIL_FROM', 'hello@example.com')), + 'name' => env('MAIL_FROM_NAME', 'Pterodactyl Panel'), ], /* diff --git a/config/pterodactyl.php b/config/pterodactyl.php index 58c58bc9e..43c7c57be 100644 --- a/config/pterodactyl.php +++ b/config/pterodactyl.php @@ -177,4 +177,16 @@ return [ // Should an email be sent to a server owner whenever their server is reinstalled? 'send_reinstall_notification' => env('PTERODACTYL_SEND_REINSTALL_NOTIFICATION', true), ], + + /* + |-------------------------------------------------------------------------- + | Telemetry Settings + |-------------------------------------------------------------------------- + | + | This section controls the telemetry sent by Pterodactyl. + */ + + 'telemetry' => [ + 'enabled' => env('PTERODACTYL_TELEMETRY_ENABLED', true), + ], ]; diff --git a/config/queue.php b/config/queue.php index 35585df0e..74da2e825 100644 --- a/config/queue.php +++ b/config/queue.php @@ -33,7 +33,7 @@ return [ 'database' => [ 'driver' => 'database', 'table' => 'jobs', - 'queue' => 'default', + 'queue' => env('QUEUE_STANDARD', 'standard'), 'retry_after' => 90, 'after_commit' => false, ], @@ -43,7 +43,7 @@ return [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'default'), + 'queue' => env('SQS_QUEUE', env('QUEUE_STANDARD', 'standard')), 'suffix' => env('SQS_SUFFIX'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'after_commit' => false, @@ -52,7 +52,7 @@ return [ 'redis' => [ 'driver' => 'redis', 'connection' => 'default', - 'queue' => env('REDIS_QUEUE', 'default'), + 'queue' => env('REDIS_QUEUE', env('QUEUE_STANDARD', 'standard')), 'retry_after' => 90, 'block_for' => null, 'after_commit' => false, diff --git a/database/Factories/EggVariableFactory.php b/database/Factories/EggVariableFactory.php index 53b94c4c2..c2bce816b 100644 --- a/database/Factories/EggVariableFactory.php +++ b/database/Factories/EggVariableFactory.php @@ -34,7 +34,7 @@ class EggVariableFactory extends Factory /** * Indicate that the egg variable is viewable. */ - public function viewable(): Factory + public function viewable(): static { return $this->state(function (array $attributes) { return [ @@ -46,7 +46,7 @@ class EggVariableFactory extends Factory /** * Indicate that the egg variable is editable. */ - public function editable(): Factory + public function editable(): static { return $this->state(function (array $attributes) { return [ diff --git a/database/Factories/UserFactory.php b/database/Factories/UserFactory.php index 1e38eced6..977b03284 100644 --- a/database/Factories/UserFactory.php +++ b/database/Factories/UserFactory.php @@ -43,7 +43,7 @@ class UserFactory extends Factory /** * Indicate that the user is an admin. */ - public function admin(): Factory + public function admin(): static { return $this->state(['root_admin' => true]); } diff --git a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json index fbb097f06..189cafad9 100644 --- a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json +++ b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": null }, - "exported_at": "2022-06-17T08:11:14+03:00", + "exported_at": "2022-11-06T06:33:01-05:00", "name": "Forge Minecraft", "author": "support@pterodactyl.io", "description": "Minecraft Forge Server. Minecraft Forge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other.", @@ -67,12 +67,12 @@ }, { "name": "Forge Version", - "description": "Gets an exact version.\r\n\r\nEx. 1.15.2-31.2.4\r\n\r\nOverrides MC_VERSION and BUILD_TYPE. If it fails to download the server files it will fail to install.", + "description": "The full exact version.\r\n\r\nEx. 1.15.2-31.2.4\r\n\r\nOverrides MC_VERSION and BUILD_TYPE. If it fails to download the server files it will fail to install.", "env_variable": "FORGE_VERSION", "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string|max:25", + "rules": "nullable|regex:\/^[0-9\\.\\-]+$\/", "field_type": "text" } ] diff --git a/database/Seeders/eggs/rust/egg-rust.json b/database/Seeders/eggs/rust/egg-rust.json index ddbf88cdb..35f543c75 100644 --- a/database/Seeders/eggs/rust/egg-rust.json +++ b/database/Seeders/eggs/rust/egg-rust.json @@ -1,21 +1,21 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1", + "version": "PTDL_v2", "update_url": null }, - "exported_at": "2022-01-18T11:44:55-05:00", + "exported_at": "2023-03-25T13:37:00+00:00", "name": "Rust", "author": "support@pterodactyl.io", "description": "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive.", "features": [ "steam_disk_space" ], - "images": [ - "quay.io\/pterodactyl\/core:rust" - ], + "docker_images": { + "ghcr.io\/pterodactyl\/games:rust": "ghcr.io\/pterodactyl\/games:rust" + }, "file_denylist": [], - "startup": ".\/RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.identity \"rust\" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \\\"{{HOSTNAME}}\\\" +server.level \\\"{{LEVEL}}\\\" +server.description \\\"{{DESCRIPTION}}\\\" +server.url \\\"{{SERVER_URL}}\\\" +server.headerimage \\\"{{SERVER_IMG}}\\\" +server.logoimage \\\"{{SERVER_LOGO}}\\\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \\\"{{RCON_PASS}}\\\" +server.saveinterval {{SAVEINTERVAL}} +app.port {{APP_PORT}} $( [ -z ${MAP_URL} ] && printf %s \"+server.worldsize \\\"{{WORLD_SIZE}}\\\" +server.seed \\\"{{WORLD_SEED}}\\\"\" || printf %s \"+server.levelurl {{MAP_URL}}\" ) {{ADDITIONAL_ARGS}}", + "startup": ".\/RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.queryport {{QUERY_PORT}} +server.identity \"rust\" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \\\"{{HOSTNAME}}\\\" +server.level \\\"{{LEVEL}}\\\" +server.description \\\"{{DESCRIPTION}}\\\" +server.url \\\"{{SERVER_URL}}\\\" +server.headerimage \\\"{{SERVER_IMG}}\\\" +server.logoimage \\\"{{SERVER_LOGO}}\\\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \\\"{{RCON_PASS}}\\\" +server.saveinterval {{SAVEINTERVAL}} +app.port {{APP_PORT}} $( [ -z ${MAP_URL} ] && printf %s \"+server.worldsize \\\"{{WORLD_SIZE}}\\\" +server.seed \\\"{{WORLD_SEED}}\\\"\" || printf %s \"+server.levelurl {{MAP_URL}}\" ) {{ADDITIONAL_ARGS}}", "config": { "files": "{}", "startup": "{\r\n \"done\": \"Server startup complete\"\r\n}", @@ -37,16 +37,18 @@ "default_value": "A Rust Server", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:60" + "rules": "required|string|max:60", + "field_type": "text" }, { - "name": "OxideMod", - "description": "Set whether you want the server to use and auto update OxideMod or not. Valid options are \"1\" for true and \"0\" for false.", - "env_variable": "OXIDE", - "default_value": "0", + "name": "Modding Framework", + "description": "The modding framework to be used: carbon, oxide, vanilla.\r\nDefaults to \"vanilla\" for a non-modded server installation.", + "env_variable": "FRAMEWORK", + "default_value": "vanilla", "user_viewable": true, "user_editable": true, - "rules": "required|boolean" + "rules": "required|in:vanilla,oxide,carbon", + "field_type": "text" }, { "name": "Level", @@ -55,7 +57,8 @@ "default_value": "Procedural Map", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:20" + "rules": "required|string|max:20", + "field_type": "text" }, { "name": "Description", @@ -64,7 +67,8 @@ "default_value": "Powered by Pterodactyl", "user_viewable": true, "user_editable": true, - "rules": "required|string" + "rules": "required|string", + "field_type": "text" }, { "name": "URL", @@ -73,7 +77,8 @@ "default_value": "http:\/\/pterodactyl.io", "user_viewable": true, "user_editable": true, - "rules": "nullable|url" + "rules": "nullable|url", + "field_type": "text" }, { "name": "World Size", @@ -82,7 +87,8 @@ "default_value": "3000", "user_viewable": true, "user_editable": true, - "rules": "required|integer" + "rules": "required|integer", + "field_type": "text" }, { "name": "World Seed", @@ -91,7 +97,8 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string" + "rules": "nullable|string", + "field_type": "text" }, { "name": "Max Players", @@ -100,7 +107,8 @@ "default_value": "40", "user_viewable": true, "user_editable": true, - "rules": "required|integer" + "rules": "required|integer", + "field_type": "text" }, { "name": "Server Image", @@ -109,7 +117,18 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url" + "rules": "nullable|url", + "field_type": "text" + }, + { + "name": "Query Port", + "description": "Server Query Port. Can't be the same as Game's primary port.", + "env_variable": "QUERY_PORT", + "default_value": "27017", + "user_viewable": true, + "user_editable": false, + "rules": "required|integer", + "field_type": "text" }, { "name": "RCON Port", @@ -118,16 +137,18 @@ "default_value": "28016", "user_viewable": true, "user_editable": false, - "rules": "required|integer" + "rules": "required|integer", + "field_type": "text" }, { "name": "RCON Password", "description": "RCON access password.", "env_variable": "RCON_PASS", - "default_value": "CHANGEME", + "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^[\\w.-]*$\/|max:64" + "rules": "required|regex:\/^[\\w.-]*$\/|max:64", + "field_type": "text" }, { "name": "Save Interval", @@ -136,7 +157,8 @@ "default_value": "60", "user_viewable": true, "user_editable": true, - "rules": "required|integer" + "rules": "required|integer", + "field_type": "text" }, { "name": "Additional Arguments", @@ -145,7 +167,8 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string" + "rules": "nullable|string", + "field_type": "text" }, { "name": "App Port", @@ -154,7 +177,8 @@ "default_value": "28082", "user_viewable": true, "user_editable": false, - "rules": "required|integer" + "rules": "required|integer", + "field_type": "text" }, { "name": "Server Logo", @@ -163,7 +187,8 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url" + "rules": "nullable|url", + "field_type": "text" }, { "name": "Custom Map URL", @@ -172,7 +197,8 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url" + "rules": "nullable|url", + "field_type": "text" } ] } diff --git a/database/Seeders/eggs/voice-servers/egg-mumble-server.json b/database/Seeders/eggs/voice-servers/egg-mumble-server.json index 27f60e717..feac4dc1a 100644 --- a/database/Seeders/eggs/voice-servers/egg-mumble-server.json +++ b/database/Seeders/eggs/voice-servers/egg-mumble-server.json @@ -1,28 +1,28 @@ { "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO", "meta": { - "version": "PTDL_v1", + "version": "PTDL_v2", "update_url": null }, - "exported_at": "2021-06-15T16:54:54-04:00", + "exported_at": "2022-10-15T12:38:18+02:00", "name": "Mumble Server", "author": "support@pterodactyl.io", "description": "Mumble is an open source, low-latency, high quality voice chat software primarily intended for use while gaming.", "features": null, - "images": [ - "ghcr.io\/pterodactyl\/yolks:alpine" - ], + "docker_images": { + "Mumble": "ghcr.io\/parkervcp\/yolks:voice_mumble" + }, "file_denylist": [], - "startup": ".\/murmur.x86 -fg", + "startup": "mumble-server -fg -ini murmur.ini", "config": { - "files": "{\r\n \"murmur.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"logfile\": \"murmur.log\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"host\": \"0.0.0.0\",\r\n \"users\": \"{{server.build.env.MAX_USERS}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"murmur.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"database\": \"\/home\/container\/murmur.sqlite\",\r\n \"logfile\": \"\/home\/container\/murmur.log\",\r\n \"port\": \"{{server.build.default.port}}\",\r\n \"host\": \"0.0.0.0\",\r\n \"users\": \"{{server.build.env.MAX_USERS}}\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Server listening on\"\r\n}", - "logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/murmur.log\"\r\n}", + "logs": "{}", "stop": "^C" }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# Mumble Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nGITHUB_PACKAGE=mumble-voip\/mumble\r\nMATCH=murmur-static\r\n\r\nif [ ! -d \/mnt\/server\/ ]; then\r\n mkdir \/mnt\/server\/\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nif [ -z \"${GITHUB_USER}\" ] && [ -z \"${GITHUB_OAUTH_TOKEN}\" ] ; then\r\n echo -e \"using anon api call\"\r\nelse\r\n echo -e \"user and oauth token set\"\r\n alias curl='curl -u ${GITHUB_USER}:${GITHUB_OAUTH_TOKEN} '\r\nfi\r\n\r\n## get release info and download links\r\nLATEST_JSON=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\/latest\")\r\nRELEASES=$(curl --silent \"https:\/\/api.github.com\/repos\/${GITHUB_PACKAGE}\/releases\")\r\n\r\nif [ -z \"${VERSION}\" ] || [ \"${VERSION}\" == \"latest\" ]; then\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -m 1 -i ${MATCH})\r\nelse\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ \"${VERSION}\" == \"${VERSION_CHECK}\" ]; then\r\n DOWNLOAD_LINK=$(echo ${RELEASES} | jq -r --arg VERSION \"${VERSION}\" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -m 1 -i ${MATCH})\r\n else\r\n echo -e \"defaulting to latest release\"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\nfi\r\n\r\ncurl -L ${DOWNLOAD_LINK} | tar xjv --strip-components=1", + "script": "#!\/bin\/ash\r\n\r\nif [ ! -d \/mnt\/server\/ ]; then\r\n mkdir \/mnt\/server\/\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nFILE=\/mnt\/server\/murmur.ini\r\nif [ -f \"$FILE\" ]; then\r\n echo \"Config file already exists.\"\r\nelse \r\n echo \"Downloading the config file.\"\r\n apk add --no-cache murmur\r\n cp \/etc\/murmur.ini \/mnt\/server\/murmur.ini\r\n apk del murmur\r\nfi\r\necho \"done\"", "container": "ghcr.io\/pterodactyl\/installers:alpine", "entrypoint": "ash" } @@ -35,16 +35,8 @@ "default_value": "100", "user_viewable": true, "user_editable": false, - "rules": "required|numeric|digits_between:1,5" - }, - { - "name": "Server Version", - "description": "Version of Mumble Server to download and use.", - "env_variable": "MUMBLE_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": "required|string" + "rules": "required|numeric|digits_between:1,5", + "field_type": "text" } ] -} \ No newline at end of file +} diff --git a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json b/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json index 2212a3c08..ef15f1ca0 100644 --- a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json +++ b/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json @@ -13,7 +13,7 @@ "ghcr.io\/pterodactyl\/yolks:debian" ], "file_denylist": [], - "startup": ".\/ts3server default_voice_port={{SERVER_PORT}} query_port={{QUERY_PORT}} filetransfer_ip=0.0.0.0 filetransfer_port={{FILE_TRANSFER}} license_accepted=1", + "startup": ".\/ts3server default_voice_port={{SERVER_PORT}} query_port={{QUERY_PORT}} filetransfer_ip=0.0.0.0 filetransfer_port={{FILE_TRANSFER}} query_http_port={{QUERY_HTTP}} query_ssh_port={{QUERY_SSH}} query_protocols={{QUERY_PROTOCOLS_VAR}} license_accepted=1", "config": { "files": "{}", "startup": "{\r\n \"done\": \"listening on 0.0.0.0:\"\r\n}", @@ -22,7 +22,7 @@ }, "scripts": { "installation": { - "script": "#!\/bin\/ash\r\n# TS3 Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\nif [ -z ${TS_VERSION} ] || [ ${TS_VERSION} == latest ]; then\r\n TS_VERSION=$(curl -sSL https:\/\/teamspeak.com\/versions\/server.json | jq -r '.linux.x86_64.version')\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"getting files from http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2\" \r\ncurl -L http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2 | tar -xvj --strip-components=1", + "script": "#!\/bin\/ash\r\n# TS3 Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\nif [ -z ${TS_VERSION} ] || [ ${TS_VERSION} == latest ]; then\r\n TS_VERSION=$(curl -sSL https:\/\/teamspeak.com\/versions\/server.json | jq -r '.linux.x86_64.version')\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"getting files from http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2\" \r\ncurl -L http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2 | tar -xvj --strip-components=1\r\ncp .\/redist\/libmariadb.so.2 .\/", "container": "ghcr.io\/pterodactyl\/installers:alpine", "entrypoint": "ash" } @@ -35,7 +35,8 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:6" + "rules": "required|string|max:6", + "field_type": "text" }, { "name": "File Transfer Port", @@ -44,7 +45,8 @@ "default_value": "30033", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1,65535" + "rules": "required|integer|between:1025,65535", + "field_type": "text" }, { "name": "Query Port", @@ -53,7 +55,38 @@ "default_value": "10011", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1,65535" + "rules": "required|integer|between:1025,65535", + "field_type": "text" + }, + { + "name": "Query Protocols", + "description": "Comma separated list of protocols that can be used to connect to the ServerQuery | \r\nPossible values are raw, ssh and http | \r\nE.g.: raw,ssh,http", + "env_variable": "QUERY_PROTOCOLS_VAR", + "default_value": "raw,http,ssh", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|max:12", + "field_type": "text" + }, + { + "name": "Query SSH Port", + "description": "TCP Port opened for ServerQuery connections using SSH", + "env_variable": "QUERY_SSH", + "default_value": "10022", + "user_viewable": true, + "user_editable": false, + "rules": "required|integer|between:1025,65535", + "field_type": "text" + }, + { + "name": "Query HTTP Port", + "description": "TCP Port opened for ServerQuery connections using http", + "env_variable": "QUERY_HTTP", + "default_value": "10080", + "user_viewable": true, + "user_editable": false, + "rules": "required|integer|between:1025,65535", + "field_type": "text" } ] -} \ No newline at end of file +} diff --git a/database/migrations/2022_12_12_213937_update_mail_settings_to_new_format.php b/database/migrations/2022_12_12_213937_update_mail_settings_to_new_format.php new file mode 100644 index 000000000..97b651033 --- /dev/null +++ b/database/migrations/2022_12_12_213937_update_mail_settings_to_new_format.php @@ -0,0 +1,77 @@ +keys, 0); + $oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys)); + + // Gets the second column in our key table and gets all matching settings. + $newKeys = array_column($this->keys, 1); + $newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys)); + + // Map all the old settings to their new key. + $oldSettings->map(function (Setting $setting) use ($oldKeys) { + $row = array_search($setting->key, $oldKeys, true); + $setting->key = $this->keys[$row][1]; + + return $setting; + // Check if any settings with the new key already exist. + })->filter(function (Setting $setting) use ($newSettings) { + if ($newSettings->contains('key', $setting->key)) { + return false; + } + + return true; + // Update the settings to use their new keys if they don't already exist. + })->each(fn (Setting $setting) => $setting->save()); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + DB::transaction(function () { + $settings = Setting::all(); + + // Gets the second column in our key table and gets all matching settings. + $newKeys = array_column($this->keys, 0); + $newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys)); + + // Delete all settings that already have the new key. + $newSettings->each(fn (Setting $setting) => $setting->delete()); + + // Gets the first column in our key table and gets all matching settings. + $oldKeys = array_column($this->keys, 1); + $oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys)); + + // Map all the old settings to their new key. + $oldSettings->map(function (Setting $setting) use ($oldKeys) { + $row = array_search($setting->key, $oldKeys, true); + $setting->key = $this->keys[$row][0]; + + return $setting; + // Update the settings to use their new keys if they don't already exist. + })->each(fn (Setting $setting) => $setting->save()); + }); + } +}; diff --git a/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php b/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php new file mode 100644 index 000000000..e3482e278 --- /dev/null +++ b/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php @@ -0,0 +1,34 @@ +string('uuid')->after('id')->nullable()->unique(); + }); + + DB::table('failed_jobs')->whereNull('uuid')->cursor()->each(function ($job) { + DB::table('failed_jobs') + ->where('id', $job->id) + ->update(['uuid' => (string) Illuminate\Support\Str::uuid()]); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('failed_jobs', function (Blueprint $table) { + $table->dropColumn('uuid'); + }); + } +}; diff --git a/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php b/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php new file mode 100644 index 000000000..49e19bfed --- /dev/null +++ b/database/migrations/2023_02_23_191004_add_expires_at_column_to_api_keys_table.php @@ -0,0 +1,27 @@ +timestamp('expires_at')->nullable()->after('last_used_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('api_keys', function (Blueprint $table) { + $table->dropColumn('expires_at'); + }); + } +}; diff --git a/flake.lock b/flake.lock index 4a64ac964..f0b2fa2a7 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,93 @@ { "nodes": { - "flake-utils": { + "devshell": { + "flake": false, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "dream2nix": { + "inputs": { + "devshell": "devshell", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "nix-unit": "nix-unit", + "nixpkgs": [ + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1695717405, + "narHash": "sha256-MvHrU3h0Bw57s2p+wCUnSZliR4wvvPi3xkW+MRWB5HU=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "6dbd59e4a47bd916a655c4425a3e730c6aeae033", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "dream2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1675933616, + "narHash": "sha256-/rczJkJHtx16IFxMmAWu5nNYcSXNg1YYXTHoGjLrLUA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "47478a4a003e745402acf63be7f9a092d51b83d7", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", "type": "github" }, "original": { @@ -15,13 +96,105 @@ "type": "github" } }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mk-node-package": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ], + "npmlock2nix": "npmlock2nix", + "pnpm2nix": "pnpm2nix" + }, + "locked": { + "lastModified": 1633790997, + "narHash": "sha256-1mk4EwNkWtTNpeRivZmJTzB+92g07maeFRVUMnnRh1U=", + "owner": "winston0410", + "repo": "mkNodePackage", + "rev": "a7eca5e027c8b260dca4ece7d8dd187f92420611", + "type": "github" + }, + "original": { + "owner": "winston0410", + "repo": "mkNodePackage", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "dream2nix", + "nix-unit", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nix-unit": { + "inputs": { + "flake-parts": [ + "dream2nix", + "flake-parts" + ], + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "dream2nix", + "nixpkgs" + ], + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1690289081, + "narHash": "sha256-PCXQAQt8+i2pkUym9P1JY4JGoeZJLzzxWBhprHDdItM=", + "owner": "adisbladis", + "repo": "nix-unit", + "rev": "a9d6f33e50d4dcd9cfc0c92253340437bbae282b", + "type": "github" + }, + "original": { + "owner": "adisbladis", + "repo": "nix-unit", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1666539104, - "narHash": "sha256-jeuC+d375wHHxMOFLgu7etseCQVJuPNKoEc9X9CsErg=", + "lastModified": 1695644571, + "narHash": "sha256-asS9dCCdlt1lPq0DLwkVBbVoEKuEuz+Zi3DG7pR/RxA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0e6df35f39651504249a05191f9a78d251707e22", + "rev": "6500b4580c2a1f3d0f980d32d285739d8e156d92", "type": "github" }, "original": { @@ -31,11 +204,121 @@ "type": "github" } }, - "root": { + "npmlock2nix": { + "flake": false, + "locked": { + "lastModified": 1633729941, + "narHash": "sha256-v2YPcEWI1Wz8ErivorubgLcDT06H6YzFT7uhp1ymqnE=", + "owner": "winston0410", + "repo": "npmlock2nix", + "rev": "6ade47a330b6919defb45c0eb984a64234aa8468", + "type": "github" + }, + "original": { + "owner": "winston0410", + "ref": "issue113", + "repo": "npmlock2nix", + "type": "github" + } + }, + "pnpm2nix": { + "flake": false, + "locked": { + "lastModified": 1594396611, + "narHash": "sha256-UXOUQ+2A89/zaxYhTHiRrRBU5exbUWrg+FoJYMcNwuI=", + "owner": "nix-community", + "repo": "pnpm2nix", + "rev": "f67be0925a91b92f54d99dbdead7a06920b979ac", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "pnpm2nix", + "type": "github" + } + }, + "pre-commit-hooks": { "inputs": { "flake-utils": "flake-utils", + "nixpkgs": [ + "dream2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1646153636, + "narHash": "sha256-AlWHMzK+xJ1mG267FdT8dCq/HvLCA6jwmx2ZUy5O8tY=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "b6bc0b21e1617e2b07d8205e7fae7224036dfa4b", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "dream2nix": "dream2nix", + "flake-utils": "flake-utils_2", + "mk-node-package": "mk-node-package", "nixpkgs": "nixpkgs" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "dream2nix", + "nix-unit", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1689620039, + "narHash": "sha256-BtNwghr05z7k5YMdq+6nbue+nEalvDepuA7qdQMAKoQ=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "719c2977f958c41fa60a928e2fbc50af14844114", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 050cc2415..e61dad511 100644 --- a/flake.nix +++ b/flake.nix @@ -2,21 +2,258 @@ description = "Pterodactyl Panel"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; + dream2nix = { + url = "github:nix-community/dream2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + flake-utils = { + url = "github:numtide/flake-utils"; + }; + + mk-node-package = { + url = "github:winston0410/mkNodePackage"; + inputs = { + flake-utils.follows = "flake-utils"; + nixpkgs.follows = "nixpkgs"; + }; + }; + + nixpkgs = { + url = "github:NixOS/nixpkgs/nixos-unstable"; + }; }; outputs = { self, - nixpkgs, + dream2nix, flake-utils, + mk-node-package, + nixpkgs, ... }: flake-utils.lib.eachDefaultSystem ( system: let + version = "latest"; + pkgs = import nixpkgs {inherit system;}; + mkNodePackage = mk-node-package.lib."${system}".mkNodePackage; + + php81WithExtensions = with pkgs; (php81.buildEnv { + extensions = { + enabled, + all, + }: + enabled + ++ (with all; [ + redis + xdebug + ]); + extraConfig = '' + xdebug.mode=debug + ''; + }); + composer = with pkgs; (php81Packages.composer.override {php = php81WithExtensions;}); + + caCertificates = pkgs.runCommand "ca-certificates" {} '' + mkdir -p $out/etc/ssl/certs $out/etc/pki/tls/certs + ln -s ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs/ca-bundle.crt + ln -s ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs/ca-certificates.crt + ln -s ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/pki/tls/certs/ca-bundle.crt + ''; + + caddyfile = pkgs.writeText "Caddyfile" '' + :80 { + root * /var/www/html/public/ + file_server + + header { + -Server + -X-Powered-By + Referrer-Policy "same-origin" + X-Frame-Options "deny" + X-XSS-Protection "1; mode=block" + X-Content-Type-Options "nosniff" + } + + encode gzip zstd + + php_fastcgi localhost:9000 + + try_files {path} {path}/ /index.php?{query} + } + ''; + + phpfpmConf = pkgs.writeText "php-fpm.conf" '' + [global] + error_log = /dev/stderr + daemonize = no + + [www] + user = nobody + group = nobody + + listen = 0.0.0.0:9000 + + pm = dynamic + pm.start_servers = 4 + pm.min_spare_servers = 4 + pm.max_spare_servers = 16 + pm.max_children = 64 + pm.max_requests = 256 + + clear_env = no + catch_workers_output = yes + + decorate_workers_output = no + ''; + + configs = pkgs.runCommand "configs" {} '' + mkdir -p $out/etc/caddy + ln -s ${caddyfile} $out/etc/caddy/Caddyfile + ln -s ${phpfpmConf} $out/etc/php-fpm.conf + ''; + + src = with pkgs.lib; + cleanSource (cleanSourceWith { + filter = name: type: let + baseName = baseNameOf (toString name); + in + !(builtins.elem baseName [ + ".direnv" + ".github" + "bootstrap/cache" + "node_modules" + "public/build" + "public/hot" + "storage" + "vendor" + ".editorconfig" + ".env" + ".env.testing" + ".envrc" + ".gitignore" + ".php-cs-fixer.cache" + ".phpunit.result.cache" + "BUILDING.md" + "CODE_OF_CONDUCT.md" + "CONTRIBUTING.md" + "docker-compose.development.yaml" + "docker-compose.example.yaml" + "docker-compose.yaml" + "flake.lock" + "flake.nix" + "shell.nix" + ]); + src = ./.; + }); + + app = + (dream2nix.lib.makeFlakeOutputs { + config.projectRoot = src; + source = src; + settings = [ + { + translator = "composer-lock"; + subsystemInfo.noDev = true; + } + ]; + systems = [system]; + autoProjects = true; + }) + .packages + ."${system}" + ."pterodactyl/panel"; + + ui = mkNodePackage { + inherit src version; + + pname = "pterodactyl"; + buildInputs = []; + + buildPhase = '' + yarn run build:production + ''; + + installPhase = '' + mkdir -p $out + cp -r public/build $out + ''; + }; + + panel = pkgs.stdenv.mkDerivation { + inherit src version; + + pname = "pterodactyl"; + buildInputs = [app ui]; + + installPhase = '' + cp -r ${app}/lib/vendor/pterodactyl/panel $out + + chmod 755 $out + chmod 755 $out/public + + mkdir -p $out/public/build + cp -r ${ui}/build/* $out/public/build + + rm $out/composer.json.orig + ''; + }; in { - devShell = import ./shell.nix {inherit pkgs;}; + defaultPackage = panel; + devShell = import ./shell.nix {inherit composer php81WithExtensions pkgs;}; + + packages = { + inherit panel; + + development = with pkgs; + dockerTools.buildImage { + name = "pterodactyl/development"; + tag = "panel"; + + copyToRoot = pkgs.buildEnv { + name = "image-root"; + paths = [ + bash + dockerTools.fakeNss + caCertificates + caddy + composer + configs + coreutils + mysql80 + nodejs_18 + nodePackages.yarn + php81WithExtensions + ]; + pathsToLink = ["/bin" "/etc"]; + }; + }; + + oci = with pkgs; + dockerTools.buildImage { + name = "pterodactyl/panel"; + tag = version; + + copyToRoot = buildEnv { + name = "image-root"; + paths = [ + dockerTools.fakeNss + caCertificates + caddy + configs + php81WithExtensions + + panel + ]; + pathsToLink = ["/bin" "/etc"]; + }; + + config = { + Cmd = []; + }; + }; + }; } ); } diff --git a/package.json b/package.json index 562c22f7e..e716485cb 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@headlessui/react": "^1.6.4", "@heroicons/react": "^1.0.6", "@hot-loader/react-dom": "^16.14.0", + "@preact/signals-react": "^1.2.1", "@tailwindcss/forms": "^0.5.2", "@tailwindcss/line-clamp": "^0.4.0", "axios": "^0.27.2", diff --git a/phpunit.xml b/phpunit.xml index d02831cf4..8d47f564f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,9 +4,8 @@ xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="bootstrap/tests.php" colors="true" - printerClass="NunoMaduro\Collision\Adapters\Phpunit\Printer" > - + ./app @@ -22,7 +21,7 @@ - + diff --git a/resources/lang/en/activity.php b/resources/lang/en/activity.php index afa655806..501a1dcde 100644 --- a/resources/lang/en/activity.php +++ b/resources/lang/en/activity.php @@ -115,6 +115,7 @@ return [ ], 'settings' => [ 'rename' => 'Renamed the server from :old to :new', + 'description' => 'Changed the server description from :old to :new', ], 'startup' => [ 'edit' => 'Changed the :variable variable from ":old" to ":new"', diff --git a/resources/scripts/api/server/getServer.ts b/resources/scripts/api/server/getServer.ts index 5ed92a427..d2aa2e054 100644 --- a/resources/scripts/api/server/getServer.ts +++ b/resources/scripts/api/server/getServer.ts @@ -17,6 +17,7 @@ export interface Server { uuid: string; name: string; node: string; + isNodeUnderMaintenance: boolean; status: ServerStatus; sftpDetails: { ip: string; @@ -50,6 +51,7 @@ export const rawDataToServerObject = ({ attributes: data }: FractalResponseData) uuid: data.uuid, name: data.name, node: data.node, + isNodeUnderMaintenance: data.is_node_under_maintenance, status: data.status, invocation: data.invocation, dockerImage: data.docker_image, diff --git a/resources/scripts/api/server/renameServer.ts b/resources/scripts/api/server/renameServer.ts index a4a95141e..4622f9d4d 100644 --- a/resources/scripts/api/server/renameServer.ts +++ b/resources/scripts/api/server/renameServer.ts @@ -1,8 +1,8 @@ import http from '@/api/http'; -export default (uuid: string, name: string): Promise => { +export default (uuid: string, name: string, description?: string): Promise => { return new Promise((resolve, reject) => { - http.post(`/api/client/servers/${uuid}/settings/rename`, { name }) + http.post(`/api/client/servers/${uuid}/settings/rename`, { name, description }) .then(() => resolve()) .catch(reject); }); diff --git a/resources/scripts/api/server/types.d.ts b/resources/scripts/api/server/types.d.ts index 7e3e540c0..c4a01e921 100644 --- a/resources/scripts/api/server/types.d.ts +++ b/resources/scripts/api/server/types.d.ts @@ -1,4 +1,10 @@ -export type ServerStatus = 'installing' | 'install_failed' | 'suspended' | 'restoring_backup' | null; +export type ServerStatus = + | 'installing' + | 'install_failed' + | 'reinstall_failed' + | 'suspended' + | 'restoring_backup' + | null; export interface ServerBackup { uuid: string; @@ -17,7 +23,7 @@ export interface ServerEggVariable { description: string; envVariable: string; defaultValue: string; - serverValue: string; + serverValue: string | null; isEditable: boolean; rules: string[]; } diff --git a/resources/scripts/api/transformers.ts b/resources/scripts/api/transformers.ts index 4ed9a5df5..f2bea86d0 100644 --- a/resources/scripts/api/transformers.ts +++ b/resources/scripts/api/transformers.ts @@ -47,7 +47,7 @@ export const rawDataToFileObject = (data: FractalResponseData): FileObject => ({ isEditable: function () { if (this.isArchiveType() || !this.isFile) return false; - const matches = ['application/jar', 'application/octet-stream', 'inode/directory', /^image\//]; + const matches = ['application/jar', 'application/octet-stream', 'inode/directory', /^image\/(?!svg\+xml)/]; return matches.every((m) => !this.mimetype.match(m)); }, diff --git a/resources/scripts/components/elements/dialog/Dialog.tsx b/resources/scripts/components/elements/dialog/Dialog.tsx index b280f0944..bb35fe8fb 100644 --- a/resources/scripts/components/elements/dialog/Dialog.tsx +++ b/resources/scripts/components/elements/dialog/Dialog.tsx @@ -90,7 +90,7 @@ export default ({ >
{iconPosition === 'container' && icon} -
+
{iconPosition !== 'container' && icon}
diff --git a/resources/scripts/components/server/ConflictStateRenderer.tsx b/resources/scripts/components/server/ConflictStateRenderer.tsx index 70475a4ee..d090b731c 100644 --- a/resources/scripts/components/server/ConflictStateRenderer.tsx +++ b/resources/scripts/components/server/ConflictStateRenderer.tsx @@ -8,8 +8,11 @@ import ServerRestoreSvg from '@/assets/images/server_restore.svg'; export default () => { const status = ServerContext.useStoreState((state) => state.server.data?.status || null); const isTransferring = ServerContext.useStoreState((state) => state.server.data?.isTransferring || false); + const isNodeUnderMaintenance = ServerContext.useStoreState( + (state) => state.server.data?.isNodeUnderMaintenance || false + ); - return status === 'installing' || status === 'install_failed' ? ( + return status === 'installing' || status === 'install_failed' || status === 'reinstall_failed' ? ( { image={ServerErrorSvg} message={'This server is suspended and cannot be accessed.'} /> + ) : isNodeUnderMaintenance ? ( + ) : ( diff --git a/resources/scripts/components/server/TransferListener.tsx b/resources/scripts/components/server/TransferListener.tsx index 64460aa69..4d9421745 100644 --- a/resources/scripts/components/server/TransferListener.tsx +++ b/resources/scripts/components/server/TransferListener.tsx @@ -7,19 +7,19 @@ const TransferListener = () => { const getServer = ServerContext.useStoreActions((actions) => actions.server.getServer); const setServerFromState = ServerContext.useStoreActions((actions) => actions.server.setServerFromState); - // Listen for the transfer status event so we can update the state of the server. + // Listen for the transfer status event, so we can update the state of the server. useWebsocketEvent(SocketEvent.TRANSFER_STATUS, (status: string) => { - if (status === 'starting') { + if (status === 'pending' || status === 'processing') { setServerFromState((s) => ({ ...s, isTransferring: true })); return; } - if (status === 'failure') { + if (status === 'failed') { setServerFromState((s) => ({ ...s, isTransferring: false })); return; } - if (status !== 'success') { + if (status !== 'completed') { return; } diff --git a/resources/scripts/components/server/console/Console.tsx b/resources/scripts/components/server/console/Console.tsx index 9468d0a56..25f07439f 100644 --- a/resources/scripts/components/server/console/Console.tsx +++ b/resources/scripts/components/server/console/Console.tsx @@ -66,6 +66,11 @@ export default () => { const isTransferring = ServerContext.useStoreState((state) => state.server.data!.isTransferring); const [history, setHistory] = usePersistedState(`${serverId}:command_history`, []); const [historyIndex, setHistoryIndex] = useState(-1); + // SearchBarAddon has hardcoded z-index: 999 :( + const zIndex = ` + .xterm-search-bar__addon { + z-index: 10; + }`; const handleConsoleOutput = (line: string, prelude = false) => terminal.writeln((prelude ? TERMINAL_PRELUDE : '') + line.replace(/(?:\r\n|\r|\n)$/im, '') + '\u001b[0m'); @@ -76,13 +81,6 @@ export default () => { case 'failure': terminal.writeln(TERMINAL_PRELUDE + 'Transfer has failed.\u001b[0m'); return; - - // Sent by the source node whenever the server was archived successfully. - case 'archive': - terminal.writeln( - TERMINAL_PRELUDE + - 'Server has been archived successfully, attempting connection to target node..\u001b[0m' - ); } }; @@ -133,6 +131,7 @@ export default () => { terminal.open(ref.current); fitAddon.fit(); + searchBar.addNewStyle(zIndex); // Add support for capturing keys terminal.attachCustomKeyEventHandler((e: KeyboardEvent) => { diff --git a/resources/scripts/components/server/console/ServerConsoleContainer.tsx b/resources/scripts/components/server/console/ServerConsoleContainer.tsx index 59563eca4..c3af78f1c 100644 --- a/resources/scripts/components/server/console/ServerConsoleContainer.tsx +++ b/resources/scripts/components/server/console/ServerConsoleContainer.tsx @@ -19,12 +19,15 @@ const ServerConsoleContainer = () => { const isInstalling = ServerContext.useStoreState((state) => state.server.isInstalling); const isTransferring = ServerContext.useStoreState((state) => state.server.data!.isTransferring); const eggFeatures = ServerContext.useStoreState((state) => state.server.data!.eggFeatures, isEqual); + const isNodeUnderMaintenance = ServerContext.useStoreState((state) => state.server.data!.isNodeUnderMaintenance); return ( - {(isInstalling || isTransferring) && ( + {(isNodeUnderMaintenance || isInstalling || isTransferring) && ( - {isInstalling + {isNodeUnderMaintenance + ? 'The node of this server is currently under maintenance and all actions are unavailable.' + : isInstalling ? 'This server is currently running its installation process and most actions are unavailable.' : 'This server is currently being transferred to another node and all actions are unavailable.'} diff --git a/resources/scripts/components/server/databases/DatabaseRow.tsx b/resources/scripts/components/server/databases/DatabaseRow.tsx index 1b486959e..017ff5661 100644 --- a/resources/scripts/components/server/databases/DatabaseRow.tsx +++ b/resources/scripts/components/server/databases/DatabaseRow.tsx @@ -35,7 +35,7 @@ export default ({ database, className }: Props) => { const removeDatabase = ServerContext.useStoreActions((actions) => actions.databases.removeDatabase); const jdbcConnectionString = `jdbc:mysql://${database.username}${ - database.password ? `:${database.password}` : '' + database.password ? `:${encodeURIComponent(database.password)}` : '' }@${database.connectionString}/${database.name}`; const schema = object().shape({ @@ -119,14 +119,14 @@ export default ({ database, className }: Props) => {
- +
- +
diff --git a/resources/scripts/components/server/files/FileManagerStatus.tsx b/resources/scripts/components/server/files/FileManagerStatus.tsx index 2e4144d0f..3e1c2df24 100644 --- a/resources/scripts/components/server/files/FileManagerStatus.tsx +++ b/resources/scripts/components/server/files/FileManagerStatus.tsx @@ -1,11 +1,12 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useContext, useEffect } from 'react'; import { ServerContext } from '@/state/server'; -import { CloudUploadIcon } from '@heroicons/react/solid'; +import { CloudUploadIcon, XIcon } from '@heroicons/react/solid'; import asDialog from '@/hoc/asDialog'; import { Dialog, DialogWrapperContext } from '@/components/elements/dialog'; import { Button } from '@/components/elements/button/index'; import Tooltip from '@/components/elements/tooltip/Tooltip'; import Code from '@/components/elements/Code'; +import { useSignal } from '@preact/signals-react'; const svgProps = { cx: 16, @@ -31,23 +32,34 @@ const Spinner = ({ progress, className }: { progress: number; className?: string const FileUploadList = () => { const { close } = useContext(DialogWrapperContext); + const cancelFileUpload = ServerContext.useStoreActions((actions) => actions.files.cancelFileUpload); + const clearFileUploads = ServerContext.useStoreActions((actions) => actions.files.clearFileUploads); const uploads = ServerContext.useStoreState((state) => - state.files.uploads.sort((a, b) => a.name.localeCompare(b.name)) + Object.entries(state.files.uploads).sort(([a], [b]) => a.localeCompare(b)) ); return (
- {uploads.map((file) => ( -
+ {uploads.map(([name, file]) => ( +
- {file.name} + {name} +
))} + clearFileUploads()}> + Cancel Uploads + Close
@@ -60,17 +72,17 @@ const FileUploadListDialog = asDialog({ })(FileUploadList); export default () => { - const [open, setOpen] = useState(false); + const open = useSignal(false); - const count = ServerContext.useStoreState((state) => state.files.uploads.length); + const count = ServerContext.useStoreState((state) => Object.keys(state.files.uploads).length); const progress = ServerContext.useStoreState((state) => ({ - uploaded: state.files.uploads.reduce((count, file) => count + file.loaded, 0), - total: state.files.uploads.reduce((count, file) => count + file.total, 0), + uploaded: Object.values(state.files.uploads).reduce((count, file) => count + file.loaded, 0), + total: Object.values(state.files.uploads).reduce((count, file) => count + file.total, 0), })); useEffect(() => { if (count === 0) { - setOpen(false); + open.value = false; } }, [count]); @@ -78,13 +90,16 @@ export default () => { <> {count > 0 && ( - )} - + (open.value = false)} /> ); }; diff --git a/resources/scripts/components/server/files/FileObjectRow.tsx b/resources/scripts/components/server/files/FileObjectRow.tsx index 8032dab1e..08a3240c2 100644 --- a/resources/scripts/components/server/files/FileObjectRow.tsx +++ b/resources/scripts/components/server/files/FileObjectRow.tsx @@ -16,12 +16,13 @@ import { bytesToString } from '@/lib/formatters'; import styles from './style.module.css'; const Clickable: React.FC<{ file: FileObject }> = memo(({ file, children }) => { + const [canRead] = usePermissions(['file.read']); const [canReadContents] = usePermissions(['file.read-content']); const directory = ServerContext.useStoreState((state) => state.files.directory); const match = useRouteMatch(); - return !canReadContents || (file.isFile && !file.isEditable()) ? ( + return (file.isFile && (!file.isEditable() || !canReadContents)) || (!file.isFile && !canRead) ? (
{children}
) : ( { /> )} -
+
0} unmountOnExit>
diff --git a/resources/scripts/components/server/files/UploadButton.tsx b/resources/scripts/components/server/files/UploadButton.tsx index 25277456d..9ab889b8f 100644 --- a/resources/scripts/components/server/files/UploadButton.tsx +++ b/resources/scripts/components/server/files/UploadButton.tsx @@ -2,7 +2,7 @@ import axios from 'axios'; import getFileUploadUrl from '@/api/server/files/getFileUploadUrl'; import tw from 'twin.macro'; import { Button } from '@/components/elements/button/index'; -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef } from 'react'; import { ModalMask } from '@/components/elements/Modal'; import Fade from '@/components/elements/Fade'; import useEventListener from '@/plugins/useEventListener'; @@ -12,6 +12,7 @@ import { ServerContext } from '@/state/server'; import { WithClassname } from '@/components/types'; import Portal from '@/components/elements/Portal'; import { CloudUploadIcon } from '@heroicons/react/outline'; +import { useSignal } from '@preact/signals-react'; function isFileOrDirectory(event: DragEvent): boolean { if (!event.dataTransfer?.types) { @@ -23,14 +24,16 @@ function isFileOrDirectory(event: DragEvent): boolean { export default ({ className }: WithClassname) => { const fileUploadInput = useRef(null); - const [timeouts, setTimeouts] = useState([]); - const [visible, setVisible] = useState(false); + + const visible = useSignal(false); + const timeouts = useSignal([]); + const { mutate } = useFileManagerSwr(); const { addError, clearAndAddHttpError } = useFlashKey('files'); const uuid = ServerContext.useStoreState((state) => state.server.data!.uuid); const directory = ServerContext.useStoreState((state) => state.files.directory); - const { clearFileUploads, appendFileUpload, removeFileUpload } = ServerContext.useStoreActions( + const { clearFileUploads, removeFileUpload, pushFileUpload, setUploadProgress } = ServerContext.useStoreActions( (actions) => actions.files ); @@ -40,28 +43,22 @@ export default ({ className }: WithClassname) => { e.preventDefault(); e.stopPropagation(); if (isFileOrDirectory(e)) { - return setVisible(true); + visible.value = true; } }, { capture: true } ); - useEventListener('dragexit', () => setVisible(false), { capture: true }); + useEventListener('dragexit', () => (visible.value = false), { capture: true }); - useEventListener('keydown', () => { - visible && setVisible(false); - }); + useEventListener('keydown', () => (visible.value = false)); useEffect(() => { - return () => timeouts.forEach(clearTimeout); + return () => timeouts.value.forEach(clearTimeout); }, []); const onUploadProgress = (data: ProgressEvent, name: string) => { - appendFileUpload({ name, loaded: data.loaded, total: data.total }); - if (data.loaded >= data.total) { - const timeout = setTimeout(() => removeFileUpload(name), 500); - setTimeouts((t) => [...t, timeout]); - } + setUploadProgress({ name, loaded: data.loaded }); }; const onFileSubmission = (files: FileList) => { @@ -71,25 +68,27 @@ export default ({ className }: WithClassname) => { return addError('Folder uploads are not supported at this time.', 'Error'); } - if (!list.length) { - return; - } - const uploads = list.map((file) => { - appendFileUpload({ name: file.name, loaded: 0, total: file.size }); + const controller = new AbortController(); + pushFileUpload({ + name: file.name, + data: { abort: controller, loaded: 0, total: file.size }, + }); + return () => getFileUploadUrl(uuid).then((url) => - axios.post( - url, - { files: file }, - { - headers: { 'Content-Type': 'multipart/form-data' }, - params: { directory }, - onUploadProgress: (data) => { - onUploadProgress(data, file.name); - }, - } - ) + axios + .post( + url, + { files: file }, + { + signal: controller.signal, + headers: { 'Content-Type': 'multipart/form-data' }, + params: { directory }, + onUploadProgress: (data) => onUploadProgress(data, file.name), + } + ) + .then(() => timeouts.value.push(setTimeout(() => removeFileUpload(file.name), 500))) ); }); @@ -104,15 +103,15 @@ export default ({ className }: WithClassname) => { return ( <> - + setVisible(false)} + onClick={() => (visible.value = false)} onDragOver={(e) => e.preventDefault()} onDrop={(e) => { e.preventDefault(); e.stopPropagation(); - setVisible(false); + visible.value = false; if (!e.dataTransfer?.files.length) return; onFileSubmission(e.dataTransfer.files); diff --git a/resources/scripts/components/server/settings/RenameServerBox.tsx b/resources/scripts/components/server/settings/RenameServerBox.tsx index 98be2ef9f..9cb290a1a 100644 --- a/resources/scripts/components/server/settings/RenameServerBox.tsx +++ b/resources/scripts/components/server/settings/RenameServerBox.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { ServerContext } from '@/state/server'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; -import { Form, Formik, FormikHelpers, useFormikContext } from 'formik'; +import { Field as FormikField, Form, Formik, FormikHelpers, useFormikContext } from 'formik'; import { Actions, useStoreActions } from 'easy-peasy'; import renameServer from '@/api/server/renameServer'; import Field from '@/components/elements/Field'; @@ -11,19 +11,29 @@ import { ApplicationStore } from '@/state'; import { httpErrorToHuman } from '@/api/http'; import { Button } from '@/components/elements/button/index'; import tw from 'twin.macro'; +import Label from '@/components/elements/Label'; +import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper'; +import { Textarea } from '@/components/elements/Input'; interface Values { name: string; + description: string; } const RenameServerBox = () => { const { isSubmitting } = useFormikContext(); return ( - +
+
+ + + + +
@@ -37,10 +47,10 @@ export default () => { const setServer = ServerContext.useStoreActions((actions) => actions.server.setServer); const { addError, clearFlashes } = useStoreActions((actions: Actions) => actions.flashes); - const submit = ({ name }: Values, { setSubmitting }: FormikHelpers) => { + const submit = ({ name, description }: Values, { setSubmitting }: FormikHelpers) => { clearFlashes('settings'); - renameServer(server.uuid, name) - .then(() => setServer({ ...server, name })) + renameServer(server.uuid, name, description) + .then(() => setServer({ ...server, name, description })) .catch((error) => { console.error(error); addError({ key: 'settings', message: httpErrorToHuman(error) }); @@ -53,9 +63,11 @@ export default () => { onSubmit={submit} initialValues={{ name: server.name, + description: server.description, }} validationSchema={object().shape({ name: string().required().min(1), + description: string().nullable(), })} > diff --git a/resources/scripts/components/server/startup/VariableBox.tsx b/resources/scripts/components/server/startup/VariableBox.tsx index ad73615c6..ba3a4fe47 100644 --- a/resources/scripts/components/server/startup/VariableBox.tsx +++ b/resources/scripts/components/server/startup/VariableBox.tsx @@ -5,7 +5,6 @@ import { usePermissions } from '@/plugins/usePermissions'; import InputSpinner from '@/components/elements/InputSpinner'; import Input from '@/components/elements/Input'; import Switch from '@/components/elements/Switch'; -import tw from 'twin.macro'; import { debounce } from 'debounce'; import updateStartupVariable from '@/api/server/updateStartupVariable'; import useFlash from '@/plugins/useFlash'; @@ -61,15 +60,15 @@ const VariableBox = ({ variable }: Props) => { return ( +

{!variable.isEditable && ( - Read Only + Read Only )} {variable.name}

} > - + {useSwitch ? ( <> @@ -97,7 +96,7 @@ const VariableBox = ({ variable }: Props) => { - MB + MiB
@@ -129,7 +129,7 @@
- MB + MiB
diff --git a/resources/views/admin/nodes/view/index.blade.php b/resources/views/admin/nodes/view/index.blade.php index 9ef461076..2d0bb3287 100644 --- a/resources/views/admin/nodes/view/index.blade.php +++ b/resources/views/admin/nodes/view/index.blade.php @@ -93,7 +93,7 @@
@if($node->maintenance_mode)
-
+
This node is under @@ -107,7 +107,7 @@
Disk Space Allocated - {{ $stats['disk']['value'] }} / {{ $stats['disk']['max'] }} MB + {{ $stats['disk']['value'] }} / {{ $stats['disk']['max'] }} MiB
@@ -119,7 +119,7 @@
Memory Allocated - {{ $stats['memory']['value'] }} / {{ $stats['memory']['max'] }} MB + {{ $stats['memory']['value'] }} / {{ $stats['memory']['max'] }} MiB
diff --git a/resources/views/admin/nodes/view/settings.blade.php b/resources/views/admin/nodes/view/settings.blade.php index e4848aca3..bfc9d8caf 100644 --- a/resources/views/admin/nodes/view/settings.blade.php +++ b/resources/views/admin/nodes/view/settings.blade.php @@ -132,7 +132,7 @@
- MB + MiB
@@ -151,7 +151,7 @@
- MB + MiB
@@ -177,7 +177,7 @@
- MB + MiB

Enter the maximum size of files that can be uploaded through the web-based file manager.

diff --git a/resources/views/admin/servers/new.blade.php b/resources/views/admin/servers/new.blade.php index bbe779ce6..4198634f1 100644 --- a/resources/views/admin/servers/new.blade.php +++ b/resources/views/admin/servers/new.blade.php @@ -170,7 +170,7 @@
- MB + MiB

The maximum amount of memory allowed for this container. Setting this to 0 will allow unlimited memory in a container.

@@ -181,7 +181,7 @@
- MB + MiB

Setting this to 0 will disable swap space on this server. Setting to -1 will allow unlimited swap.

@@ -194,7 +194,7 @@
- MB + MiB

This server will not be allowed to boot if it is using more than this amount of space. If a server goes over this limit while running it will be safely stopped and locked until enough space is available. Set to 0 to allow unlimited disk usage.

diff --git a/resources/views/admin/servers/view/build.blade.php b/resources/views/admin/servers/view/build.blade.php index f7ba9a2d2..655ea36af 100644 --- a/resources/views/admin/servers/view/build.blade.php +++ b/resources/views/admin/servers/view/build.blade.php @@ -43,7 +43,7 @@
- MB + MiB

The maximum amount of memory allowed for this container. Setting this to 0 will allow unlimited memory in a container.

@@ -51,7 +51,7 @@
- MB + MiB

Setting this to 0 will disable swap space on this server. Setting to -1 will allow unlimited swap.

@@ -59,7 +59,7 @@
- MB + MiB

This server will not be allowed to boot if it is using more than this amount of space. If a server goes over this limit while running it will be safely stopped and locked until enough space is available. Set to 0 to allow unlimited disk usage.

diff --git a/resources/views/admin/servers/view/index.blade.php b/resources/views/admin/servers/view/index.blade.php index e9b95f985..f94c6d42f 100644 --- a/resources/views/admin/servers/view/index.blade.php +++ b/resources/views/admin/servers/view/index.blade.php @@ -78,7 +78,7 @@ @if($server->memory === 0) Unlimited @else - {{ $server->memory }}MB + {{ $server->memory }}MiB @endif / @if($server->swap === 0) @@ -86,7 +86,7 @@ @elseif($server->swap === -1) Unlimited @else - {{ $server->swap }}MB + {{ $server->swap }}MiB @endif diff --git a/resources/views/admin/settings/mail.blade.php b/resources/views/admin/settings/mail.blade.php index b13446995..9e99acd30 100644 --- a/resources/views/admin/settings/mail.blade.php +++ b/resources/views/admin/settings/mail.blade.php @@ -38,14 +38,14 @@
- +

Enter the SMTP server address that mail should be sent through.

- +

Enter the SMTP server port that mail should be sent through.

@@ -53,9 +53,9 @@
@php - $encryption = old('mail:encryption', config('mail.mailers.smtp.encryption')); + $encryption = old('mail:mailers:smtp:encryption', config('mail.mailers.smtp.encryption')); @endphp - @@ -66,14 +66,14 @@
- +

The username to use when connecting to the SMTP server.

- +

The password to use in conjunction with the SMTP username. Leave blank to continue using the existing password. To set the password to an empty value enter !e into the field.

@@ -120,11 +120,11 @@ url: '/admin/settings/mail', contentType: 'application/json', data: JSON.stringify({ - 'mail:host': $('input[name="mail:host"]').val(), - 'mail:port': $('input[name="mail:port"]').val(), - 'mail:encryption': $('select[name="mail:encryption"]').val(), - 'mail:username': $('input[name="mail:username"]').val(), - 'mail:password': $('input[name="mail:password"]').val(), + 'mail:mailers:smtp:host': $('input[name="mail:mailers:smtp:host"]').val(), + 'mail:mailers:smtp:port': $('input[name="mail:mailers:smtp:port"]').val(), + 'mail:mailers:smtp:encryption': $('select[name="mail:mailers:smtp:encryption"]').val(), + 'mail:mailers:smtp:username': $('input[name="mail:mailers:smtp:username"]').val(), + 'mail:mailers:smtp:password': $('input[name="mail:mailers:smtp:password"]').val(), 'mail:from:address': $('input[name="mail:from:address"]').val(), 'mail:from:name': $('input[name="mail:from:name"]').val() }), diff --git a/routes/api-remote.php b/routes/api-remote.php index e43c62eaf..88b2a6ea1 100644 --- a/routes/api-remote.php +++ b/routes/api-remote.php @@ -15,9 +15,10 @@ Route::group(['prefix' => '/servers/{uuid}'], function () { Route::get('/install', [Remote\Servers\ServerInstallController::class, 'index']); Route::post('/install', [Remote\Servers\ServerInstallController::class, 'store']); - Route::post('/archive', [Remote\Servers\ServerTransferController::class, 'archive']); Route::get('/transfer/failure', [Remote\Servers\ServerTransferController::class, 'failure']); Route::get('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']); + Route::post('/transfer/failure', [Remote\Servers\ServerTransferController::class, 'failure']); + Route::post('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']); }); Route::group(['prefix' => '/backups'], function () { diff --git a/routes/auth.php b/routes/auth.php index 7d0930f11..36039f3a2 100644 --- a/routes/auth.php +++ b/routes/auth.php @@ -1,5 +1,6 @@ name('auth.login'); Route::get('/password', [Auth\LoginController::class, 'index'])->name('auth.forgot-password'); @@ -38,12 +39,12 @@ Route::middleware(['throttle:authentication'])->group(function () { // is created). Route::post('/password/reset', Auth\ResetPasswordController::class)->name('auth.reset-password'); -// Remove the guest middleware and apply the authenticated middleware to this endpoint +// Remove the guest middleware and apply the authenticated middleware to this endpoint, // so it cannot be used unless you're already logged in. Route::post('/logout', [Auth\LoginController::class, 'logout']) ->withoutMiddleware('guest') ->middleware('auth') ->name('auth.logout'); -// Catch any other combinations of routes and pass them off to the Vuejs component. +// Catch any other combinations of routes and pass them off to the React component. Route::fallback([Auth\LoginController::class, 'index']); diff --git a/shell.nix b/shell.nix index afe21af5e..6eee625ab 100644 --- a/shell.nix +++ b/shell.nix @@ -1,17 +1,19 @@ -{pkgs ? import {}}: +{ + composer ? null, + php81WithExtensions ? null, + pkgs ? import {}, +}: with pkgs; mkShell rec { buildInputs = [ alejandra - (php81.buildEnv { - extensions = ({ enabled, all }: enabled ++ (with all; [ - redis - xdebug - ])); - extraConfig = '' - xdebug.mode=debug - ''; - }) - php81Packages.composer + composer + nodejs_18 + nodePackages.yarn + php81WithExtensions ]; + + shellHook = '' + PATH="$PATH:${pkgs.docker-compose}/libexec/docker/cli-plugins" + ''; } diff --git a/tests/Integration/Api/Application/Users/UserControllerTest.php b/tests/Integration/Api/Application/Users/UserControllerTest.php index 713f6264a..04709e55f 100644 --- a/tests/Integration/Api/Application/Users/UserControllerTest.php +++ b/tests/Integration/Api/Application/Users/UserControllerTest.php @@ -299,7 +299,7 @@ class UserControllerTest extends ApplicationApiIntegrationTestCase * Endpoints that should return a 403 error when the key does not have write * permissions for user management. */ - public function userWriteEndpointsDataProvider(): array + public static function userWriteEndpointsDataProvider(): array { return [ ['postJson', '/api/application/users'], diff --git a/tests/Integration/Api/Client/ApiKeyControllerTest.php b/tests/Integration/Api/Client/ApiKeyControllerTest.php index 9aa515f9b..39b2055eb 100644 --- a/tests/Integration/Api/Client/ApiKeyControllerTest.php +++ b/tests/Integration/Api/Client/ApiKeyControllerTest.php @@ -241,7 +241,7 @@ class ApiKeyControllerTest extends ClientApiIntegrationTestCase * Provides some different IP address combinations that can be used when * testing that we accept the expected IP values. */ - public function validIPAddressDataProvider(): array + public static function validIPAddressDataProvider(): array { return [ [[]], diff --git a/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php b/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php index 25b5c30cd..bc515386c 100644 --- a/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php +++ b/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php @@ -2,11 +2,9 @@ namespace Pterodactyl\Tests\Integration\Api\Client; -use ReflectionClass; use Pterodactyl\Models\Node; use Pterodactyl\Models\Task; use Pterodactyl\Models\User; -use InvalidArgumentException; use Pterodactyl\Models\Model; use Pterodactyl\Models\Backup; use Pterodactyl\Models\Server; @@ -75,7 +73,7 @@ abstract class ClientApiIntegrationTestCase extends IntegrationTestCase $link = "/api/client/servers/{$model->server->uuid}/backups/$model->uuid"; break; default: - throw new InvalidArgumentException(sprintf('Cannot create link for Model of type %s', class_basename($model))); + throw new \InvalidArgumentException(sprintf('Cannot create link for Model of type %s', class_basename($model))); } return $link . ($append ? '/' . ltrim($append, '/') : ''); @@ -87,7 +85,7 @@ abstract class ClientApiIntegrationTestCase extends IntegrationTestCase */ protected function assertJsonTransformedWith(array $data, Model|EloquentModel $model) { - $reflect = new ReflectionClass($model); + $reflect = new \ReflectionClass($model); $transformer = sprintf('\\Pterodactyl\\Transformers\\Api\\Client\\%sTransformer', $reflect->getShortName()); $transformer = new $transformer(); diff --git a/tests/Integration/Api/Client/ClientControllerTest.php b/tests/Integration/Api/Client/ClientControllerTest.php index 033b893c3..3a080e23e 100644 --- a/tests/Integration/Api/Client/ClientControllerTest.php +++ b/tests/Integration/Api/Client/ClientControllerTest.php @@ -331,7 +331,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase $response->assertJsonPath('data.0.attributes.relationships.allocations.data.0.attributes.notes', null); } - public function filterTypeDataProvider(): array + public static function filterTypeDataProvider(): array { return [['admin'], ['admin-all']]; } diff --git a/tests/Integration/Api/Client/Server/Allocation/AllocationAuthorizationTest.php b/tests/Integration/Api/Client/Server/Allocation/AllocationAuthorizationTest.php index 11ad2fa83..9c5eebd10 100644 --- a/tests/Integration/Api/Client/Server/Allocation/AllocationAuthorizationTest.php +++ b/tests/Integration/Api/Client/Server/Allocation/AllocationAuthorizationTest.php @@ -46,7 +46,7 @@ class AllocationAuthorizationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->json($method, $this->link($server3, '/network/allocations/' . $allocation3->id . $endpoint))->assertNotFound(); } - public function methodDataProvider(): array + public static function methodDataProvider(): array { return [ ['POST', ''], diff --git a/tests/Integration/Api/Client/Server/Allocation/CreateNewAllocationTest.php b/tests/Integration/Api/Client/Server/Allocation/CreateNewAllocationTest.php index 1abb106cd..8022fb1e4 100644 --- a/tests/Integration/Api/Client/Server/Allocation/CreateNewAllocationTest.php +++ b/tests/Integration/Api/Client/Server/Allocation/CreateNewAllocationTest.php @@ -86,7 +86,7 @@ class CreateNewAllocationTest extends ClientApiIntegrationTestCase ->assertJsonPath('errors.0.detail', 'Cannot assign additional allocations to this server: limit has been reached.'); } - public function permissionDataProvider(): array + public static function permissionDataProvider(): array { return [[[Permission::ACTION_ALLOCATION_CREATE]], [[]]]; } diff --git a/tests/Integration/Api/Client/Server/Allocation/DeleteAllocationTest.php b/tests/Integration/Api/Client/Server/Allocation/DeleteAllocationTest.php index 42db6eef7..7d4737b75 100644 --- a/tests/Integration/Api/Client/Server/Allocation/DeleteAllocationTest.php +++ b/tests/Integration/Api/Client/Server/Allocation/DeleteAllocationTest.php @@ -98,10 +98,7 @@ class DeleteAllocationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->deleteJson($this->link($server, "/network/allocations/{$server2->allocation_id}"))->assertNotFound(); } - /** - * @return array - */ - public function permissionDataProvider() + public static function permissionDataProvider(): array { return [[[Permission::ACTION_ALLOCATION_DELETE]], [[]]]; } diff --git a/tests/Integration/Api/Client/Server/Backup/BackupAuthorizationTest.php b/tests/Integration/Api/Client/Server/Backup/BackupAuthorizationTest.php index 187c522a9..20d9e13a7 100644 --- a/tests/Integration/Api/Client/Server/Backup/BackupAuthorizationTest.php +++ b/tests/Integration/Api/Client/Server/Backup/BackupAuthorizationTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server\Backup; -use Mockery; use Carbon\CarbonImmutable; use Pterodactyl\Models\Backup; use Pterodactyl\Models\Subuser; @@ -31,7 +30,7 @@ class BackupAuthorizationTest extends ClientApiIntegrationTestCase $backup2 = Backup::factory()->create(['server_id' => $server2->id, 'completed_at' => CarbonImmutable::now()]); $backup3 = Backup::factory()->create(['server_id' => $server3->id, 'completed_at' => CarbonImmutable::now()]); - $this->instance(DeleteBackupService::class, $mock = Mockery::mock(DeleteBackupService::class)); + $this->instance(DeleteBackupService::class, $mock = \Mockery::mock(DeleteBackupService::class)); if ($method === 'DELETE') { $mock->expects('handle')->andReturnUndefined(); @@ -55,7 +54,7 @@ class BackupAuthorizationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->json($method, $this->link($server3, '/backups/' . $backup3->uuid . $endpoint))->assertNotFound(); } - public function methodDataProvider(): array + public static function methodDataProvider(): array { return [ ['GET', ''], diff --git a/tests/Integration/Api/Client/Server/Backup/DeleteBackupTest.php b/tests/Integration/Api/Client/Server/Backup/DeleteBackupTest.php index e5ea95d54..5c4d53e49 100644 --- a/tests/Integration/Api/Client/Server/Backup/DeleteBackupTest.php +++ b/tests/Integration/Api/Client/Server/Backup/DeleteBackupTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server\Backup; -use Mockery; use Mockery\MockInterface; use Illuminate\Http\Response; use Pterodactyl\Models\Backup; @@ -48,7 +47,7 @@ class DeleteBackupTest extends ClientApiIntegrationTestCase $backup = Backup::factory()->create(['server_id' => $server->id]); $this->repository->expects('setServer->delete')->with( - Mockery::on(function ($value) use ($backup) { + \Mockery::on(function ($value) use ($backup) { return $value instanceof Backup && $value->uuid === $backup->uuid; }) )->andReturn(new Response()); diff --git a/tests/Integration/Api/Client/Server/CommandControllerTest.php b/tests/Integration/Api/Client/Server/CommandControllerTest.php index 8fa106cfc..14d6da3f2 100644 --- a/tests/Integration/Api/Client/Server/CommandControllerTest.php +++ b/tests/Integration/Api/Client/Server/CommandControllerTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server; -use Mockery; use GuzzleHttp\Psr7\Request; use Illuminate\Http\Response; use Pterodactyl\Models\Server; @@ -55,7 +54,7 @@ class CommandControllerTest extends ClientApiIntegrationTestCase $mock = $this->mock(DaemonCommandRepository::class); $mock->expects('setServer') - ->with(Mockery::on(fn (Server $value) => $value->is($server))) + ->with(\Mockery::on(fn (Server $value) => $value->is($server))) ->andReturnSelf(); $mock->expects('send')->with('say Test')->andReturn(new GuzzleResponse()); diff --git a/tests/Integration/Api/Client/Server/Database/DatabaseAuthorizationTest.php b/tests/Integration/Api/Client/Server/Database/DatabaseAuthorizationTest.php index ba15c595c..2ea709ce5 100644 --- a/tests/Integration/Api/Client/Server/Database/DatabaseAuthorizationTest.php +++ b/tests/Integration/Api/Client/Server/Database/DatabaseAuthorizationTest.php @@ -58,7 +58,7 @@ class DatabaseAuthorizationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->json($method, $this->link($server3, '/databases/' . $hashids->encode($database3->id) . $endpoint))->assertNotFound(); } - public function methodDataProvider(): array + public static function methodDataProvider(): array { return [ ['POST', '/rotate-password'], diff --git a/tests/Integration/Api/Client/Server/NetworkAllocationControllerTest.php b/tests/Integration/Api/Client/Server/NetworkAllocationControllerTest.php index c9523733d..b19be99cc 100644 --- a/tests/Integration/Api/Client/Server/NetworkAllocationControllerTest.php +++ b/tests/Integration/Api/Client/Server/NetworkAllocationControllerTest.php @@ -133,7 +133,7 @@ class NetworkAllocationControllerTest extends ClientApiIntegrationTestCase ->assertForbidden(); } - public function updatePermissionsDataProvider(): array + public static function updatePermissionsDataProvider(): array { return [[[]], [[Permission::ACTION_ALLOCATION_UPDATE]]]; } diff --git a/tests/Integration/Api/Client/Server/PowerControllerTest.php b/tests/Integration/Api/Client/Server/PowerControllerTest.php index c061add32..f31244948 100644 --- a/tests/Integration/Api/Client/Server/PowerControllerTest.php +++ b/tests/Integration/Api/Client/Server/PowerControllerTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server; -use Mockery; use Illuminate\Http\Response; use Pterodactyl\Models\Permission; use Pterodactyl\Repositories\Wings\DaemonPowerRepository; @@ -51,13 +50,13 @@ class PowerControllerTest extends ClientApiIntegrationTestCase */ public function testActionCanBeSentToServer(string $action, string $permission) { - $service = Mockery::mock(DaemonPowerRepository::class); + $service = \Mockery::mock(DaemonPowerRepository::class); $this->app->instance(DaemonPowerRepository::class, $service); [$user, $server] = $this->generateTestAccount([$permission]); $service->expects('setServer') - ->with(Mockery::on(function ($value) use ($server) { + ->with(\Mockery::on(function ($value) use ($server) { return $server->uuid === $value->uuid; })) ->andReturnSelf() @@ -73,7 +72,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase /** * Returns invalid permission combinations for a given power action. */ - public function invalidPermissionDataProvider(): array + public static function invalidPermissionDataProvider(): array { return [ ['start', [Permission::ACTION_CONTROL_STOP, Permission::ACTION_CONTROL_RESTART]], @@ -84,7 +83,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase ]; } - public function validPowerActionDataProvider(): array + public static function validPowerActionDataProvider(): array { return [ ['start', Permission::ACTION_CONTROL_START], diff --git a/tests/Integration/Api/Client/Server/ResourceUtilizationControllerTest.php b/tests/Integration/Api/Client/Server/ResourceUtilizationControllerTest.php index b18de2f5f..82c1a442f 100644 --- a/tests/Integration/Api/Client/Server/ResourceUtilizationControllerTest.php +++ b/tests/Integration/Api/Client/Server/ResourceUtilizationControllerTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server; -use Mockery; use Pterodactyl\Models\Permission; use Pterodactyl\Repositories\Wings\DaemonServerRepository; use Pterodactyl\Tests\Integration\Api\Client\ClientApiIntegrationTestCase; @@ -14,12 +13,12 @@ class ResourceUtilizationControllerTest extends ClientApiIntegrationTestCase */ public function testServerResourceUtilizationIsReturned() { - $service = Mockery::mock(DaemonServerRepository::class); + $service = \Mockery::mock(DaemonServerRepository::class); $this->app->instance(DaemonServerRepository::class, $service); [$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]); - $service->expects('setServer')->with(Mockery::on(function ($value) use ($server) { + $service->expects('setServer')->with(\Mockery::on(function ($value) use ($server) { return $server->uuid === $value->uuid; }))->andReturnSelf()->getMock()->expects('getDetails')->andReturns([]); diff --git a/tests/Integration/Api/Client/Server/Schedule/CreateServerScheduleTest.php b/tests/Integration/Api/Client/Server/Schedule/CreateServerScheduleTest.php index f87aef292..f72ef09f5 100644 --- a/tests/Integration/Api/Client/Server/Schedule/CreateServerScheduleTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/CreateServerScheduleTest.php @@ -89,7 +89,7 @@ class CreateServerScheduleTest extends ClientApiIntegrationTestCase ->assertForbidden(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SCHEDULE_CREATE]]]; } diff --git a/tests/Integration/Api/Client/Server/Schedule/DeleteServerScheduleTest.php b/tests/Integration/Api/Client/Server/Schedule/DeleteServerScheduleTest.php index 4a79584a8..d44447025 100644 --- a/tests/Integration/Api/Client/Server/Schedule/DeleteServerScheduleTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/DeleteServerScheduleTest.php @@ -77,7 +77,7 @@ class DeleteServerScheduleTest extends ClientApiIntegrationTestCase $this->assertDatabaseHas('schedules', ['id' => $schedule->id]); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SCHEDULE_DELETE]]]; } diff --git a/tests/Integration/Api/Client/Server/Schedule/ExecuteScheduleTest.php b/tests/Integration/Api/Client/Server/Schedule/ExecuteScheduleTest.php index 9964691aa..7ca355299 100644 --- a/tests/Integration/Api/Client/Server/Schedule/ExecuteScheduleTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/ExecuteScheduleTest.php @@ -64,7 +64,7 @@ class ExecuteScheduleTest extends ClientApiIntegrationTestCase $this->actingAs($user)->postJson($this->link($schedule, '/execute'))->assertForbidden(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]]; } diff --git a/tests/Integration/Api/Client/Server/Schedule/GetServerSchedulesTest.php b/tests/Integration/Api/Client/Server/Schedule/GetServerSchedulesTest.php index d9d2ae3f6..483c7ae42 100644 --- a/tests/Integration/Api/Client/Server/Schedule/GetServerSchedulesTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/GetServerSchedulesTest.php @@ -89,7 +89,7 @@ class GetServerSchedulesTest extends ClientApiIntegrationTestCase ->assertForbidden(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [ [[], false], diff --git a/tests/Integration/Api/Client/Server/Schedule/ScheduleAuthorizationTest.php b/tests/Integration/Api/Client/Server/Schedule/ScheduleAuthorizationTest.php index a8a881194..bf5b8d729 100644 --- a/tests/Integration/Api/Client/Server/Schedule/ScheduleAuthorizationTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/ScheduleAuthorizationTest.php @@ -54,7 +54,7 @@ class ScheduleAuthorizationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->json($method, $this->link($server3, '/schedules/' . $schedule3->id . $endpoint))->assertNotFound(); } - public function methodDataProvider(): array + public static function methodDataProvider(): array { return [ ['GET', ''], diff --git a/tests/Integration/Api/Client/Server/Schedule/UpdateServerScheduleTest.php b/tests/Integration/Api/Client/Server/Schedule/UpdateServerScheduleTest.php index 7442a2b5f..23a054b34 100644 --- a/tests/Integration/Api/Client/Server/Schedule/UpdateServerScheduleTest.php +++ b/tests/Integration/Api/Client/Server/Schedule/UpdateServerScheduleTest.php @@ -109,7 +109,7 @@ class UpdateServerScheduleTest extends ClientApiIntegrationTestCase $this->assertFalse($schedule->is_processing); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]]; } diff --git a/tests/Integration/Api/Client/Server/ScheduleTask/CreateServerScheduleTaskTest.php b/tests/Integration/Api/Client/Server/ScheduleTask/CreateServerScheduleTaskTest.php index a71e0233c..736344a68 100644 --- a/tests/Integration/Api/Client/Server/ScheduleTask/CreateServerScheduleTaskTest.php +++ b/tests/Integration/Api/Client/Server/ScheduleTask/CreateServerScheduleTaskTest.php @@ -170,7 +170,7 @@ class CreateServerScheduleTaskTest extends ClientApiIntegrationTestCase ->assertForbidden(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]]; } diff --git a/tests/Integration/Api/Client/Server/SettingsControllerTest.php b/tests/Integration/Api/Client/Server/SettingsControllerTest.php index c92754cfa..fcc7a5ce7 100644 --- a/tests/Integration/Api/Client/Server/SettingsControllerTest.php +++ b/tests/Integration/Api/Client/Server/SettingsControllerTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server; -use Mockery; use Illuminate\Http\Response; use Pterodactyl\Models\Server; use Pterodactyl\Models\Permission; @@ -21,9 +20,11 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase /** @var \Pterodactyl\Models\Server $server */ [$user, $server] = $this->generateTestAccount($permissions); $originalName = $server->name; + $originalDescription = $server->description; $response = $this->actingAs($user)->postJson("/api/client/servers/$server->uuid/settings/rename", [ 'name' => '', + 'description' => '', ]); $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY); @@ -31,15 +32,18 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase $server = $server->refresh(); $this->assertSame($originalName, $server->name); + $this->assertSame($originalDescription, $server->description); $this->actingAs($user) ->postJson("/api/client/servers/$server->uuid/settings/rename", [ 'name' => 'Test Server Name', + 'description' => 'This is a test server.', ]) ->assertStatus(Response::HTTP_NO_CONTENT); $server = $server->refresh(); $this->assertSame('Test Server Name', $server->name); + $this->assertSame('This is a test server.', $server->description); } /** @@ -73,11 +77,11 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase [$user, $server] = $this->generateTestAccount($permissions); $this->assertTrue($server->isInstalled()); - $service = Mockery::mock(DaemonServerRepository::class); + $service = \Mockery::mock(DaemonServerRepository::class); $this->app->instance(DaemonServerRepository::class, $service); $service->expects('setServer') - ->with(Mockery::on(function ($value) use ($server) { + ->with(\Mockery::on(function ($value) use ($server) { return $value->uuid === $server->uuid; })) ->andReturnSelf() @@ -108,12 +112,12 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase $this->assertTrue($server->isInstalled()); } - public function renamePermissionsDataProvider(): array + public static function renamePermissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SETTINGS_RENAME]]]; } - public function reinstallPermissionsDataProvider(): array + public static function reinstallPermissionsDataProvider(): array { return [[[]], [[Permission::ACTION_SETTINGS_REINSTALL]]]; } diff --git a/tests/Integration/Api/Client/Server/Startup/GetStartupAndVariablesTest.php b/tests/Integration/Api/Client/Server/Startup/GetStartupAndVariablesTest.php index a8a5b88e0..04150e07f 100644 --- a/tests/Integration/Api/Client/Server/Startup/GetStartupAndVariablesTest.php +++ b/tests/Integration/Api/Client/Server/Startup/GetStartupAndVariablesTest.php @@ -58,7 +58,7 @@ class GetStartupAndVariablesTest extends ClientApiIntegrationTestCase $this->actingAs($user2)->getJson($this->link($server) . '/startup')->assertNotFound(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_STARTUP_READ]]]; } diff --git a/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php b/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php index d7ade1eef..fed4d1377 100644 --- a/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php +++ b/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php @@ -149,7 +149,7 @@ class UpdateStartupVariableTest extends ClientApiIntegrationTestCase $this->actingAs($user2)->putJson($this->link($server) . '/startup/variable')->assertNotFound(); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_STARTUP_UPDATE]]]; } diff --git a/tests/Integration/Api/Client/Server/Subuser/CreateServerSubuserTest.php b/tests/Integration/Api/Client/Server/Subuser/CreateServerSubuserTest.php index f55ca18a8..c12ede61a 100644 --- a/tests/Integration/Api/Client/Server/Subuser/CreateServerSubuserTest.php +++ b/tests/Integration/Api/Client/Server/Subuser/CreateServerSubuserTest.php @@ -155,7 +155,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase $response->assertJsonPath('errors.0.detail', 'A user with that email address is already assigned as a subuser for this server.'); } - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [[[]], [[Permission::ACTION_USER_CREATE]]]; } diff --git a/tests/Integration/Api/Client/Server/Subuser/DeleteSubuserTest.php b/tests/Integration/Api/Client/Server/Subuser/DeleteSubuserTest.php index 80fd9845f..45753ea6c 100644 --- a/tests/Integration/Api/Client/Server/Subuser/DeleteSubuserTest.php +++ b/tests/Integration/Api/Client/Server/Subuser/DeleteSubuserTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server\Subuser; -use Mockery; use Ramsey\Uuid\Uuid; use Pterodactyl\Models\User; use Pterodactyl\Models\Subuser; @@ -25,7 +24,7 @@ class DeleteSubuserTest extends ClientApiIntegrationTestCase */ public function testCorrectSubuserIsDeletedFromServer() { - $this->swap(DaemonServerRepository::class, $mock = Mockery::mock(DaemonServerRepository::class)); + $this->swap(DaemonServerRepository::class, $mock = \Mockery::mock(DaemonServerRepository::class)); [$user, $server] = $this->generateTestAccount(); diff --git a/tests/Integration/Api/Client/Server/Subuser/SubuserAuthorizationTest.php b/tests/Integration/Api/Client/Server/Subuser/SubuserAuthorizationTest.php index 242130fe9..c7935aa34 100644 --- a/tests/Integration/Api/Client/Server/Subuser/SubuserAuthorizationTest.php +++ b/tests/Integration/Api/Client/Server/Subuser/SubuserAuthorizationTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Api\Client\Server\Subuser; -use Mockery; use Pterodactyl\Models\User; use Pterodactyl\Models\Subuser; use Pterodactyl\Repositories\Wings\DaemonServerRepository; @@ -36,7 +35,7 @@ class SubuserAuthorizationTest extends ClientApiIntegrationTestCase Subuser::factory()->create(['server_id' => $server2->id, 'user_id' => $internal->id]); Subuser::factory()->create(['server_id' => $server3->id, 'user_id' => $internal->id]); - $this->instance(DaemonServerRepository::class, $mock = Mockery::mock(DaemonServerRepository::class)); + $this->instance(DaemonServerRepository::class, $mock = \Mockery::mock(DaemonServerRepository::class)); if ($method === 'DELETE') { $mock->expects('setServer->revokeUserJTI')->with($internal->id)->andReturnUndefined(); } @@ -50,7 +49,7 @@ class SubuserAuthorizationTest extends ClientApiIntegrationTestCase $this->actingAs($user)->json($method, $this->link($server3, '/users/' . $internal->uuid))->assertNotFound(); } - public function methodDataProvider(): array + public static function methodDataProvider(): array { return [['GET'], ['POST'], ['DELETE']]; } diff --git a/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php b/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php index 9e7136a80..38d4ccc65 100644 --- a/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php +++ b/tests/Integration/Api/Remote/SftpAuthenticationControllerTest.php @@ -213,7 +213,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase $this->post('/api/remote/sftp/auth', $data)->assertForbidden(); } - public function authorizationTypeDataProvider(): array + public static function authorizationTypeDataProvider(): array { return [ 'password auth' => ['password'], @@ -221,7 +221,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase ]; } - public function serverStateDataProvider(): array + public static function serverStateDataProvider(): array { return [ 'installing' => [Server::STATUS_INSTALLING], diff --git a/tests/Integration/Jobs/Schedule/RunTaskJobTest.php b/tests/Integration/Jobs/Schedule/RunTaskJobTest.php index b80679bd7..c1c324425 100644 --- a/tests/Integration/Jobs/Schedule/RunTaskJobTest.php +++ b/tests/Integration/Jobs/Schedule/RunTaskJobTest.php @@ -2,14 +2,11 @@ namespace Pterodactyl\Tests\Integration\Jobs\Schedule; -use Mockery; use Carbon\Carbon; -use DateTimeInterface; use Carbon\CarbonImmutable; use GuzzleHttp\Psr7\Request; use Pterodactyl\Models\Task; use GuzzleHttp\Psr7\Response; -use InvalidArgumentException; use Pterodactyl\Models\Server; use Pterodactyl\Models\Schedule; use Illuminate\Support\Facades\Bus; @@ -40,7 +37,7 @@ class RunTaskJobTest extends IntegrationTestCase $job = new RunTaskJob($task); - Bus::dispatchNow($job); + Bus::dispatchSync($job); $task->refresh(); $schedule->refresh(); @@ -48,7 +45,7 @@ class RunTaskJobTest extends IntegrationTestCase $this->assertFalse($task->is_queued); $this->assertFalse($schedule->is_processing); $this->assertFalse($schedule->is_active); - $this->assertTrue(CarbonImmutable::now()->isSameAs(DateTimeInterface::ATOM, $schedule->last_run_at)); + $this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at)); } public function testJobWithInvalidActionThrowsException() @@ -62,9 +59,9 @@ class RunTaskJobTest extends IntegrationTestCase $job = new RunTaskJob($task); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Invalid task action provided: foobar'); - Bus::dispatchNow($job); + Bus::dispatchSync($job); } /** @@ -90,22 +87,22 @@ class RunTaskJobTest extends IntegrationTestCase 'continue_on_failure' => false, ]); - $mock = Mockery::mock(DaemonPowerRepository::class); + $mock = \Mockery::mock(DaemonPowerRepository::class); $this->instance(DaemonPowerRepository::class, $mock); - $mock->expects('setServer')->with(Mockery::on(function ($value) use ($server) { + $mock->expects('setServer')->with(\Mockery::on(function ($value) use ($server) { return $value instanceof Server && $value->id === $server->id; }))->andReturnSelf(); $mock->expects('send')->with('start')->andReturn(new Response()); - Bus::dispatchNow(new RunTaskJob($task, $isManualRun)); + Bus::dispatchSync(new RunTaskJob($task, $isManualRun)); $task->refresh(); $schedule->refresh(); $this->assertFalse($task->is_queued); $this->assertFalse($schedule->is_processing); - $this->assertTrue(CarbonImmutable::now()->isSameAs(DateTimeInterface::ATOM, $schedule->last_run_at)); + $this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at)); } /** @@ -125,7 +122,7 @@ class RunTaskJobTest extends IntegrationTestCase 'continue_on_failure' => $continueOnFailure, ]); - $mock = Mockery::mock(DaemonPowerRepository::class); + $mock = \Mockery::mock(DaemonPowerRepository::class); $this->instance(DaemonPowerRepository::class, $mock); $mock->expects('setServer->send')->andThrow( @@ -136,7 +133,7 @@ class RunTaskJobTest extends IntegrationTestCase $this->expectException(DaemonConnectionException::class); } - Bus::dispatchNow(new RunTaskJob($task)); + Bus::dispatchSync(new RunTaskJob($task)); if ($continueOnFailure) { $task->refresh(); @@ -144,7 +141,7 @@ class RunTaskJobTest extends IntegrationTestCase $this->assertFalse($task->is_queued); $this->assertFalse($schedule->is_processing); - $this->assertTrue(CarbonImmutable::now()->isSameAs(DateTimeInterface::ATOM, $schedule->last_run_at)); + $this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at)); } } @@ -168,17 +165,17 @@ class RunTaskJobTest extends IntegrationTestCase 'payload' => 'start', ]); - Bus::dispatchNow(new RunTaskJob($task)); + Bus::dispatchSync(new RunTaskJob($task)); $task->refresh(); $schedule->refresh(); $this->assertFalse($task->is_queued); $this->assertFalse($schedule->is_processing); - $this->assertTrue(Carbon::now()->isSameAs(DateTimeInterface::ATOM, $schedule->last_run_at)); + $this->assertTrue(Carbon::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at)); } - public function isManualRunDataProvider(): array + public static function isManualRunDataProvider(): array { return [[true], [false]]; } diff --git a/tests/Integration/Services/Allocations/FindAssignableAllocationServiceTest.php b/tests/Integration/Services/Allocations/FindAssignableAllocationServiceTest.php index 3efde3355..3c116cbeb 100644 --- a/tests/Integration/Services/Allocations/FindAssignableAllocationServiceTest.php +++ b/tests/Integration/Services/Allocations/FindAssignableAllocationServiceTest.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Tests\Integration\Services\Allocations; -use Exception; -use InvalidArgumentException; use Pterodactyl\Models\Allocation; use Pterodactyl\Tests\Integration\IntegrationTestCase; use Pterodactyl\Services\Allocations\FindAssignableAllocationService; @@ -142,8 +140,8 @@ class FindAssignableAllocationServiceTest extends IntegrationTestCase try { $this->getService()->handle($server); $this->fail('This assertion should not be reached.'); - } catch (Exception $exception) { - $this->assertInstanceOf(InvalidArgumentException::class, $exception); + } catch (\Exception $exception) { + $this->assertInstanceOf(\InvalidArgumentException::class, $exception); $this->assertSame('Expected an integerish value. Got: string', $exception->getMessage()); } @@ -153,8 +151,8 @@ class FindAssignableAllocationServiceTest extends IntegrationTestCase try { $this->getService()->handle($server); $this->fail('This assertion should not be reached.'); - } catch (Exception $exception) { - $this->assertInstanceOf(InvalidArgumentException::class, $exception); + } catch (\Exception $exception) { + $this->assertInstanceOf(\InvalidArgumentException::class, $exception); $this->assertSame('Expected an integerish value. Got: string', $exception->getMessage()); } } diff --git a/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php b/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php index 72c0e804c..b68a3521e 100644 --- a/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php +++ b/tests/Integration/Services/Databases/DatabaseManagementServiceTest.php @@ -2,10 +2,7 @@ namespace Pterodactyl\Tests\Integration\Services\Databases; -use Mockery; use Mockery\MockInterface; -use BadMethodCallException; -use InvalidArgumentException; use Pterodactyl\Models\Database; use Pterodactyl\Models\DatabaseHost; use Pterodactyl\Tests\Integration\IntegrationTestCase; @@ -79,7 +76,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('The database name passed to DatabaseManagementService::handle MUST be prefixed with "s{server_id}_".'); $this->getService()->create($server, $data); @@ -134,13 +131,13 @@ class DatabaseManagementServiceTest extends IntegrationTestCase // assertions that would get caught by the functions catcher and thus lead to the exception // being swallowed incorrectly. $this->repository->expects('createUser')->with( - Mockery::on(function ($value) use (&$username) { + \Mockery::on(function ($value) use (&$username) { $username = $value; return true; }), '%', - Mockery::on(function ($value) use (&$password) { + \Mockery::on(function ($value) use (&$password) { $password = $value; return true; @@ -148,7 +145,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase null ); - $this->repository->expects('assignUserToDatabase')->with($name, Mockery::on(function ($value) use (&$secondUsername) { + $this->repository->expects('assignUserToDatabase')->with($name, \Mockery::on(function ($value) use (&$secondUsername) { $secondUsername = $value; return true; @@ -182,11 +179,11 @@ class DatabaseManagementServiceTest extends IntegrationTestCase $host = DatabaseHost::factory()->create(['node_id' => $server->node_id]); - $this->repository->expects('createDatabase')->with($name)->andThrows(new BadMethodCallException()); + $this->repository->expects('createDatabase')->with($name)->andThrows(new \BadMethodCallException()); $this->repository->expects('dropDatabase')->with($name); - $this->repository->expects('dropUser')->withAnyArgs()->andThrows(new InvalidArgumentException()); + $this->repository->expects('dropUser')->withAnyArgs()->andThrows(new \InvalidArgumentException()); - $this->expectException(BadMethodCallException::class); + $this->expectException(\BadMethodCallException::class); $this->getService()->create($server, [ 'remote' => '%', @@ -197,7 +194,7 @@ class DatabaseManagementServiceTest extends IntegrationTestCase $this->assertDatabaseMissing('databases', ['server_id' => $server->id]); } - public function invalidDataDataProvider(): array + public static function invalidDataDataProvider(): array { return [ [[]], diff --git a/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php b/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php index 0da9245ee..eb8f4dbaa 100644 --- a/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php +++ b/tests/Integration/Services/Databases/DeployServerDatabaseServiceTest.php @@ -2,10 +2,8 @@ namespace Pterodactyl\Tests\Integration\Services\Databases; -use Mockery; use Mockery\MockInterface; use Pterodactyl\Models\Node; -use InvalidArgumentException; use Pterodactyl\Models\Database; use Pterodactyl\Models\DatabaseHost; use Pterodactyl\Tests\Integration\IntegrationTestCase; @@ -24,7 +22,7 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase { parent::setUp(); - $this->managementService = Mockery::mock(DatabaseManagementService::class); + $this->managementService = \Mockery::mock(DatabaseManagementService::class); $this->swap(DatabaseManagementService::class, $this->managementService); } @@ -50,7 +48,7 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/^Expected a non-empty value\. Got: /'); $this->getService()->handle($server, $data); } @@ -142,7 +140,7 @@ class DeployServerDatabaseServiceTest extends IntegrationTestCase $this->assertInstanceOf(Database::class, $response); } - public function invalidDataProvider(): array + public static function invalidDataProvider(): array { return [ [['remote' => '%']], diff --git a/tests/Integration/Services/Deployment/FindViableNodesServiceTest.php b/tests/Integration/Services/Deployment/FindViableNodesServiceTest.php index f77b5b144..64594c8b6 100644 --- a/tests/Integration/Services/Deployment/FindViableNodesServiceTest.php +++ b/tests/Integration/Services/Deployment/FindViableNodesServiceTest.php @@ -2,9 +2,7 @@ namespace Pterodactyl\Tests\Integration\Services\Deployment; -use Exception; use Pterodactyl\Models\Node; -use InvalidArgumentException; use Pterodactyl\Models\Server; use Pterodactyl\Models\Database; use Pterodactyl\Models\Location; @@ -26,7 +24,7 @@ class FindViableNodesServiceTest extends IntegrationTestCase public function testExceptionIsThrownIfNoDiskSpaceHasBeenSet() { - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Disk space must be an int, got NULL'); $this->getService()->handle(); @@ -34,7 +32,7 @@ class FindViableNodesServiceTest extends IntegrationTestCase public function testExceptionIsThrownIfNoMemoryHasBeenSet() { - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Memory usage must be an int, got NULL'); $this->getService()->setDisk(10)->handle(); @@ -54,16 +52,16 @@ class FindViableNodesServiceTest extends IntegrationTestCase try { $this->getService()->setLocations(['a']); $this->fail('This expectation should not be called.'); - } catch (Exception $exception) { - $this->assertInstanceOf(InvalidArgumentException::class, $exception); + } catch (\Exception $exception) { + $this->assertInstanceOf(\InvalidArgumentException::class, $exception); $this->assertSame('An array of location IDs should be provided when calling setLocations.', $exception->getMessage()); } try { $this->getService()->setLocations(['1.2', '1', 2]); $this->fail('This expectation should not be called.'); - } catch (Exception $exception) { - $this->assertInstanceOf(InvalidArgumentException::class, $exception); + } catch (\Exception $exception) { + $this->assertInstanceOf(\InvalidArgumentException::class, $exception); $this->assertSame('An array of location IDs should be provided when calling setLocations.', $exception->getMessage()); } } diff --git a/tests/Integration/Services/Schedules/ProcessScheduleServiceTest.php b/tests/Integration/Services/Schedules/ProcessScheduleServiceTest.php index cd56337ac..eaed38a16 100644 --- a/tests/Integration/Services/Schedules/ProcessScheduleServiceTest.php +++ b/tests/Integration/Services/Schedules/ProcessScheduleServiceTest.php @@ -2,11 +2,9 @@ namespace Pterodactyl\Tests\Integration\Services\Schedules; -use Mockery; use Exception; use Carbon\CarbonImmutable; use Pterodactyl\Models\Task; -use InvalidArgumentException; use Pterodactyl\Models\Schedule; use Illuminate\Support\Facades\Bus; use Illuminate\Contracts\Bus\Dispatcher; @@ -47,7 +45,7 @@ class ProcessScheduleServiceTest extends IntegrationTestCase /** @var \Pterodactyl\Models\Task $task */ $task = Task::factory()->create(['schedule_id' => $schedule->id, 'sequence_id' => 1]); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->getService()->handle($schedule); @@ -126,7 +124,7 @@ class ProcessScheduleServiceTest extends IntegrationTestCase */ public function testTaskDispatchedNowIsResetProperlyIfErrorIsEncountered() { - $this->swap(Dispatcher::class, $dispatcher = Mockery::mock(Dispatcher::class)); + $this->swap(Dispatcher::class, $dispatcher = \Mockery::mock(Dispatcher::class)); $server = $this->createServerModel(); /** @var \Pterodactyl\Models\Schedule $schedule */ @@ -134,9 +132,9 @@ class ProcessScheduleServiceTest extends IntegrationTestCase /** @var \Pterodactyl\Models\Task $task */ $task = Task::factory()->create(['schedule_id' => $schedule->id, 'sequence_id' => 1]); - $dispatcher->expects('dispatchNow')->andThrows(new Exception('Test thrown exception')); + $dispatcher->expects('dispatchNow')->andThrows(new \Exception('Test thrown exception')); - $this->expectException(Exception::class); + $this->expectException(\Exception::class); $this->expectExceptionMessage('Test thrown exception'); $this->getService()->handle($schedule, true); @@ -150,7 +148,7 @@ class ProcessScheduleServiceTest extends IntegrationTestCase $this->assertDatabaseHas('tasks', ['id' => $task->id, 'is_queued' => false]); } - public function dispatchNowDataProvider(): array + public static function dispatchNowDataProvider(): array { return [[true], [false]]; } diff --git a/tests/Integration/Services/Servers/BuildModificationServiceTest.php b/tests/Integration/Services/Servers/BuildModificationServiceTest.php index edebb0125..f63efee9e 100644 --- a/tests/Integration/Services/Servers/BuildModificationServiceTest.php +++ b/tests/Integration/Services/Servers/BuildModificationServiceTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Services\Servers; -use Mockery; use Mockery\MockInterface; use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; @@ -108,7 +107,7 @@ class BuildModificationServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $this->daemonServerRepository->expects('setServer')->with(Mockery::on(function (Server $s) use ($server) { + $this->daemonServerRepository->expects('setServer')->with(\Mockery::on(function (Server $s) use ($server) { return $s->id === $server->id; }))->andReturnSelf(); diff --git a/tests/Integration/Services/Servers/ServerCreationServiceTest.php b/tests/Integration/Services/Servers/ServerCreationServiceTest.php index 92a873a18..b6adb9b60 100644 --- a/tests/Integration/Services/Servers/ServerCreationServiceTest.php +++ b/tests/Integration/Services/Servers/ServerCreationServiceTest.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Integration\Services\Servers; -use Mockery; use Mockery\MockInterface; use Pterodactyl\Models\Egg; use GuzzleHttp\Psr7\Request; @@ -42,7 +41,7 @@ class ServerCreationServiceTest extends IntegrationTestCase ->where('name', 'Bungeecord') ->firstOrFail(); - $this->daemonServerRepository = Mockery::mock(DaemonServerRepository::class); + $this->daemonServerRepository = \Mockery::mock(DaemonServerRepository::class); $this->swap(DaemonServerRepository::class, $this->daemonServerRepository); } diff --git a/tests/Integration/Services/Servers/ServerDeletionServiceTest.php b/tests/Integration/Services/Servers/ServerDeletionServiceTest.php index 3bad99932..676a60416 100644 --- a/tests/Integration/Services/Servers/ServerDeletionServiceTest.php +++ b/tests/Integration/Services/Servers/ServerDeletionServiceTest.php @@ -2,8 +2,6 @@ namespace Pterodactyl\Tests\Integration\Services\Servers; -use Mockery; -use Exception; use Mockery\MockInterface; use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; @@ -35,8 +33,8 @@ class ServerDeletionServiceTest extends IntegrationTestCase // There will be some log calls during this test, don't actually write to the disk. config()->set('logging.default', 'null'); - $this->daemonServerRepository = Mockery::mock(DaemonServerRepository::class); - $this->databaseManagementService = Mockery::mock(DatabaseManagementService::class); + $this->daemonServerRepository = \Mockery::mock(DaemonServerRepository::class); + $this->databaseManagementService = \Mockery::mock(DatabaseManagementService::class); $this->app->instance(DaemonServerRepository::class, $this->daemonServerRepository); $this->app->instance(DatabaseManagementService::class, $this->databaseManagementService); @@ -120,11 +118,11 @@ class ServerDeletionServiceTest extends IntegrationTestCase $server->refresh(); $this->daemonServerRepository->expects('setServer->delete')->withNoArgs()->andReturnUndefined(); - $this->databaseManagementService->expects('delete')->with(Mockery::on(function ($value) use ($db) { + $this->databaseManagementService->expects('delete')->with(\Mockery::on(function ($value) use ($db) { return $value instanceof Database && $value->id === $db->id; - }))->andThrows(new Exception()); + }))->andThrows(new \Exception()); - $this->expectException(Exception::class); + $this->expectException(\Exception::class); $this->getService()->handle($server); $this->assertDatabaseHas('servers', ['id' => $server->id]); @@ -145,9 +143,9 @@ class ServerDeletionServiceTest extends IntegrationTestCase $server->refresh(); $this->daemonServerRepository->expects('setServer->delete')->withNoArgs()->andReturnUndefined(); - $this->databaseManagementService->expects('delete')->with(Mockery::on(function ($value) use ($db) { + $this->databaseManagementService->expects('delete')->with(\Mockery::on(function ($value) use ($db) { return $value instanceof Database && $value->id === $db->id; - }))->andThrows(new Exception()); + }))->andThrows(new \Exception()); $this->getService()->withForce(true)->handle($server); diff --git a/tests/Integration/Services/Servers/StartupModificationServiceTest.php b/tests/Integration/Services/Servers/StartupModificationServiceTest.php index 47f4595f0..0d310a9f1 100644 --- a/tests/Integration/Services/Servers/StartupModificationServiceTest.php +++ b/tests/Integration/Services/Servers/StartupModificationServiceTest.php @@ -34,7 +34,7 @@ class StartupModificationServiceTest extends IntegrationTestCase ]); $this->fail('This assertion should not be called.'); - } catch (Exception $exception) { + } catch (\Exception $exception) { $this->assertInstanceOf(ValidationException::class, $exception); /** @var \Illuminate\Validation\ValidationException $exception */ diff --git a/tests/Integration/Services/Servers/SuspensionServiceTest.php b/tests/Integration/Services/Servers/SuspensionServiceTest.php index bb7297d14..e3f925cf5 100644 --- a/tests/Integration/Services/Servers/SuspensionServiceTest.php +++ b/tests/Integration/Services/Servers/SuspensionServiceTest.php @@ -2,9 +2,7 @@ namespace Pterodactyl\Tests\Integration\Services\Servers; -use Mockery; use Mockery\MockInterface; -use InvalidArgumentException; use Pterodactyl\Models\Server; use Pterodactyl\Services\Servers\SuspensionService; use Pterodactyl\Tests\Integration\IntegrationTestCase; @@ -21,7 +19,7 @@ class SuspensionServiceTest extends IntegrationTestCase { parent::setUp(); - $this->repository = Mockery::mock(DaemonServerRepository::class); + $this->repository = \Mockery::mock(DaemonServerRepository::class); $this->app->instance(DaemonServerRepository::class, $this->repository); } @@ -60,7 +58,7 @@ class SuspensionServiceTest extends IntegrationTestCase { $server = $this->createServerModel(); - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Expected one of: "suspend", "unsuspend". Got: "foo"'); $this->getService()->toggle($server, 'foo'); diff --git a/tests/Traits/Http/MocksMiddlewareClosure.php b/tests/Traits/Http/MocksMiddlewareClosure.php index aebb61ce9..9cbe315bd 100644 --- a/tests/Traits/Http/MocksMiddlewareClosure.php +++ b/tests/Traits/Http/MocksMiddlewareClosure.php @@ -4,7 +4,6 @@ namespace Pterodactyl\Tests\Traits\Http; use Closure; use Illuminate\Http\Request; -use BadFunctionCallException; trait MocksMiddlewareClosure { @@ -12,10 +11,10 @@ trait MocksMiddlewareClosure * Provide a closure to be used when validating that the response from the middleware * is the same request object we passed into it. */ - protected function getClosureAssertions(): Closure + protected function getClosureAssertions(): \Closure { if (is_null($this->request)) { - throw new BadFunctionCallException('Calling getClosureAssertions without defining a request object is not supported.'); + throw new \BadFunctionCallException('Calling getClosureAssertions without defining a request object is not supported.'); } return function ($response) { diff --git a/tests/Traits/Http/RequestMockHelpers.php b/tests/Traits/Http/RequestMockHelpers.php index 23e88663c..aa3607e51 100644 --- a/tests/Traits/Http/RequestMockHelpers.php +++ b/tests/Traits/Http/RequestMockHelpers.php @@ -6,7 +6,6 @@ use Mockery as m; use Mockery\Mock; use Illuminate\Http\Request; use Pterodactyl\Models\User; -use InvalidArgumentException; use Symfony\Component\HttpFoundation\ParameterBag; trait RequestMockHelpers @@ -68,7 +67,7 @@ trait RequestMockHelpers { $this->request = m::mock($this->requestMockClass); if (!$this->request instanceof Request) { - throw new InvalidArgumentException('Request mock class must be an instance of ' . Request::class . ' when mocked.'); + throw new \InvalidArgumentException('Request mock class must be an instance of ' . Request::class . ' when mocked.'); } $this->request->attributes = new ParameterBag(); diff --git a/tests/Traits/MocksPdoConnection.php b/tests/Traits/MocksPdoConnection.php index a93896463..527fac62f 100644 --- a/tests/Traits/MocksPdoConnection.php +++ b/tests/Traits/MocksPdoConnection.php @@ -23,7 +23,7 @@ trait MocksPdoConnection Model::unsetConnectionResolver(); - $connection = new MySqlConnection($mock = Mockery::mock(PDO::class), 'testing_mock'); + $connection = new MySqlConnection($mock = \Mockery::mock(\PDO::class), 'testing_mock'); $resolver = new ConnectionResolver(['mocked' => $connection]); $resolver->setDefaultConnection('mocked'); diff --git a/tests/Traits/MocksRequestException.php b/tests/Traits/MocksRequestException.php index fc011d152..16078707d 100644 --- a/tests/Traits/MocksRequestException.php +++ b/tests/Traits/MocksRequestException.php @@ -2,7 +2,6 @@ namespace Pterodactyl\Tests\Traits; -use Mockery; use Mockery\Mock; use Mockery\MockInterface; use GuzzleHttp\Exception\RequestException; @@ -27,6 +26,6 @@ trait MocksRequestException */ protected function getExceptionMock(string $abstract = RequestException::class): MockInterface { - return $this->exception ?? $this->exception = Mockery::mock($abstract); + return $this->exception ?? $this->exception = \Mockery::mock($abstract); } } diff --git a/tests/Unit/Helpers/EnvironmentWriterTraitTest.php b/tests/Unit/Helpers/EnvironmentWriterTraitTest.php index f2022f798..0680da0db 100644 --- a/tests/Unit/Helpers/EnvironmentWriterTraitTest.php +++ b/tests/Unit/Helpers/EnvironmentWriterTraitTest.php @@ -17,7 +17,7 @@ class EnvironmentWriterTraitTest extends TestCase $this->assertSame($expected, $output); } - public function variableDataProvider(): array + public static function variableDataProvider(): array { return [ ['foo', 'foo'], diff --git a/tests/Unit/Helpers/IsDigitTest.php b/tests/Unit/Helpers/IsDigitTest.php index 4ba08042f..af19c732e 100644 --- a/tests/Unit/Helpers/IsDigitTest.php +++ b/tests/Unit/Helpers/IsDigitTest.php @@ -19,7 +19,7 @@ class IsDigitTest extends TestCase /** * Provide data to test against the helper function. */ - public function helperDataProvider(): array + public static function helperDataProvider(): array { return [ [true, false], diff --git a/tests/Unit/Http/Middleware/Api/Daemon/DaemonAuthenticateTest.php b/tests/Unit/Http/Middleware/Api/Daemon/DaemonAuthenticateTest.php index 8c8c76920..84562f6c9 100644 --- a/tests/Unit/Http/Middleware/Api/Daemon/DaemonAuthenticateTest.php +++ b/tests/Unit/Http/Middleware/Api/Daemon/DaemonAuthenticateTest.php @@ -138,7 +138,7 @@ class DaemonAuthenticateTest extends MiddlewareTestCase * * @return array|\string[][] */ - public function badTokenDataProvider(): array + public static function badTokenDataProvider(): array { return [ ['foo'], diff --git a/tests/Unit/Rules/UsernameTest.php b/tests/Unit/Rules/UsernameTest.php index 829cab2c3..003e3e8dd 100644 --- a/tests/Unit/Rules/UsernameTest.php +++ b/tests/Unit/Rules/UsernameTest.php @@ -38,7 +38,7 @@ class UsernameTest extends TestCase /** * Provide valid usernames. */ - public function validUsernameDataProvider(): array + public static function validUsernameDataProvider(): array { return [ ['username'], @@ -54,7 +54,7 @@ class UsernameTest extends TestCase /** * Provide invalid usernames. */ - public function invalidUsernameDataProvider(): array + public static function invalidUsernameDataProvider(): array { return [ ['_username'], diff --git a/tests/Unit/Services/Acl/Api/AdminAclTest.php b/tests/Unit/Services/Acl/Api/AdminAclTest.php index daaea838f..3f89659a2 100644 --- a/tests/Unit/Services/Acl/Api/AdminAclTest.php +++ b/tests/Unit/Services/Acl/Api/AdminAclTest.php @@ -31,7 +31,7 @@ class AdminAclTest extends TestCase /** * Provide valid and invalid permissions combos for testing. */ - public function permissionsDataProvider(): array + public static function permissionsDataProvider(): array { return [ [AdminAcl::READ, AdminAcl::READ, true], diff --git a/yarn.lock b/yarn.lock index e29b8781d..3142ac755 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1493,6 +1493,19 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@preact/signals-core@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@preact/signals-core/-/signals-core-1.2.2.tgz#279dcc5ab249de2f2e8f6e6779b1958256ba843e" + integrity sha512-z3/bCj7rRA21RJb4FeJ4guCrD1CQbaURHkCTunUWQpxUMAFOPXCD8tSFqERyGrrcSb4T3Hrmdc1OAl0LXBHwiw== + +"@preact/signals-react@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@preact/signals-react/-/signals-react-1.2.1.tgz#6d5d305ebdb38c879043acebc65c0d9351e663c1" + integrity sha512-73J8sL1Eru7Ot4yBYOCPj1izEZjzCEXlembRgk6C7PkwsqoAVbCxMlDOFfCLoPFuJ6qeGatrJzRkcycXppMqVQ== + dependencies: + "@preact/signals-core" "^1.2.2" + use-sync-external-store "^1.2.0" + "@sinclair/typebox@^0.23.3": version "0.23.5" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" @@ -9121,6 +9134,11 @@ use-memo-one@^1.1.1: resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c" integrity sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ== +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + use@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"