From 2fc662970b193ac7083cf11b5778150ed65accfb Mon Sep 17 00:00:00 2001 From: exu Date: Fri, 17 May 2024 20:26:01 +0200 Subject: [PATCH] (Grav GitSync) Automatic Commit from exu --- plugins/admin/CHANGELOG.md | 6 + plugins/admin/blueprints.yaml | 4 +- .../Controllers/Login/LoginController.php | 10 +- plugins/email/CHANGELOG.md | 7 + plugins/email/blueprints.yaml | 2 +- plugins/email/classes/Email.php | 47 +- plugins/email/composer.lock | 269 +- plugins/email/email.php | 20 +- plugins/email/vendor/autoload.php | 17 +- plugins/email/vendor/composer/ClassLoader.php | 137 +- .../vendor/composer/InstalledVersions.php | 17 +- .../email/vendor/composer/autoload_psr4.php | 3 +- .../email/vendor/composer/autoload_real.php | 27 +- .../email/vendor/composer/autoload_static.php | 7 +- plugins/email/vendor/composer/installed.json | 302 +- plugins/email/vendor/composer/installed.php | 105 +- .../vendor/doctrine/deprecations/LICENSE | 19 + .../vendor/doctrine/deprecations/README.md | 157 + .../doctrine/deprecations/composer.json | 38 + .../lib/Doctrine/Deprecations/Deprecation.php | 313 + .../PHPUnit/VerifyDeprecations.php | 66 + .../email/vendor/doctrine/lexer/UPGRADE.md | 14 + .../email/vendor/doctrine/lexer/composer.json | 39 +- plugins/email/vendor/doctrine/lexer/psalm.xml | 15 - .../Common/Lexer => src}/AbstractLexer.php | 73 +- .../email/vendor/doctrine/lexer/src/Token.php | 145 + .../egulias/email-validator/CHANGELOG.md | 2 +- .../vendor/egulias/email-validator/LICENSE | 2 +- .../egulias/email-validator/composer.json | 3 +- .../egulias/email-validator/composer.lock | 5028 ----------------- .../email-validator/src/EmailLexer.php | 128 +- .../email-validator/src/EmailParser.php | 3 +- .../email-validator/src/MessageIDParser.php | 5 +- .../egulias/email-validator/src/Parser.php | 6 +- .../email-validator/src/Parser/Comment.php | 23 +- .../CommentStrategy/CommentStrategy.php | 2 +- .../Parser/CommentStrategy/DomainComment.php | 4 +- .../Parser/CommentStrategy/LocalComment.php | 4 +- .../src/Parser/DomainLiteral.php | 28 +- .../email-validator/src/Parser/DomainPart.php | 78 +- .../src/Parser/DoubleQuote.php | 23 +- .../src/Parser/FoldingWhiteSpace.php | 24 +- .../email-validator/src/Parser/IDLeftPart.php | 5 +- .../src/Parser/IDRightPart.php | 8 +- .../email-validator/src/Parser/LocalPart.php | 34 +- .../email-validator/src/Parser/PartParser.php | 8 +- .../src/Result/InvalidEmail.php | 4 +- .../src/Result/Reason/AtextAfterCFWS.php | 2 +- .../src/Result/Reason/CRLFAtTheEnd.php | 4 +- .../src/Result/Reason/CharNotAllowed.php | 2 +- .../src/Result/Reason/CommaInDomain.php | 2 +- .../src/Result/Reason/CommentsInIDRight.php | 2 +- .../src/Result/Reason/DetailedReason.php | 2 +- .../src/Result/Reason/DomainAcceptsNoMail.php | 2 +- .../src/Result/Reason/ExceptionFound.php | 2 +- .../Reason/ExpectingDomainLiteralClose.php | 2 +- .../Result/Reason/LocalOrReservedDomain.php | 2 +- .../src/Result/Reason/NoDNSRecord.php | 2 +- .../src/Result/Reason/Reason.php | 2 +- .../src/Result/Reason/UnOpenedComment.php | 2 +- .../src/Result/Reason/UnusualElements.php | 2 +- .../email-validator/src/Result/Result.php | 2 +- .../email-validator/src/Result/SpoofEmail.php | 3 +- .../email-validator/src/Result/ValidEmail.php | 2 +- .../src/Validation/DNSCheckValidation.php | 7 +- .../src/Validation/DNSGetRecordWrapper.php | 2 +- .../src/Validation/DNSRecords.php | 2 +- .../Exception/EmptyValidationList.php | 2 +- .../Validation/MultipleValidationWithAnd.php | 4 +- .../src/Warning/AddressLiteral.php | 2 +- .../src/Warning/CFWSNearAt.php | 2 +- .../src/Warning/CFWSWithFWS.php | 2 +- .../email-validator/src/Warning/Comment.php | 2 +- .../src/Warning/DeprecatedComment.php | 2 +- .../src/Warning/DomainLiteral.php | 2 +- .../src/Warning/EmailTooLong.php | 2 +- .../src/Warning/IPV6BadChar.php | 2 +- .../src/Warning/IPV6ColonEnd.php | 2 +- .../src/Warning/IPV6ColonStart.php | 2 +- .../src/Warning/IPV6Deprecated.php | 2 +- .../src/Warning/IPV6DoubleColon.php | 2 +- .../src/Warning/IPV6GroupCount.php | 2 +- .../src/Warning/IPV6MaxGroups.php | 2 +- .../src/Warning/LocalTooLong.php | 4 +- .../src/Warning/NoDNSMXRecord.php | 2 +- .../src/Warning/ObsoleteDTEXT.php | 2 +- .../src/Warning/QuotedPart.php | 2 +- .../src/Warning/QuotedString.php | 2 +- .../email-validator/src/Warning/TLD.php | 2 +- .../email-validator/src/Warning/Warning.php | 2 +- .../vendor/symfony/amqp-messenger/LICENSE | 2 +- .../amqp-messenger/Transport/AmqpReceiver.php | 2 +- .../amqp-messenger/Transport/AmqpSender.php | 2 +- .../amqp-messenger/Transport/AmqpStamp.php | 6 +- .../Transport/AmqpTransport.php | 2 +- .../amqp-messenger/Transport/Connection.php | 61 +- .../symfony/deprecation-contracts/LICENSE | 2 +- .../vendor/symfony/doctrine-messenger/LICENSE | 2 +- .../Transport/Connection.php | 151 +- .../Transport/DoctrineReceiver.php | 4 +- .../Transport/DoctrineSender.php | 2 +- .../Transport/DoctrineTransport.php | 2 +- .../Transport/DoctrineTransportFactory.php | 5 +- .../Transport/PostgreSqlConnection.php | 5 +- .../symfony/doctrine-messenger/composer.json | 2 +- .../EventDispatcherInterface.php | 2 +- .../event-dispatcher-contracts/LICENSE | 2 +- .../Debug/TraceableEventDispatcher.php | 14 +- .../Debug/WrappedListener.php | 14 +- .../RegisterListenersPass.php | 10 +- .../event-dispatcher/EventDispatcher.php | 6 +- .../EventDispatcherInterface.php | 4 +- .../symfony/event-dispatcher/GenericEvent.php | 2 +- .../ImmutableEventDispatcher.php | 6 +- .../vendor/symfony/event-dispatcher/LICENSE | 2 +- .../email/vendor/symfony/mailer/CHANGELOG.md | 6 + .../DataCollector/MessageDataCollector.php | 2 +- .../symfony/mailer/Event/MessageEvents.php | 4 +- .../mailer/EventListener/EnvelopeListener.php | 2 +- .../mailer/EventListener/MessageListener.php | 2 +- .../Exception/HttpTransportException.php | 2 +- .../Exception/UnsupportedSchemeException.php | 2 +- plugins/email/vendor/symfony/mailer/LICENSE | 2 +- .../email/vendor/symfony/mailer/Mailer.php | 4 +- .../vendor/symfony/mailer/MailerInterface.php | 2 +- .../mailer/Messenger/SendEmailMessage.php | 2 +- .../mailer/Test/Constraint/EmailCount.php | 2 +- .../mailer/Test/TransportFactoryTestCase.php | 12 +- .../email/vendor/symfony/mailer/Transport.php | 8 +- .../Transport/AbstractHttpTransport.php | 2 +- .../mailer/Transport/AbstractTransport.php | 7 +- .../Transport/AbstractTransportFactory.php | 2 +- .../vendor/symfony/mailer/Transport/Dsn.php | 26 +- .../mailer/Transport/RoundRobinTransport.php | 8 +- .../mailer/Transport/SendmailTransport.php | 8 +- .../mailer/Transport/Smtp/EsmtpTransport.php | 2 +- .../mailer/Transport/Smtp/SmtpTransport.php | 4 +- .../Transport/Smtp/Stream/AbstractStream.php | 10 +- .../Transport/Smtp/Stream/ProcessStream.php | 10 +- .../Transport/Smtp/Stream/SocketStream.php | 4 +- .../mailer/Transport/TransportInterface.php | 2 +- .../symfony/mailer/Transport/Transports.php | 2 +- .../email/vendor/symfony/mailer/composer.json | 4 +- .../vendor/symfony/messenger/CHANGELOG.md | 1 - .../Command/AbstractFailedMessagesCommand.php | 2 +- .../Command/ConsumeMessagesCommand.php | 21 +- .../Command/FailedMessagesRetryCommand.php | 2 +- .../DataCollector/MessengerDataCollector.php | 6 +- .../DependencyInjection/MessengerPass.php | 14 +- .../vendor/symfony/messenger/Envelope.php | 2 +- .../Event/WorkerMessageReceivedEvent.php | 2 +- .../SendFailedMessageForRetryListener.php | 2 +- ...ailedMessageToFailureTransportListener.php | 2 +- .../StopWorkerOnFailureLimitListener.php | 2 +- .../StopWorkerOnMemoryLimitListener.php | 2 +- .../StopWorkerOnMessageLimitListener.php | 2 +- .../StopWorkerOnRestartSignalListener.php | 2 +- .../StopWorkerOnSigtermSignalListener.php | 2 +- .../StopWorkerOnTimeLimitListener.php | 7 +- .../Exception/StopWorkerException.php | 2 +- .../messenger/Handler/Acknowledger.php | 6 +- .../Handler/BatchHandlerInterface.php | 2 +- .../messenger/Handler/BatchHandlerTrait.php | 2 +- .../messenger/Handler/HandlerDescriptor.php | 2 +- .../email/vendor/symfony/messenger/LICENSE | 2 +- .../Middleware/HandleMessageMiddleware.php | 6 +- .../Middleware/SendMessageMiddleware.php | 2 +- .../Middleware/TraceableMiddleware.php | 5 + .../Retry/MultiplierRetryStrategy.php | 4 +- .../Retry/RetryStrategyInterface.php | 4 +- .../symfony/messenger/RoutableMessageBus.php | 2 +- .../symfony/messenger/Stamp/AckStamp.php | 2 +- .../messenger/Stamp/ErrorDetailsStamp.php | 5 +- .../messenger/Stamp/RedeliveryStamp.php | 30 +- .../symfony/messenger/Stamp/SentStamp.php | 2 +- .../Test/Middleware/MiddlewareTestCase.php | 2 +- .../messenger/Transport/InMemoryTransport.php | 2 +- .../Receiver/ListableReceiverInterface.php | 2 +- .../Transport/Receiver/ReceiverInterface.php | 4 +- .../Normalizer/FlattenExceptionNormalizer.php | 8 +- .../Transport/Serialization/PhpSerializer.php | 24 +- .../Transport/Serialization/Serializer.php | 5 +- .../messenger/Transport/TransportFactory.php | 2 +- .../email/vendor/symfony/messenger/Worker.php | 4 +- .../symfony/mime/Crypto/SMimeEncrypter.php | 2 +- .../symfony/mime/Crypto/SMimeSigner.php | 2 +- plugins/email/vendor/symfony/mime/Email.php | 12 +- .../symfony/mime/FileinfoMimeTypeGuesser.php | 4 +- .../symfony/mime/Header/AbstractHeader.php | 2 +- .../vendor/symfony/mime/Header/Headers.php | 2 +- .../symfony/mime/Header/MailboxListHeader.php | 8 +- .../mime/Header/ParameterizedHeader.php | 2 +- plugins/email/vendor/symfony/mime/LICENSE | 2 +- plugins/email/vendor/symfony/mime/Message.php | 9 +- .../vendor/symfony/mime/Part/DataPart.php | 4 +- .../vendor/symfony/mime/Part/MessagePart.php | 13 + .../mime/Part/Multipart/FormDataPart.php | 2 +- .../vendor/symfony/mime/Part/TextPart.php | 2 +- .../email/vendor/symfony/mime/RawMessage.php | 3 + .../mime/Resources/bin/update_mime_types.php | 4 + .../Test/Constraint/EmailAttachmentCount.php | 2 +- .../email/vendor/symfony/mime/composer.json | 8 +- .../vendor/symfony/polyfill-intl-idn/Idn.php | 30 +- .../vendor/symfony/polyfill-intl-idn/LICENSE | 2 +- .../Resources/unidata/DisallowedRanges.php | 9 + .../Resources/unidata/Regex.php | 9 + .../symfony/polyfill-intl-idn/composer.json | 3 - .../symfony/polyfill-intl-normalizer/LICENSE | 2 +- .../polyfill-intl-normalizer/Normalizer.php | 2 +- .../polyfill-intl-normalizer/composer.json | 3 - .../vendor/symfony/polyfill-php80/LICENSE | 2 +- .../Resources/stubs/Attribute.php | 9 + .../Resources/stubs/PhpToken.php | 11 +- .../Resources/stubs/Stringable.php | 9 + .../Resources/stubs/UnhandledMatchError.php | 9 + .../Resources/stubs/ValueError.php | 9 + .../symfony/polyfill-php80/composer.json | 3 - .../vendor/symfony/redis-messenger/LICENSE | 2 +- .../redis-messenger/Transport/Connection.php | 41 +- .../Transport/RedisReceiver.php | 15 +- .../Transport/RedisTransport.php | 2 +- .../vendor/symfony/service-contracts/LICENSE | 2 +- .../ServiceSubscriberTrait.php | 9 +- .../Test/ServiceLocatorTest.php | 80 +- .../Test/ServiceLocatorTestCase.php | 95 + plugins/login/CHANGELOG.md | 20 + plugins/login/README.md | 6 + plugins/login/blueprints.yaml | 8 +- plugins/login/classes/Controller.php | 10 +- plugins/login/classes/Email.php | 31 +- plugins/login/classes/Login.php | 8 +- plugins/login/languages/en.yaml | 5 +- plugins/login/login.yaml | 1 + .../templates/emails/login/activate.html.twig | 1 + .../emails/login/reset-password.html.twig | 1 + plugins/page-toc/CHANGELOG.md | 18 + plugins/page-toc/README.md | 5 +- plugins/page-toc/blueprints.yaml | 14 +- plugins/page-toc/blueprints/page-toc.yaml | 8 + plugins/page-toc/classes/HtmlHelper.php | 14 + plugins/page-toc/classes/TocGenerator.php | 5 +- plugins/page-toc/languages.yaml | 82 + plugins/page-toc/page-toc.php | 13 +- plugins/page-toc/page-toc.yaml | 1 + .../templates/components/page-toc.html.twig | 6 +- 245 files changed, 2536 insertions(+), 6198 deletions(-) create mode 100644 plugins/email/vendor/doctrine/deprecations/LICENSE create mode 100644 plugins/email/vendor/doctrine/deprecations/README.md create mode 100644 plugins/email/vendor/doctrine/deprecations/composer.json create mode 100644 plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php create mode 100644 plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php create mode 100644 plugins/email/vendor/doctrine/lexer/UPGRADE.md delete mode 100644 plugins/email/vendor/doctrine/lexer/psalm.xml rename plugins/email/vendor/doctrine/lexer/{lib/Doctrine/Common/Lexer => src}/AbstractLexer.php (79%) create mode 100644 plugins/email/vendor/doctrine/lexer/src/Token.php delete mode 100644 plugins/email/vendor/egulias/email-validator/composer.lock create mode 100644 plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php diff --git a/plugins/admin/CHANGELOG.md b/plugins/admin/CHANGELOG.md index 9eee9ce..aa512b8 100644 --- a/plugins/admin/CHANGELOG.md +++ b/plugins/admin/CHANGELOG.md @@ -1,3 +1,9 @@ +# v1.10.46 +## 05/15/2024 + +1. [](#improved) + * Used Login's new `site_host` security setting for Admin password reset. Requires Login version `3.7.8+` + # v1.10.45 ## 03/18/2024 diff --git a/plugins/admin/blueprints.yaml b/plugins/admin/blueprints.yaml index 6550b78..e47bbf1 100644 --- a/plugins/admin/blueprints.yaml +++ b/plugins/admin/blueprints.yaml @@ -1,7 +1,7 @@ name: Admin Panel slug: admin type: plugin -version: 1.10.45 +version: 1.10.46 description: Adds an advanced administration panel to manage your site icon: empire author: @@ -17,7 +17,7 @@ license: MIT dependencies: - { name: grav, version: '>=1.7.42' } - { name: form, version: '>=6.0.1' } - - { name: login, version: '>=3.7.0' } + - { name: login, version: '>=3.7.8' } - { name: email, version: '>=3.1.6' } - { name: flex-objects, version: '>=1.2.0' } diff --git a/plugins/admin/classes/plugin/Controllers/Login/LoginController.php b/plugins/admin/classes/plugin/Controllers/Login/LoginController.php index fceaec0..871162f 100644 --- a/plugins/admin/classes/plugin/Controllers/Login/LoginController.php +++ b/plugins/admin/classes/plugin/Controllers/Login/LoginController.php @@ -469,7 +469,15 @@ class LoginController extends AdminController $fullname = $user->fullname ?: $username; $author = $config->get('site.author.name', ''); $sitename = $config->get('site.title', 'Website'); - $reset_link = $this->getAbsoluteAdminUrl("/reset/u/{$username}/{$token}"); + $reset_route = "/reset/u/{$username}/{$token}"; + + $site_host = $config->get('plugins.login.site_host'); + if (!empty($site_host)) { + $admin = $this->getAdmin(); + $reset_link = rtrim($site_host, '/') . '/' . trim($admin->base, '/') . '/' . ltrim($reset_route, '/'); + } else { + $reset_link = $this->getAbsoluteAdminUrl($reset_route); + } // For testing only! //Admin::DEBUG && Admin::addDebugMessage(sprintf('Reset link: %s', $reset_link)); diff --git a/plugins/email/CHANGELOG.md b/plugins/email/CHANGELOG.md index 78971ef..79c3b34 100644 --- a/plugins/email/CHANGELOG.md +++ b/plugins/email/CHANGELOG.md @@ -1,3 +1,10 @@ +# v4.1.0 +## 04/09/2024 + +1. [](#improved) + * Update vendor libraries for Mailer to latest `5.4` versions + * When you send an email you can use `Email::getLastSendMessage()` and `Email::getLastSendDebug()` methods to get information about the email processing. + # v4.0.4 ## 07/10/2023 diff --git a/plugins/email/blueprints.yaml b/plugins/email/blueprints.yaml index d3a66a0..3546811 100644 --- a/plugins/email/blueprints.yaml +++ b/plugins/email/blueprints.yaml @@ -1,7 +1,7 @@ name: Email slug: email type: plugin -version: 4.0.4 +version: 4.1.0 testing: false description: Enables the emailing system for Grav icon: envelope diff --git a/plugins/email/classes/Email.php b/plugins/email/classes/Email.php index 1bc7b1d..bf116fd 100644 --- a/plugins/email/classes/Email.php +++ b/plugins/email/classes/Email.php @@ -31,6 +31,9 @@ class Email protected $log; + protected $message; + protected $debug; + public function __construct() { $this->initMailer(); @@ -82,35 +85,31 @@ class Email /** * Send email. * - * @param Message $message - * @param Envelope|null $envelope + * @param Message $message + * @param Envelope|null $envelope * @return int */ public function send(Message $message, Envelope $envelope = null): int { - $status = '🛑 '; - $sent_msg = null; - $debug = null; - try { $sent_msg = $this->transport->send($message->getEmail(), $envelope); - $return = 1; - $status = '✅'; - $debug = $sent_msg->getDebug(); + $status = 1; + $this->message = '✅'; + $this->debug = $sent_msg->getDebug(); } catch (TransportExceptionInterface $e) { - $return = 0; - $status .= $e->getMessage(); - $debug = $e->getDebug(); + $status = 0; + $this->message = '🛑 ' . $e->getMessage(); + $this->debug = $e->getDebug(); } if ($this->debug()) { $log_msg = "Email sent to %s at %s -> %s\n%s"; $to = $this->jsonifyRecipients($message->getEmail()->getTo()); - $msg = sprintf($log_msg, $to, date('Y-m-d H:i:s'), $status, $debug); - $this->log->addInfo($msg); + $message = sprintf($log_msg, $to, date('Y-m-d H:i:s'), $this->message, $this->debug); + $this->log->addInfo($message); } - return $return; + return $status; } /** @@ -453,6 +452,24 @@ class Email return $transport; } + /** + * Get any message from the last send attempt + * @return string|null + */ + public function getLastSendMessage(): ?string + { + return $this->message; + } + + /** + * Get any debug information from the last send attempt + * @return string|null + */ + public function getLastSendDebug(): ?string + { + return $this->debug; + } + /** * @param array $recipients * @return string diff --git a/plugins/email/composer.lock b/plugins/email/composer.lock index f9b9152..5d17120 100644 --- a/plugins/email/composer.lock +++ b/plugins/email/composer.lock @@ -7,32 +7,81 @@ "content-hash": "af2cff88b1d472f0931ba2c86fcdddc9", "packages": [ { - "name": "doctrine/lexer", - "version": "1.2.3", + "name": "doctrine/deprecations", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -64,7 +113,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -80,29 +129,28 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2024-02-05T11:35:39+00:00" }, { "name": "egulias/email-validator", - "version": "3.2.1", + "version": "3.2.6", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", "shasum": "" }, "require": { - "doctrine/lexer": "^1.2", + "doctrine/lexer": "^1.2|^2", "php": ">=7.2", "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^8.5.8|^9.3.3", "vimeo/psalm": "^4" }, @@ -140,7 +188,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/3.2.6" }, "funding": [ { @@ -148,7 +196,7 @@ "type": "github" } ], - "time": "2022-06-18T20:57:19+00:00" + "time": "2023-06-01T07:04:22+00:00" }, { "name": "psr/container", @@ -300,16 +348,16 @@ }, { "name": "symfony/amqp-messenger", - "version": "v5.4.13", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "def93f2a7841cfa1a4a1fa487b84054d0d53e521" + "reference": "456958ef89fffddc3935f3954a7eac255a5adb21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/def93f2a7841cfa1a4a1fa487b84054d0d53e521", - "reference": "def93f2a7841cfa1a4a1fa487b84054d0d53e521", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/456958ef89fffddc3935f3954a7eac255a5adb21", + "reference": "456958ef89fffddc3935f3954a7eac255a5adb21", "shasum": "" }, "require": { @@ -349,7 +397,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.13" + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.36" }, "funding": [ { @@ -365,20 +413,20 @@ "type": "tidelift" } ], - "time": "2022-09-11T09:11:59+00:00" + "time": "2024-02-14T16:15:37+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "80d075412b557d41002320b96a096ca65aa2c98d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", + "reference": "80d075412b557d41002320b96a096ca65aa2c98d", "shasum": "" }, "require": { @@ -416,7 +464,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" }, "funding": [ { @@ -432,20 +480,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-01-24T14:02:46+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v5.4.12", + "version": "v5.4.38", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "7649a80e917b47c5072480a2d763c2422da239d2" + "reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/7649a80e917b47c5072480a2d763c2422da239d2", - "reference": "7649a80e917b47c5072480a2d763c2422da239d2", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0118ae0beaebeb5961ddeedc994454e1ac11f759", + "reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759", "shasum": "" }, "require": { @@ -458,7 +506,7 @@ "doctrine/persistence": "<1.3" }, "require-dev": { - "doctrine/dbal": "^2.13|^3.0", + "doctrine/dbal": "^2.13|^3|^4", "doctrine/persistence": "^1.3|^2|^3", "symfony/property-access": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" @@ -489,7 +537,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.12" + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.38" }, "funding": [ { @@ -505,20 +553,20 @@ "type": "tidelift" } ], - "time": "2022-08-09T12:54:00+00:00" + "time": "2024-03-17T15:02:26+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", "shasum": "" }, "require": { @@ -574,7 +622,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" }, "funding": [ { @@ -590,20 +638,20 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73", + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73", "shasum": "" }, "require": { @@ -653,7 +701,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3" }, "funding": [ { @@ -669,24 +717,24 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.13", + "version": "v5.4.38", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11" + "reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11", - "reference": "63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11", + "url": "https://api.github.com/repos/symfony/mailer/zipball/1d0ef27f1b19b9a0175a0e130d1df3113e5a130e", + "reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3", + "egulias/email-validator": "^2.1.10|^3|^4", "php": ">=7.2.5", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", @@ -700,7 +748,7 @@ "symfony/http-kernel": "<4.4" }, "require-dev": { - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/messenger": "^4.4|^5.0|^6.0" }, "type": "library", @@ -729,7 +777,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.13" + "source": "https://github.com/symfony/mailer/tree/v5.4.38" }, "funding": [ { @@ -745,20 +793,20 @@ "type": "tidelift" } ], - "time": "2022-08-29T06:47:07+00:00" + "time": "2024-03-19T10:19:25+00:00" }, { "name": "symfony/messenger", - "version": "v5.4.13", + "version": "v5.4.38", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "8f8d3425991e627902f8288088609a8d8f6c6ea4" + "reference": "a69a4d07e20e4f298a5c030623a1a3328145a889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/8f8d3425991e627902f8288088609a8d8f6c6ea4", - "reference": "8f8d3425991e627902f8288088609a8d8f6c6ea4", + "url": "https://api.github.com/repos/symfony/messenger/zipball/a69a4d07e20e4f298a5c030623a1a3328145a889", + "reference": "a69a4d07e20e4f298a5c030623a1a3328145a889", "shasum": "" }, "require": { @@ -819,7 +867,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v5.4.13" + "source": "https://github.com/symfony/messenger/tree/v5.4.38" }, "funding": [ { @@ -835,20 +883,20 @@ "type": "tidelift" } ], - "time": "2022-09-17T07:31:22+00:00" + "time": "2024-03-19T10:19:25+00:00" }, { "name": "symfony/mime", - "version": "v5.4.13", + "version": "v5.4.38", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd" + "reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", + "url": "https://api.github.com/repos/symfony/mime/zipball/82fa6be8a0295a3932df871e88fc8c8d77aa71d4", + "reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4", "shasum": "" }, "require": { @@ -862,15 +910,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" }, "type": "library", "autoload": { @@ -902,7 +952,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.13" + "source": "https://github.com/symfony/mime/tree/v5.4.38" }, "funding": [ { @@ -918,20 +968,20 @@ "type": "tidelift" } ], - "time": "2022-09-01T18:18:29+00:00" + "time": "2024-03-21T07:25:32+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "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/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -944,9 +994,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -989,7 +1036,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.29.0" }, "funding": [ { @@ -1005,20 +1052,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "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/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -1029,9 +1076,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1073,7 +1117,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.29.0" }, "funding": [ { @@ -1089,20 +1133,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "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/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -1110,9 +1154,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1156,7 +1197,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -1172,20 +1213,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/redis-messenger", - "version": "v5.4.13", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "d3028b772de91e9aa0342c92ff71c77b130ac9c4" + "reference": "54b107003c5abc03cc5077c8847678b432b1e602" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d3028b772de91e9aa0342c92ff71c77b130ac9c4", - "reference": "d3028b772de91e9aa0342c92ff71c77b130ac9c4", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/54b107003c5abc03cc5077c8847678b432b1e602", + "reference": "54b107003c5abc03cc5077c8847678b432b1e602", "shasum": "" }, "require": { @@ -1223,7 +1264,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v5.4.13" + "source": "https://github.com/symfony/redis-messenger/tree/v5.4.36" }, "funding": [ { @@ -1239,20 +1280,20 @@ "type": "tidelift" } ], - "time": "2022-09-11T09:11:59+00:00" + "time": "2024-02-05T13:56:32+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", "shasum": "" }, "require": { @@ -1306,7 +1347,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" }, "funding": [ { @@ -1322,7 +1363,7 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-04-21T15:04:16+00:00" } ], "packages-dev": [], @@ -1338,5 +1379,5 @@ "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/plugins/email/email.php b/plugins/email/email.php index da59047..45edabc 100644 --- a/plugins/email/email.php +++ b/plugins/email/email.php @@ -3,11 +3,13 @@ namespace Grav\Plugin; use Composer\Autoload\ClassLoader; use Grav\Common\Data\Data; +use Grav\Common\Data\ValidationException; use Grav\Common\Grav; use Grav\Common\Plugin; use Grav\Common\Utils; use Grav\Plugin\Email\Email; use RocketTheme\Toolbox\Event\Event; +use Symfony\Component\Mailer\Exception\TransportException; class EmailPlugin extends Plugin { @@ -110,10 +112,10 @@ class EmailPlugin extends Plugin $this->grav->fireEvent('onEmailSend', new Event(['params' => &$params, 'vars' => &$vars])); if (Utils::isAssoc($params)) { - $this->sendFormEmail($form, $params, $vars); + $this->sendFormEmail($form, $params, $vars, $event); } else { foreach ($params as $email) { - $this->sendFormEmail($form, $email, $vars); + $this->sendFormEmail($form, $email, $vars, $event); } } @@ -121,7 +123,7 @@ class EmailPlugin extends Plugin } } - protected function sendFormEmail($form, $params, $vars) + protected function sendFormEmail($form, $params, $vars, $event) { // Build message $message = $this->email->buildMessage($params, $vars); @@ -155,7 +157,17 @@ class EmailPlugin extends Plugin $this->grav->fireEvent('onEmailMessage', new Event(['message' => $message, 'params' => $params, 'form' => $form])); // Send e-mail - $this->email->send($message); + + $status = $this->email->send($message); + + if ($status < 1) { + $this->grav->fireEvent('onFormValidationError', new Event([ + 'form' => $form, + 'message' => $this->email->getLastSendMessage(), + ])); + $event->stopPropagation(); + return; + } //fire event after eMail was sent $this->grav->fireEvent('onEmailSent', new Event(['message' => $message, 'params' => $params, 'form' => $form])); diff --git a/plugins/email/vendor/autoload.php b/plugins/email/vendor/autoload.php index e3e38f1..14152f1 100644 --- a/plugins/email/vendor/autoload.php +++ b/plugins/email/vendor/autoload.php @@ -3,8 +3,21 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/plugins/email/vendor/composer/ClassLoader.php b/plugins/email/vendor/composer/ClassLoader.php index afef3fa..7824d8f 100644 --- a/plugins/email/vendor/composer/ClassLoader.php +++ b/plugins/email/vendor/composer/ClassLoader.php @@ -42,35 +42,37 @@ namespace Composer\Autoload; */ class ClassLoader { - /** @var ?string */ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ private $vendorDir; // PSR-4 /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixLengthsPsr4 = array(); /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixDirsPsr4 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr4 = array(); // PSR-0 /** - * @var array[] - * @psalm-var array> + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> */ private $prefixesPsr0 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr0 = array(); @@ -78,8 +80,7 @@ class ClassLoader private $useIncludePath = false; /** - * @var string[] - * @psalm-var array + * @var array */ private $classMap = array(); @@ -87,29 +88,29 @@ class ClassLoader private $classMapAuthoritative = false; /** - * @var bool[] - * @psalm-var array + * @var array */ private $missingClasses = array(); - /** @var ?string */ + /** @var string|null */ private $apcuPrefix; /** - * @var self[] + * @var array */ private static $registeredLoaders = array(); /** - * @param ?string $vendorDir + * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); } /** - * @return string[] + * @return array> */ public function getPrefixes() { @@ -121,8 +122,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array> + * @return array> */ public function getPrefixesPsr4() { @@ -130,8 +130,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirs() { @@ -139,8 +138,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirsPsr4() { @@ -148,8 +146,7 @@ class ClassLoader } /** - * @return string[] Array of classname => path - * @psalm-return array + * @return array Array of classname => path */ public function getClassMap() { @@ -157,8 +154,7 @@ class ClassLoader } /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap + * @param array $classMap Class to filename map * * @return void */ @@ -175,24 +171,25 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, - (array) $paths + $paths ); } @@ -201,19 +198,19 @@ class ClassLoader $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; + $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], - (array) $paths + $paths ); } } @@ -222,9 +219,9 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * @@ -232,17 +229,18 @@ class ClassLoader */ public function addPsr4($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, - (array) $paths + $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { @@ -252,18 +250,18 @@ class ClassLoader throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; + $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], - (array) $paths + $paths ); } } @@ -272,8 +270,8 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories * * @return void */ @@ -290,8 +288,8 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * @@ -425,7 +423,8 @@ class ClassLoader public function loadClass($class) { if ($file = $this->findFile($class)) { - includeFile($file); + $includeFile = self::$includeFile; + $includeFile($file); return true; } @@ -476,9 +475,9 @@ class ClassLoader } /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. + * Returns the currently registered loaders keyed by their corresponding vendor directories. * - * @return self[] + * @return array */ public static function getRegisteredLoaders() { @@ -555,18 +554,26 @@ class ClassLoader return false; } -} -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } } diff --git a/plugins/email/vendor/composer/InstalledVersions.php b/plugins/email/vendor/composer/InstalledVersions.php index c6b54af..51e734a 100644 --- a/plugins/email/vendor/composer/InstalledVersions.php +++ b/plugins/email/vendor/composer/InstalledVersions.php @@ -98,7 +98,7 @@ class InstalledVersions { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; } } @@ -119,7 +119,7 @@ class InstalledVersions */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { - $constraint = $parser->parseConstraints($constraint); + $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); @@ -328,7 +328,9 @@ class InstalledVersions if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { - $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } @@ -340,12 +342,17 @@ class InstalledVersions // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = require __DIR__ . '/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; } else { self::$installed = array(); } } - $installed[] = self::$installed; + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } return $installed; } diff --git a/plugins/email/vendor/composer/autoload_psr4.php b/plugins/email/vendor/composer/autoload_psr4.php index 85ac5cd..852ff8a 100644 --- a/plugins/email/vendor/composer/autoload_psr4.php +++ b/plugins/email/vendor/composer/autoload_psr4.php @@ -24,5 +24,6 @@ return array( 'Grav\\Plugin\\Email\\' => array($baseDir . '/classes'), 'Grav\\Plugin\\Console\\' => array($baseDir . '/cli'), 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), - 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), + 'Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations'), + 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/src'), ); diff --git a/plugins/email/vendor/composer/autoload_real.php b/plugins/email/vendor/composer/autoload_real.php index 850a062..cbfd9a7 100644 --- a/plugins/email/vendor/composer/autoload_real.php +++ b/plugins/email/vendor/composer/autoload_real.php @@ -33,25 +33,18 @@ class ComposerAutoloaderInit73924571ea6ee98bb12d10ff20aff2ab $loader->register(true); - $includeFiles = \Composer\Autoload\ComposerStaticInit73924571ea6ee98bb12d10ff20aff2ab::$files; - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire73924571ea6ee98bb12d10ff20aff2ab($fileIdentifier, $file); + $filesToLoad = \Composer\Autoload\ComposerStaticInit73924571ea6ee98bb12d10ff20aff2ab::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); } return $loader; } } - -/** - * @param string $fileIdentifier - * @param string $file - * @return void - */ -function composerRequire73924571ea6ee98bb12d10ff20aff2ab($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } -} diff --git a/plugins/email/vendor/composer/autoload_static.php b/plugins/email/vendor/composer/autoload_static.php index 0d0f4c2..a4502ed 100644 --- a/plugins/email/vendor/composer/autoload_static.php +++ b/plugins/email/vendor/composer/autoload_static.php @@ -46,6 +46,7 @@ class ComposerStaticInit73924571ea6ee98bb12d10ff20aff2ab ), 'D' => array ( + 'Doctrine\\Deprecations\\' => 22, 'Doctrine\\Common\\Lexer\\' => 22, ), ); @@ -123,9 +124,13 @@ class ComposerStaticInit73924571ea6ee98bb12d10ff20aff2ab array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), + 'Doctrine\\Deprecations\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations', + ), 'Doctrine\\Common\\Lexer\\' => array ( - 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', + 0 => __DIR__ . '/..' . '/doctrine/lexer/src', ), ); diff --git a/plugins/email/vendor/composer/installed.json b/plugins/email/vendor/composer/installed.json index b64a77e..0545deb 100644 --- a/plugins/email/vendor/composer/installed.json +++ b/plugins/email/vendor/composer/installed.json @@ -1,35 +1,87 @@ { "packages": [ { - "name": "doctrine/lexer", - "version": "1.2.3", - "version_normalized": "1.2.3.0", + "name": "doctrine/deprecations", + "version": "1.1.3", + "version_normalized": "1.1.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, - "time": "2022-02-28T11:07:21+00:00", + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "time": "2024-01-30T19:34:25+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "install-path": "../doctrine/deprecations" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "time": "2024-02-05T11:35:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -61,7 +113,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -81,33 +133,32 @@ }, { "name": "egulias/email-validator", - "version": "3.2.1", - "version_normalized": "3.2.1.0", + "version": "3.2.6", + "version_normalized": "3.2.6.0", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", "shasum": "" }, "require": { - "doctrine/lexer": "^1.2", + "doctrine/lexer": "^1.2|^2", "php": ">=7.2", "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^8.5.8|^9.3.3", "vimeo/psalm": "^4" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" }, - "time": "2022-06-18T20:57:19+00:00", + "time": "2023-06-01T07:04:22+00:00", "type": "library", "extra": { "branch-alias": { @@ -140,7 +191,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/3.2.6" }, "funding": [ { @@ -309,17 +360,17 @@ }, { "name": "symfony/amqp-messenger", - "version": "v5.4.13", - "version_normalized": "5.4.13.0", + "version": "v5.4.36", + "version_normalized": "5.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "def93f2a7841cfa1a4a1fa487b84054d0d53e521" + "reference": "456958ef89fffddc3935f3954a7eac255a5adb21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/def93f2a7841cfa1a4a1fa487b84054d0d53e521", - "reference": "def93f2a7841cfa1a4a1fa487b84054d0d53e521", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/456958ef89fffddc3935f3954a7eac255a5adb21", + "reference": "456958ef89fffddc3935f3954a7eac255a5adb21", "shasum": "" }, "require": { @@ -333,7 +384,7 @@ "symfony/property-access": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" }, - "time": "2022-09-11T09:11:59+00:00", + "time": "2024-02-14T16:15:37+00:00", "type": "symfony-messenger-bridge", "installation-source": "dist", "autoload": { @@ -361,7 +412,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.13" + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.36" }, "funding": [ { @@ -381,23 +432,23 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", + "version": "v2.5.3", + "version_normalized": "2.5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "80d075412b557d41002320b96a096ca65aa2c98d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", + "reference": "80d075412b557d41002320b96a096ca65aa2c98d", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2023-01-24T14:02:46+00:00", "type": "library", "extra": { "branch-alias": { @@ -431,7 +482,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" }, "funding": [ { @@ -451,17 +502,17 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v5.4.12", - "version_normalized": "5.4.12.0", + "version": "v5.4.38", + "version_normalized": "5.4.38.0", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "7649a80e917b47c5072480a2d763c2422da239d2" + "reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/7649a80e917b47c5072480a2d763c2422da239d2", - "reference": "7649a80e917b47c5072480a2d763c2422da239d2", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0118ae0beaebeb5961ddeedc994454e1ac11f759", + "reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759", "shasum": "" }, "require": { @@ -474,12 +525,12 @@ "doctrine/persistence": "<1.3" }, "require-dev": { - "doctrine/dbal": "^2.13|^3.0", + "doctrine/dbal": "^2.13|^3|^4", "doctrine/persistence": "^1.3|^2|^3", "symfony/property-access": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" }, - "time": "2022-08-09T12:54:00+00:00", + "time": "2024-03-17T15:02:26+00:00", "type": "symfony-messenger-bridge", "installation-source": "dist", "autoload": { @@ -507,7 +558,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.12" + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.38" }, "funding": [ { @@ -527,17 +578,17 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.35", + "version_normalized": "5.4.35.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", "shasum": "" }, "require": { @@ -567,7 +618,7 @@ "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2022-05-05T16:45:39+00:00", + "time": "2024-01-23T13:51:25+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -595,7 +646,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" }, "funding": [ { @@ -615,17 +666,17 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", + "version": "v2.5.3", + "version_normalized": "2.5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73", + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73", "shasum": "" }, "require": { @@ -635,7 +686,7 @@ "suggest": { "symfony/event-dispatcher-implementation": "" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2024-01-23T13:51:25+00:00", "type": "library", "extra": { "branch-alias": { @@ -677,7 +728,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3" }, "funding": [ { @@ -697,21 +748,21 @@ }, { "name": "symfony/mailer", - "version": "v5.4.13", - "version_normalized": "5.4.13.0", + "version": "v5.4.38", + "version_normalized": "5.4.38.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11" + "reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11", - "reference": "63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11", + "url": "https://api.github.com/repos/symfony/mailer/zipball/1d0ef27f1b19b9a0175a0e130d1df3113e5a130e", + "reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3", + "egulias/email-validator": "^2.1.10|^3|^4", "php": ">=7.2.5", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", @@ -725,10 +776,10 @@ "symfony/http-kernel": "<4.4" }, "require-dev": { - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/messenger": "^4.4|^5.0|^6.0" }, - "time": "2022-08-29T06:47:07+00:00", + "time": "2024-03-19T10:19:25+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -756,7 +807,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.13" + "source": "https://github.com/symfony/mailer/tree/v5.4.38" }, "funding": [ { @@ -776,17 +827,17 @@ }, { "name": "symfony/messenger", - "version": "v5.4.13", - "version_normalized": "5.4.13.0", + "version": "v5.4.38", + "version_normalized": "5.4.38.0", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "8f8d3425991e627902f8288088609a8d8f6c6ea4" + "reference": "a69a4d07e20e4f298a5c030623a1a3328145a889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/8f8d3425991e627902f8288088609a8d8f6c6ea4", - "reference": "8f8d3425991e627902f8288088609a8d8f6c6ea4", + "url": "https://api.github.com/repos/symfony/messenger/zipball/a69a4d07e20e4f298a5c030623a1a3328145a889", + "reference": "a69a4d07e20e4f298a5c030623a1a3328145a889", "shasum": "" }, "require": { @@ -821,7 +872,7 @@ "suggest": { "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." }, - "time": "2022-09-17T07:31:22+00:00", + "time": "2024-03-19T10:19:25+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -849,7 +900,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v5.4.13" + "source": "https://github.com/symfony/messenger/tree/v5.4.38" }, "funding": [ { @@ -869,17 +920,17 @@ }, { "name": "symfony/mime", - "version": "v5.4.13", - "version_normalized": "5.4.13.0", + "version": "v5.4.38", + "version_normalized": "5.4.38.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd" + "reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", + "url": "https://api.github.com/repos/symfony/mime/zipball/82fa6be8a0295a3932df871e88fc8c8d77aa71d4", + "reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4", "shasum": "" }, "require": { @@ -893,17 +944,19 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" }, - "time": "2022-09-01T18:18:29+00:00", + "time": "2024-03-21T07:25:32+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -935,7 +988,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.13" + "source": "https://github.com/symfony/mime/tree/v5.4.38" }, "funding": [ { @@ -955,17 +1008,17 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "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/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -976,12 +1029,9 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2022-05-24T11:49:31+00:00", + "time": "2024-01-29T20:11:03+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1025,7 +1075,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.29.0" }, "funding": [ { @@ -1045,17 +1095,17 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "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/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -1064,12 +1114,9 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2022-05-24T11:49:31+00:00", + "time": "2024-01-29T20:11:03+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1112,7 +1159,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.29.0" }, "funding": [ { @@ -1132,28 +1179,25 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "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/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-05-10T07:21:04+00:00", + "time": "2024-01-29T20:11:03+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1198,7 +1242,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -1218,17 +1262,17 @@ }, { "name": "symfony/redis-messenger", - "version": "v5.4.13", - "version_normalized": "5.4.13.0", + "version": "v5.4.36", + "version_normalized": "5.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "d3028b772de91e9aa0342c92ff71c77b130ac9c4" + "reference": "54b107003c5abc03cc5077c8847678b432b1e602" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d3028b772de91e9aa0342c92ff71c77b130ac9c4", - "reference": "d3028b772de91e9aa0342c92ff71c77b130ac9c4", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/54b107003c5abc03cc5077c8847678b432b1e602", + "reference": "54b107003c5abc03cc5077c8847678b432b1e602", "shasum": "" }, "require": { @@ -1240,7 +1284,7 @@ "symfony/property-access": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" }, - "time": "2022-09-11T09:11:59+00:00", + "time": "2024-02-05T13:56:32+00:00", "type": "symfony-messenger-bridge", "installation-source": "dist", "autoload": { @@ -1268,7 +1312,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v5.4.13" + "source": "https://github.com/symfony/redis-messenger/tree/v5.4.36" }, "funding": [ { @@ -1288,17 +1332,17 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", + "version": "v2.5.3", + "version_normalized": "2.5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", "shasum": "" }, "require": { @@ -1312,7 +1356,7 @@ "suggest": { "symfony/service-implementation": "" }, - "time": "2022-05-30T19:17:29+00:00", + "time": "2023-04-21T15:04:16+00:00", "type": "library", "extra": { "branch-alias": { @@ -1354,7 +1398,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" }, "funding": [ { @@ -1373,6 +1417,6 @@ "install-path": "../symfony/service-contracts" } ], - "dev": true, + "dev": false, "dev-package-names": [] } diff --git a/plugins/email/vendor/composer/installed.php b/plugins/email/vendor/composer/installed.php index b2fbb84..a36476b 100644 --- a/plugins/email/vendor/composer/installed.php +++ b/plugins/email/vendor/composer/installed.php @@ -3,26 +3,35 @@ 'name' => 'getgrav/grav-plugin-email', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'f6eb15486887c489363e6bf79fa49ea4a3d833c6', + 'reference' => '9b38e4e031e87c79320dd30b46960125a0385453', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'dev' => true, + 'dev' => false, ), 'versions' => array( + 'doctrine/deprecations' => array( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'reference' => 'dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/deprecations', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'doctrine/lexer' => array( - 'pretty_version' => '1.2.3', - 'version' => '1.2.3.0', - 'reference' => 'c268e882d4dbdd85e36e4ad69e02dc284f89d229', + 'pretty_version' => '2.1.1', + 'version' => '2.1.1.0', + 'reference' => '861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/lexer', 'aliases' => array(), 'dev_requirement' => false, ), 'egulias/email-validator' => array( - 'pretty_version' => '3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'f88dcf4b14af14a98ad96b14b2b317969eab6715', + 'pretty_version' => '3.2.6', + 'version' => '3.2.6.0', + 'reference' => 'e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7', 'type' => 'library', 'install_path' => __DIR__ . '/../egulias/email-validator', 'aliases' => array(), @@ -31,7 +40,7 @@ 'getgrav/grav-plugin-email' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'f6eb15486887c489363e6bf79fa49ea4a3d833c6', + 'reference' => '9b38e4e031e87c79320dd30b46960125a0385453', 'type' => 'grav-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -71,45 +80,45 @@ 'dev_requirement' => false, ), 'symfony/amqp-messenger' => array( - 'pretty_version' => 'v5.4.13', - 'version' => '5.4.13.0', - 'reference' => 'def93f2a7841cfa1a4a1fa487b84054d0d53e521', + 'pretty_version' => 'v5.4.36', + 'version' => '5.4.36.0', + 'reference' => '456958ef89fffddc3935f3954a7eac255a5adb21', 'type' => 'symfony-messenger-bridge', 'install_path' => __DIR__ . '/../symfony/amqp-messenger', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v2.5.2', - 'version' => '2.5.2.0', - 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', + 'pretty_version' => 'v2.5.3', + 'version' => '2.5.3.0', + 'reference' => '80d075412b557d41002320b96a096ca65aa2c98d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/doctrine-messenger' => array( - 'pretty_version' => 'v5.4.12', - 'version' => '5.4.12.0', - 'reference' => '7649a80e917b47c5072480a2d763c2422da239d2', + 'pretty_version' => 'v5.4.38', + 'version' => '5.4.38.0', + 'reference' => '0118ae0beaebeb5961ddeedc994454e1ac11f759', 'type' => 'symfony-messenger-bridge', 'install_path' => __DIR__ . '/../symfony/doctrine-messenger', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/event-dispatcher' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc', + 'pretty_version' => 'v5.4.35', + 'version' => '5.4.35.0', + 'reference' => '7a69a85c7ea5bdd1e875806a99c51a87d3a74b38', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v2.5.2', - 'version' => '2.5.2.0', - 'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1', + 'pretty_version' => 'v2.5.3', + 'version' => '2.5.3.0', + 'reference' => '540f4c73e87fd0c71ca44a6aa305d024ac68cb73', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), @@ -122,27 +131,27 @@ ), ), 'symfony/mailer' => array( - 'pretty_version' => 'v5.4.13', - 'version' => '5.4.13.0', - 'reference' => '63bf36a5150ac0bfed1c4d0a4e0b114a57b77e11', + 'pretty_version' => 'v5.4.38', + 'version' => '5.4.38.0', + 'reference' => '1d0ef27f1b19b9a0175a0e130d1df3113e5a130e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mailer', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/messenger' => array( - 'pretty_version' => 'v5.4.13', - 'version' => '5.4.13.0', - 'reference' => '8f8d3425991e627902f8288088609a8d8f6c6ea4', + 'pretty_version' => 'v5.4.38', + 'version' => '5.4.38.0', + 'reference' => 'a69a4d07e20e4f298a5c030623a1a3328145a889', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/messenger', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/mime' => array( - 'pretty_version' => 'v5.4.13', - 'version' => '5.4.13.0', - 'reference' => 'bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd', + 'pretty_version' => 'v5.4.38', + 'version' => '5.4.38.0', + 'reference' => '82fa6be8a0295a3932df871e88fc8c8d77aa71d4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mime', 'aliases' => array(), @@ -155,18 +164,18 @@ ), ), 'symfony/polyfill-intl-idn' => array( - 'pretty_version' => 'v1.26.0', - 'version' => '1.26.0.0', - 'reference' => '59a8d271f00dd0e4c2e518104cc7963f655a1aa8', + 'pretty_version' => 'v1.29.0', + 'version' => '1.29.0.0', + 'reference' => 'a287ed7475f85bf6f61890146edbc932c0fff919', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( - 'pretty_version' => 'v1.26.0', - 'version' => '1.26.0.0', - 'reference' => '219aa369ceff116e673852dce47c3a41794c14bd', + 'pretty_version' => 'v1.29.0', + 'version' => '1.29.0.0', + 'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), @@ -185,27 +194,27 @@ ), ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.26.0', - 'version' => '1.26.0.0', - 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace', + 'pretty_version' => 'v1.29.0', + 'version' => '1.29.0.0', + 'reference' => '87b68208d5c1188808dd7839ee1e6c8ec3b02f1b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/redis-messenger' => array( - 'pretty_version' => 'v5.4.13', - 'version' => '5.4.13.0', - 'reference' => 'd3028b772de91e9aa0342c92ff71c77b130ac9c4', + 'pretty_version' => 'v5.4.36', + 'version' => '5.4.36.0', + 'reference' => '54b107003c5abc03cc5077c8847678b432b1e602', 'type' => 'symfony-messenger-bridge', 'install_path' => __DIR__ . '/../symfony/redis-messenger', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v2.5.2', - 'version' => '2.5.2.0', - 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', + 'pretty_version' => 'v2.5.3', + 'version' => '2.5.3.0', + 'reference' => 'a2329596ddc8fd568900e3fc76cba42489ecc7f3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), diff --git a/plugins/email/vendor/doctrine/deprecations/LICENSE b/plugins/email/vendor/doctrine/deprecations/LICENSE new file mode 100644 index 0000000..156905c --- /dev/null +++ b/plugins/email/vendor/doctrine/deprecations/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-2021 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/email/vendor/doctrine/deprecations/README.md b/plugins/email/vendor/doctrine/deprecations/README.md new file mode 100644 index 0000000..93caf83 --- /dev/null +++ b/plugins/email/vendor/doctrine/deprecations/README.md @@ -0,0 +1,157 @@ +# Doctrine Deprecations + +A small (side-effect free by default) layer on top of +`trigger_error(E_USER_DEPRECATED)` or PSR-3 logging. + +- no side-effects by default, making it a perfect fit for libraries that don't know how the error handler works they operate under +- options to avoid having to rely on error handlers global state by using PSR-3 logging +- deduplicate deprecation messages to avoid excessive triggering and reduce overhead + +We recommend to collect Deprecations using a PSR logger instead of relying on +the global error handler. + +## Usage from consumer perspective: + +Enable Doctrine deprecations to be sent to a PSR3 logger: + +```php +\Doctrine\Deprecations\Deprecation::enableWithPsrLogger($logger); +``` + +Enable Doctrine deprecations to be sent as `@trigger_error($message, E_USER_DEPRECATED)` +messages by setting the `DOCTRINE_DEPRECATIONS` environment variable to `trigger`. +Alternatively, call: + +```php +\Doctrine\Deprecations\Deprecation::enableWithTriggerError(); +``` + +If you only want to enable deprecation tracking, without logging or calling `trigger_error` +then set the `DOCTRINE_DEPRECATIONS` environment variable to `track`. +Alternatively, call: + +```php +\Doctrine\Deprecations\Deprecation::enableTrackingDeprecations(); +``` + +Tracking is enabled with all three modes and provides access to all triggered +deprecations and their individual count: + +```php +$deprecations = \Doctrine\Deprecations\Deprecation::getTriggeredDeprecations(); + +foreach ($deprecations as $identifier => $count) { + echo $identifier . " was triggered " . $count . " times\n"; +} +``` + +### Suppressing Specific Deprecations + +Disable triggering about specific deprecations: + +```php +\Doctrine\Deprecations\Deprecation::ignoreDeprecations("https://link/to/deprecations-description-identifier"); +``` + +Disable all deprecations from a package + +```php +\Doctrine\Deprecations\Deprecation::ignorePackage("doctrine/orm"); +``` + +### Other Operations + +When used within PHPUnit or other tools that could collect multiple instances of the same deprecations +the deduplication can be disabled: + +```php +\Doctrine\Deprecations\Deprecation::withoutDeduplication(); +``` + +Disable deprecation tracking again: + +```php +\Doctrine\Deprecations\Deprecation::disable(); +``` + +## Usage from a library/producer perspective: + +When you want to unconditionally trigger a deprecation even when called +from the library itself then the `trigger` method is the way to go: + +```php +\Doctrine\Deprecations\Deprecation::trigger( + "doctrine/orm", + "https://link/to/deprecations-description", + "message" +); +``` + +If variable arguments are provided at the end, they are used with `sprintf` on +the message. + +```php +\Doctrine\Deprecations\Deprecation::trigger( + "doctrine/orm", + "https://github.com/doctrine/orm/issue/1234", + "message %s %d", + "foo", + 1234 +); +``` + +When you want to trigger a deprecation only when it is called by a function +outside of the current package, but not trigger when the package itself is the cause, +then use: + +```php +\Doctrine\Deprecations\Deprecation::triggerIfCalledFromOutside( + "doctrine/orm", + "https://link/to/deprecations-description", + "message" +); +``` + +Based on the issue link each deprecation message is only triggered once per +request. + +A limited stacktrace is included in the deprecation message to find the +offending location. + +Note: A producer/library should never call `Deprecation::enableWith` methods +and leave the decision how to handle deprecations to application and +frameworks. + +## Usage in PHPUnit tests + +There is a `VerifyDeprecations` trait that you can use to make assertions on +the occurrence of deprecations within a test. + +```php +use Doctrine\Deprecations\PHPUnit\VerifyDeprecations; + +class MyTest extends TestCase +{ + use VerifyDeprecations; + + public function testSomethingDeprecation() + { + $this->expectDeprecationWithIdentifier('https://github.com/doctrine/orm/issue/1234'); + + triggerTheCodeWithDeprecation(); + } + + public function testSomethingDeprecationFixed() + { + $this->expectNoDeprecationWithIdentifier('https://github.com/doctrine/orm/issue/1234'); + + triggerTheCodeWithoutDeprecation(); + } +} +``` + +## What is a deprecation identifier? + +An identifier for deprecations is just a link to any resource, most often a +Github Issue or Pull Request explaining the deprecation and potentially its +alternative. diff --git a/plugins/email/vendor/doctrine/deprecations/composer.json b/plugins/email/vendor/doctrine/deprecations/composer.json new file mode 100644 index 0000000..f8319f9 --- /dev/null +++ b/plugins/email/vendor/doctrine/deprecations/composer.json @@ -0,0 +1,38 @@ +{ + "name": "doctrine/deprecations", + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "license": "MIT", + "type": "library", + "homepage": "https://www.doctrine-project.org/", + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "autoload-dev": { + "psr-4": { + "DeprecationTests\\": "test_fixtures/src", + "Doctrine\\Foo\\": "test_fixtures/vendor/doctrine/foo" + } + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php b/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php new file mode 100644 index 0000000..bad5070 --- /dev/null +++ b/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php @@ -0,0 +1,313 @@ +|null */ + private static $type; + + /** @var LoggerInterface|null */ + private static $logger; + + /** @var array */ + private static $ignoredPackages = []; + + /** @var array */ + private static $triggeredDeprecations = []; + + /** @var array */ + private static $ignoredLinks = []; + + /** @var bool */ + private static $deduplication = true; + + /** + * Trigger a deprecation for the given package and identfier. + * + * The link should point to a Github issue or Wiki entry detailing the + * deprecation. It is additionally used to de-duplicate the trigger of the + * same deprecation during a request. + * + * @param float|int|string $args + */ + public static function trigger(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + if (isset(self::$ignoredLinks[$link])) { + return; + } + + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; + } else { + self::$triggeredDeprecations[$link] = 1; + } + + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** + * Trigger a deprecation for the given package and identifier when called from outside. + * + * "Outside" means we assume that $package is currently installed as a + * dependency and the caller is not a file in that package. When $package + * is installed as a root package then deprecations triggered from the + * tests folder are also considered "outside". + * + * This deprecation method assumes that you are using Composer to install + * the dependency and are using the default /vendor/ folder and not a + * Composer plugin to change the install location. The assumption is also + * that $package is the exact composer packge name. + * + * Compared to {@link trigger()} this method causes some overhead when + * deprecation tracking is enabled even during deduplication, because it + * needs to call {@link debug_backtrace()} + * + * @param float|int|string $args + */ + public static function triggerIfCalledFromOutside(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + // first check that the caller is not from a tests folder, in which case we always let deprecations pass + if (isset($backtrace[1]['file'], $backtrace[0]['file']) && strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === false) { + $path = DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $package) . DIRECTORY_SEPARATOR; + + if (strpos($backtrace[0]['file'], $path) === false) { + return; + } + + if (strpos($backtrace[1]['file'], $path) !== false) { + return; + } + } + + if (isset(self::$ignoredLinks[$link])) { + return; + } + + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; + } else { + self::$triggeredDeprecations[$link] = 1; + } + + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** + * @param list $backtrace + */ + private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if (($type & self::TYPE_PSR_LOGGER) > 0) { + $context = [ + 'file' => $backtrace[0]['file'] ?? null, + 'line' => $backtrace[0]['line'] ?? null, + 'package' => $package, + 'link' => $link, + ]; + + assert(self::$logger !== null); + + self::$logger->notice($message, $context); + } + + if (! (($type & self::TYPE_TRIGGER_ERROR) > 0)) { + return; + } + + $message .= sprintf( + ' (%s:%d called by %s:%d, %s, package %s)', + self::basename($backtrace[0]['file'] ?? 'native code'), + $backtrace[0]['line'] ?? 0, + self::basename($backtrace[1]['file'] ?? 'native code'), + $backtrace[1]['line'] ?? 0, + $link, + $package + ); + + @trigger_error($message, E_USER_DEPRECATED); + } + + /** + * A non-local-aware version of PHPs basename function. + */ + private static function basename(string $filename): string + { + $pos = strrpos($filename, DIRECTORY_SEPARATOR); + + if ($pos === false) { + return $filename; + } + + return substr($filename, $pos + 1); + } + + public static function enableTrackingDeprecations(): void + { + self::$type = self::$type ?? 0; + self::$type |= self::TYPE_TRACK_DEPRECATIONS; + } + + public static function enableWithTriggerError(): void + { + self::$type = self::$type ?? 0; + self::$type |= self::TYPE_TRIGGER_ERROR; + } + + public static function enableWithPsrLogger(LoggerInterface $logger): void + { + self::$type = self::$type ?? 0; + self::$type |= self::TYPE_PSR_LOGGER; + self::$logger = $logger; + } + + public static function withoutDeduplication(): void + { + self::$deduplication = false; + } + + public static function disable(): void + { + self::$type = self::TYPE_NONE; + self::$logger = null; + self::$deduplication = true; + self::$ignoredLinks = []; + + foreach (self::$triggeredDeprecations as $link => $count) { + self::$triggeredDeprecations[$link] = 0; + } + } + + public static function ignorePackage(string $packageName): void + { + self::$ignoredPackages[$packageName] = true; + } + + public static function ignoreDeprecations(string ...$links): void + { + foreach ($links as $link) { + self::$ignoredLinks[$link] = true; + } + } + + public static function getUniqueTriggeredDeprecationsCount(): int + { + return array_reduce(self::$triggeredDeprecations, static function (int $carry, int $count) { + return $carry + $count; + }, 0); + } + + /** + * Returns each triggered deprecation link identifier and the amount of occurrences. + * + * @return array + */ + public static function getTriggeredDeprecations(): array + { + return self::$triggeredDeprecations; + } + + /** + * @return int-mask-of + */ + private static function getTypeFromEnv(): int + { + switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) { + case 'trigger': + self::$type = self::TYPE_TRIGGER_ERROR; + break; + + case 'track': + self::$type = self::TYPE_TRACK_DEPRECATIONS; + break; + + default: + self::$type = self::TYPE_NONE; + break; + } + + return self::$type; + } +} diff --git a/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php b/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php new file mode 100644 index 0000000..4c3366a --- /dev/null +++ b/plugins/email/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php @@ -0,0 +1,66 @@ + */ + private $doctrineDeprecationsExpectations = []; + + /** @var array */ + private $doctrineNoDeprecationsExpectations = []; + + public function expectDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + public function expectNoDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineNoDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + /** + * @before + */ + public function enableDeprecationTracking(): void + { + Deprecation::enableTrackingDeprecations(); + } + + /** + * @after + */ + public function verifyDeprecationsAreTriggered(): void + { + foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount > $expectation, + sprintf( + "Expected deprecation with identifier '%s' was not triggered by code executed in test.", + $identifier + ) + ); + } + + foreach ($this->doctrineNoDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount === $expectation, + sprintf( + "Expected deprecation with identifier '%s' was triggered by code executed in test, but expected not to.", + $identifier + ) + ); + } + } +} diff --git a/plugins/email/vendor/doctrine/lexer/UPGRADE.md b/plugins/email/vendor/doctrine/lexer/UPGRADE.md new file mode 100644 index 0000000..42b85b3 --- /dev/null +++ b/plugins/email/vendor/doctrine/lexer/UPGRADE.md @@ -0,0 +1,14 @@ +Note about upgrading: Doctrine uses static and runtime mechanisms to raise +awareness about deprecated code. + +- Use of `@deprecated` docblock that is detected by IDEs (like PHPStorm) or + Static Analysis tools (like Psalm, phpstan) +- Use of our low-overhead runtime deprecation API, details: + https://github.com/doctrine/deprecations/ + +# Upgrade to 2.0.0 + +`AbstractLexer::glimpse()` and `AbstractLexer::peek()` now return +instances of `Doctrine\Common\Lexer\Token`, which is an array-like class +Using it as an array is deprecated in favor of using properties of that class. +Using `count()` on it is deprecated with no replacement. diff --git a/plugins/email/vendor/doctrine/lexer/composer.json b/plugins/email/vendor/doctrine/lexer/composer.json index c435647..3ac4b50 100644 --- a/plugins/email/vendor/doctrine/lexer/composer.json +++ b/plugins/email/vendor/doctrine/lexer/composer.json @@ -1,7 +1,8 @@ { "name": "doctrine/lexer", - "type": "library", "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "license": "MIT", + "type": "library", "keywords": [ "php", "parser", @@ -9,27 +10,41 @@ "annotations", "docblock" ], - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "license": "MIT", "authors": [ - {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, - {"name": "Roman Borschel", "email": "roman@code-factory.org"}, - {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } ], + "homepage": "https://www.doctrine-project.org/projects/lexer.html", "require": { - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "doctrine/deprecations": "^1.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" }, "autoload": { - "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" } + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } }, "autoload-dev": { - "psr-4": { "Doctrine\\Tests\\": "tests/Doctrine" } + "psr-4": { + "Doctrine\\Tests\\Common\\Lexer\\": "tests" + } }, "config": { "allow-plugins": { diff --git a/plugins/email/vendor/doctrine/lexer/psalm.xml b/plugins/email/vendor/doctrine/lexer/psalm.xml deleted file mode 100644 index f331e50..0000000 --- a/plugins/email/vendor/doctrine/lexer/psalm.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/plugins/email/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php b/plugins/email/vendor/doctrine/lexer/src/AbstractLexer.php similarity index 79% rename from plugins/email/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php rename to plugins/email/vendor/doctrine/lexer/src/AbstractLexer.php index 7e8a11d..8bbe6b0 100644 --- a/plugins/email/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php +++ b/plugins/email/vendor/doctrine/lexer/src/AbstractLexer.php @@ -5,9 +5,10 @@ declare(strict_types=1); namespace Doctrine\Common\Lexer; use ReflectionClass; +use UnitEnum; +use function get_class; use function implode; -use function in_array; use function preg_split; use function sprintf; use function substr; @@ -19,7 +20,8 @@ use const PREG_SPLIT_OFFSET_CAPTURE; /** * Base class for writing simple lexers, i.e. for creating small DSLs. * - * @psalm-type Token = array{value: int|string, type:string|int|null, position:int} + * @template T of UnitEnum|string|int + * @template V of string|int */ abstract class AbstractLexer { @@ -33,14 +35,7 @@ abstract class AbstractLexer /** * Array of scanned tokens. * - * Each token is an associative array containing three items: - * - 'value' : the string value of the token in the input string - * - 'type' : the type of the token (identifier, numeric, string, input - * parameter, none) - * - 'position' : the position of the token in the input string - * - * @var mixed[][] - * @psalm-var list + * @var list> */ private $tokens = []; @@ -61,23 +56,21 @@ abstract class AbstractLexer /** * The next token in the input. * - * @var mixed[]|null - * @psalm-var Token|null + * @var Token|null */ public $lookahead; /** * The last matched/seen token. * - * @var mixed[]|null - * @psalm-var Token|null + * @var Token|null */ public $token; /** * Composed regex for input parsing. * - * @var string|null + * @var non-empty-string|null */ private $regex; @@ -150,31 +143,37 @@ abstract class AbstractLexer /** * Checks whether a given token matches the current lookahead. * - * @param int|string $type + * @param T $type * * @return bool + * + * @psalm-assert-if-true !=null $this->lookahead */ public function isNextToken($type) { - return $this->lookahead !== null && $this->lookahead['type'] === $type; + return $this->lookahead !== null && $this->lookahead->isA($type); } /** * Checks whether any of the given tokens matches the current lookahead. * - * @param list $types + * @param list $types * * @return bool + * + * @psalm-assert-if-true !=null $this->lookahead */ public function isNextTokenAny(array $types) { - return $this->lookahead !== null && in_array($this->lookahead['type'], $types, true); + return $this->lookahead !== null && $this->lookahead->isA(...$types); } /** * Moves to the next token in the input string. * * @return bool + * + * @psalm-assert-if-true !null $this->lookahead */ public function moveNext() { @@ -189,13 +188,13 @@ abstract class AbstractLexer /** * Tells the lexer to skip input tokens until it sees a token with the given value. * - * @param string $type The token type to skip until. + * @param T $type The token type to skip until. * * @return void */ public function skipUntil($type) { - while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + while ($this->lookahead !== null && ! $this->lookahead->isA($type)) { $this->moveNext(); } } @@ -203,7 +202,7 @@ abstract class AbstractLexer /** * Checks if given value is identical to the given token. * - * @param mixed $value + * @param string $value * @param int|string $token * * @return bool @@ -216,8 +215,7 @@ abstract class AbstractLexer /** * Moves the lookahead token forward. * - * @return mixed[]|null The next token or NULL if there are no more tokens ahead. - * @psalm-return Token|null + * @return Token|null The next token or NULL if there are no more tokens ahead. */ public function peek() { @@ -231,8 +229,7 @@ abstract class AbstractLexer /** * Peeks at the next token, returns it and immediately resets the peek. * - * @return mixed[]|null The next token or NULL if there are no more tokens ahead. - * @psalm-return Token|null + * @return Token|null The next token or NULL if there are no more tokens ahead. */ public function glimpse() { @@ -270,26 +267,32 @@ abstract class AbstractLexer foreach ($matches as $match) { // Must remain before 'value' assignment since it can change content - $type = $this->getType($match[0]); + $firstMatch = $match[0]; + $type = $this->getType($firstMatch); - $this->tokens[] = [ - 'value' => $match[0], - 'type' => $type, - 'position' => $match[1], - ]; + $this->tokens[] = new Token( + $firstMatch, + $type, + $match[1] + ); } } /** * Gets the literal for a given token. * - * @param int|string $token + * @param T $token * * @return int|string */ public function getLiteral($token) { + if ($token instanceof UnitEnum) { + return get_class($token) . '::' . $token->name; + } + $className = static::class; + $reflClass = new ReflectionClass($className); $constants = $reflClass->getConstants(); @@ -331,7 +334,9 @@ abstract class AbstractLexer * * @param string $value * - * @return int|string|null + * @return T|null + * + * @param-out V $value */ abstract protected function getType(&$value); } diff --git a/plugins/email/vendor/doctrine/lexer/src/Token.php b/plugins/email/vendor/doctrine/lexer/src/Token.php new file mode 100644 index 0000000..4fbbf4e --- /dev/null +++ b/plugins/email/vendor/doctrine/lexer/src/Token.php @@ -0,0 +1,145 @@ + + */ +final class Token implements ArrayAccess +{ + /** + * The string value of the token in the input string + * + * @readonly + * @var V + */ + public $value; + + /** + * The type of the token (identifier, numeric, string, input parameter, none) + * + * @readonly + * @var T|null + */ + public $type; + + /** + * The position of the token in the input string + * + * @readonly + * @var int + */ + public $position; + + /** + * @param V $value + * @param T|null $type + */ + public function __construct($value, $type, int $position) + { + $this->value = $value; + $this->type = $type; + $this->position = $position; + } + + /** @param T ...$types */ + public function isA(...$types): bool + { + return in_array($this->type, $types, true); + } + + /** + * @deprecated Use the value, type or position property instead + * {@inheritDoc} + */ + public function offsetExists($offset): bool + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead', + self::class + ); + + return in_array($offset, ['value', 'type', 'position'], true); + } + + /** + * @deprecated Use the value, type or position property instead + * {@inheritDoc} + * + * @param O $offset + * + * @return mixed + * @psalm-return ( + * O is 'value' + * ? V + * : ( + * O is 'type' + * ? T|null + * : ( + * O is 'position' + * ? int + * : mixed + * ) + * ) + * ) + * + * @template O of array-key + */ + #[ReturnTypeWillChange] + public function offsetGet($offset) + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead', + self::class + ); + + return $this->$offset; + } + + /** + * @deprecated no replacement planned + * {@inheritDoc} + */ + public function offsetSet($offset, $value): void + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Setting %s properties via ArrayAccess is deprecated', + self::class + ); + + $this->$offset = $value; + } + + /** + * @deprecated no replacement planned + * {@inheritDoc} + */ + public function offsetUnset($offset): void + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Setting %s properties via ArrayAccess is deprecated', + self::class + ); + + $this->$offset = null; + } +} diff --git a/plugins/email/vendor/egulias/email-validator/CHANGELOG.md b/plugins/email/vendor/egulias/email-validator/CHANGELOG.md index 83fd62e..539917f 100644 --- a/plugins/email/vendor/egulias/email-validator/CHANGELOG.md +++ b/plugins/email/vendor/egulias/email-validator/CHANGELOG.md @@ -5,7 +5,7 @@ * Access to local part and domain part from EmailParser * Validations outside of the scope of the RFC will be considered "extra" validations, thus opening the door for adding new; will live in their own folder "extra" (as requested in #248, #195, #183). -## Breacking changes +## Breaking changes * PHP version upgraded to match Symfony's (as of 12/2020). * DNSCheckValidation now fails for missing MX records. While the RFC argues that the existence of only A records to be valid, starting in v3 they will be considered invalid. diff --git a/plugins/email/vendor/egulias/email-validator/LICENSE b/plugins/email/vendor/egulias/email-validator/LICENSE index 1f0f267..307440d 100644 --- a/plugins/email/vendor/egulias/email-validator/LICENSE +++ b/plugins/email/vendor/egulias/email-validator/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2021 Eduardo Gulias Davis +Copyright (c) 2013-2022 Eduardo Gulias Davis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/egulias/email-validator/composer.json b/plugins/email/vendor/egulias/email-validator/composer.json index d598d1b..6a273e2 100644 --- a/plugins/email/vendor/egulias/email-validator/composer.json +++ b/plugins/email/vendor/egulias/email-validator/composer.json @@ -14,11 +14,10 @@ }, "require": { "php": ">=7.2", - "doctrine/lexer": "^1.2", + "doctrine/lexer": "^1.2|^2", "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^8.5.8|^9.3.3", "vimeo/psalm": "^4" }, diff --git a/plugins/email/vendor/egulias/email-validator/composer.lock b/plugins/email/vendor/egulias/email-validator/composer.lock deleted file mode 100644 index 4b918d1..0000000 --- a/plugins/email/vendor/egulias/email-validator/composer.lock +++ /dev/null @@ -1,5028 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "a77d36b64bc1213fecf4d4f92d759c3b", - "packages": [ - { - "name": "doctrine/lexer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-02-28T11:07:21+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.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": "2021-09-14T14:02:44+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "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 for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.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": "2021-05-27T09:17:38+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" - }, - "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-01-17T14:14:24+00:00" - }, - { - "name": "composer/pcre", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T20:21:48+00:00" - }, - { - "name": "composer/semver", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" - }, - "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-04-01T19:23:25+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T21:32:43+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+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" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" - }, - "time": "2022-03-02T22:36:06+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.4.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/74a8602c6faec9ef74b7a9391ac82c5e65b1cdab", - "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.4-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "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": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2022-05-25T13:24:33+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Promise\\": "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": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:56:57+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.2.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c94a94f120803a18554c1805ef2e539f8285f9a2", - "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "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" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.2.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2022-03-20T21:55:58+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "time": "2020-12-01T19:48:11+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.13.2", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" - }, - "time": "2021-11-30T19:35:32+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "php-coveralls/php-coveralls", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", - "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" - }, - "suggest": { - "symfony/http-kernel": "Allows Symfony integration" - }, - "bin": [ - "bin/php-coveralls" - ], - "type": "library", - "autoload": { - "psr-4": { - "PhpCoveralls\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp", - "role": "Original creator" - }, - { - "name": "Takashi Matsuo", - "email": "tmatsuo@google.com" - }, - { - "name": "Google Inc" - }, - { - "name": "Dariusz Ruminski", - "email": "dariusz.ruminski@gmail.com", - "homepage": "https://github.com/keradus" - }, - { - "name": "Contributors", - "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" - } - ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/php-coveralls/php-coveralls", - "keywords": [ - "ci", - "coverage", - "github", - "test" - ], - "support": { - "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.2" - }, - "time": "2021-12-06T17:05:08+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-07T09:28:20+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-04-01T12:37:26+00:00" - }, - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:49:45+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-04-03T09:37:03+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-11-11T14:18:36+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-02-14T08:28:10+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.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" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-15T09:54:48+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "symfony/config", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979", - "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v5.4.9" - }, - "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-17T10:39:36+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.4.9" - }, - "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-18T06:17:34+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.9" - }, - "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-20T13:55:35+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.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": "2021-10-20T20:35:02+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.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": "2021-11-23T21:10:46+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.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": "2021-11-30T18:21:41+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.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": "2021-06-05T21:20:04+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.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-03-04T08:16:47+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-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.25.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": "2021-09-13T13:58:11+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" - }, - "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-03-13T20:07:29+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.4.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" - }, - "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-02-18T16:06:09+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.9" - }, - "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-04-19T10:40:37+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" - }, - "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-26T16:32:32+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "vimeo/psalm", - "version": "4.23.0", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1fe6ff483bf325c803df9f510d09a03fd796f88", - "reference": "f1fe6ff483bf325c803df9f510d09a03fd796f88", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], - "psr-4": { - "Psalm\\": "src/Psalm/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.23.0" - }, - "time": "2022-04-28T17:35:49+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.2" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/plugins/email/vendor/egulias/email-validator/src/EmailLexer.php b/plugins/email/vendor/egulias/email-validator/src/EmailLexer.php index 7e660b6..4099758 100644 --- a/plugins/email/vendor/egulias/email-validator/src/EmailLexer.php +++ b/plugins/email/vendor/egulias/email-validator/src/EmailLexer.php @@ -3,58 +3,62 @@ namespace Egulias\EmailValidator; use Doctrine\Common\Lexer\AbstractLexer; +use Doctrine\Common\Lexer\Token; +/** + * @extends AbstractLexer + */ class EmailLexer extends AbstractLexer { //ASCII values - const S_EMPTY = null; - const C_NUL = 0; - const S_HTAB = 9; - const S_LF = 10; - const S_CR = 13; - const S_SP = 32; - const EXCLAMATION = 33; - const S_DQUOTE = 34; - const NUMBER_SIGN = 35; - const DOLLAR = 36; - const PERCENTAGE = 37; - const AMPERSAND = 38; - const S_SQUOTE = 39; - const S_OPENPARENTHESIS = 40; - const S_CLOSEPARENTHESIS = 41; - const ASTERISK = 42; - const S_PLUS = 43; - const S_COMMA = 44; - const S_HYPHEN = 45; - const S_DOT = 46; - const S_SLASH = 47; - const S_COLON = 58; - const S_SEMICOLON = 59; - const S_LOWERTHAN = 60; - const S_EQUAL = 61; - const S_GREATERTHAN = 62; - const QUESTIONMARK = 63; - const S_AT = 64; - const S_OPENBRACKET = 91; - const S_BACKSLASH = 92; - const S_CLOSEBRACKET = 93; - const CARET = 94; - const S_UNDERSCORE = 95; - const S_BACKTICK = 96; - const S_OPENCURLYBRACES = 123; - const S_PIPE = 124; - const S_CLOSECURLYBRACES = 125; - const S_TILDE = 126; - const C_DEL = 127; - const INVERT_QUESTIONMARK= 168; - const INVERT_EXCLAMATION = 173; - const GENERIC = 300; - const S_IPV6TAG = 301; - const INVALID = 302; - const CRLF = 1310; - const S_DOUBLECOLON = 5858; - const ASCII_INVALID_FROM = 127; - const ASCII_INVALID_TO = 199; + public const S_EMPTY = null; + public const C_NUL = 0; + public const S_HTAB = 9; + public const S_LF = 10; + public const S_CR = 13; + public const S_SP = 32; + public const EXCLAMATION = 33; + public const S_DQUOTE = 34; + public const NUMBER_SIGN = 35; + public const DOLLAR = 36; + public const PERCENTAGE = 37; + public const AMPERSAND = 38; + public const S_SQUOTE = 39; + public const S_OPENPARENTHESIS = 40; + public const S_CLOSEPARENTHESIS = 41; + public const ASTERISK = 42; + public const S_PLUS = 43; + public const S_COMMA = 44; + public const S_HYPHEN = 45; + public const S_DOT = 46; + public const S_SLASH = 47; + public const S_COLON = 58; + public const S_SEMICOLON = 59; + public const S_LOWERTHAN = 60; + public const S_EQUAL = 61; + public const S_GREATERTHAN = 62; + public const QUESTIONMARK = 63; + public const S_AT = 64; + public const S_OPENBRACKET = 91; + public const S_BACKSLASH = 92; + public const S_CLOSEBRACKET = 93; + public const CARET = 94; + public const S_UNDERSCORE = 95; + public const S_BACKTICK = 96; + public const S_OPENCURLYBRACES = 123; + public const S_PIPE = 124; + public const S_CLOSECURLYBRACES = 125; + public const S_TILDE = 126; + public const C_DEL = 127; + public const INVERT_QUESTIONMARK= 168; + public const INVERT_EXCLAMATION = 173; + public const GENERIC = 300; + public const S_IPV6TAG = 301; + public const INVALID = 302; + public const CRLF = 1310; + public const S_DOUBLECOLON = 5858; + public const ASCII_INVALID_FROM = 127; + public const ASCII_INVALID_TO = 199; /** * US-ASCII visible characters not valid for atext (@link http://tools.ietf.org/html/rfc5322#section-3.2.3) @@ -107,11 +111,11 @@ class EmailLexer extends AbstractLexer '¡' => self::INVERT_EXCLAMATION, ]; - const INVALID_CHARS_REGEX = "/[^\p{S}\p{C}\p{Cc}]+/iu"; + public const INVALID_CHARS_REGEX = "/[^\p{S}\p{C}\p{Cc}]+/iu"; - const VALID_UTF8_REGEX = '/\p{Cc}+/u'; + public const VALID_UTF8_REGEX = '/\p{Cc}+/u'; - const CATCHABLE_PATTERNS = [ + public const CATCHABLE_PATTERNS = [ '[a-zA-Z]+[46]?', //ASCII and domain literal '[^\x00-\x7F]', //UTF-8 '[0-9]+', @@ -121,11 +125,11 @@ class EmailLexer extends AbstractLexer '.', ]; - const NON_CATCHABLE_PATTERNS = [ + public const NON_CATCHABLE_PATTERNS = [ '[\xA0-\xff]+', ]; - const MODIFIERS = 'iu'; + public const MODIFIERS = 'iu'; /** @var bool */ protected $hasInvalidTokens = false; @@ -140,18 +144,20 @@ class EmailLexer extends AbstractLexer /** * The last matched/seen token. * - * @var array + * @var array|Token * * @psalm-suppress NonInvariantDocblockPropertyType - * @psalm-var array{value:string, type:null|int, position:int} - * @psalm-suppress NonInvariantDocblockPropertyType + * @psalm-var array{value:string, type:null|int, position:int}|Token */ public $token; /** * The next token in the input. * - * @var array{position: int, type: int|null|string, value: int|string}|null + * @var array|Token|null + * + * @psalm-suppress NonInvariantDocblockPropertyType + * @psalm-var array{position: int, type: int|null|string, value: int|string}|Token|null */ public $lookahead; @@ -207,11 +213,11 @@ class EmailLexer extends AbstractLexer public function moveNext() : bool { if ($this->hasToRecord && $this->previous === self::$nullToken) { - $this->accumulator .= $this->token['value']; + $this->accumulator .= ((array) $this->token)['value']; } - $this->previous = $this->token; - + $this->previous = (array) $this->token; + if($this->lookahead === null) { $this->lookahead = self::$nullToken; } @@ -219,7 +225,7 @@ class EmailLexer extends AbstractLexer $hasNext = parent::moveNext(); if ($this->hasToRecord) { - $this->accumulator .= $this->token['value']; + $this->accumulator .= ((array) $this->token)['value']; } return $hasNext; diff --git a/plugins/email/vendor/egulias/email-validator/src/EmailParser.php b/plugins/email/vendor/egulias/email-validator/src/EmailParser.php index c78f74a..352eae4 100644 --- a/plugins/email/vendor/egulias/email-validator/src/EmailParser.php +++ b/plugins/email/vendor/egulias/email-validator/src/EmailParser.php @@ -2,7 +2,6 @@ namespace Egulias\EmailValidator; -use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\Result\Result; use Egulias\EmailValidator\Parser\LocalPart; use Egulias\EmailValidator\Parser\DomainPart; @@ -13,7 +12,7 @@ use Egulias\EmailValidator\Result\Reason\NoLocalPart; class EmailParser extends Parser { - const EMAIL_MAX_LENGTH = 254; + public const EMAIL_MAX_LENGTH = 254; /** * @var string diff --git a/plugins/email/vendor/egulias/email-validator/src/MessageIDParser.php b/plugins/email/vendor/egulias/email-validator/src/MessageIDParser.php index fe58b9f..b0b6720 100644 --- a/plugins/email/vendor/egulias/email-validator/src/MessageIDParser.php +++ b/plugins/email/vendor/egulias/email-validator/src/MessageIDParser.php @@ -2,7 +2,6 @@ namespace Egulias\EmailValidator; -use Egulias\EmailValidator\Parser; use Egulias\EmailValidator\Result\Result; use Egulias\EmailValidator\Parser\IDLeftPart; use Egulias\EmailValidator\Parser\IDRightPart; @@ -14,7 +13,7 @@ use Egulias\EmailValidator\Result\Reason\NoLocalPart; class MessageIDParser extends Parser { - const EMAILID_MAX_LENGTH = 254; + public const EMAILID_MAX_LENGTH = 254; /** * @var string @@ -89,4 +88,4 @@ class MessageIDParser extends Parser $this->warnings[EmailTooLong::CODE] = new EmailTooLong(); } } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser.php b/plugins/email/vendor/egulias/email-validator/src/Parser.php index b1905f9..4e5ac7d 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser.php @@ -29,7 +29,7 @@ abstract class Parser public function __construct(EmailLexer $lexer) { - $this->lexer = $lexer; + $this->lexer = $lexer; } public function parse(string $str) : Result @@ -51,7 +51,7 @@ abstract class Parser return $localPartResult; } - $domainPartResult = $this->parseRightFromAt(); + $domainPartResult = $this->parseRightFromAt(); if ($domainPartResult->isInvalid()) { return $domainPartResult; @@ -73,6 +73,6 @@ abstract class Parser $this->lexer->moveNext(); $this->lexer->moveNext(); - return $this->lexer->token['type'] !== EmailLexer::S_AT; + return ((array) $this->lexer->token)['type'] !== EmailLexer::S_AT; } } diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/Comment.php b/plugins/email/vendor/egulias/email-validator/src/Parser/Comment.php index ffa6128..34ef972 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/Comment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/Comment.php @@ -31,15 +31,15 @@ class Comment extends PartParser public function parse() : Result { - if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) { $this->openedParenthesis++; if($this->noClosingParenthesis()) { - return new InvalidEmail(new UnclosedComment(), $this->lexer->token['value']); + return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']); } } - if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { - return new InvalidEmail(new UnOpenedComment(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS) { + return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']); } $this->warnings[WarningComment::CODE] = new WarningComment(); @@ -58,9 +58,10 @@ class Comment extends PartParser } if($this->openedParenthesis >= 1) { - return new InvalidEmail(new UnclosedComment(), $this->lexer->token['value']); - } else if ($this->openedParenthesis < 0) { - return new InvalidEmail(new UnOpenedComment(), $this->lexer->token['value']); + return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']); + } + if ($this->openedParenthesis < 0) { + return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']); } $finalValidations = $this->commentStrategy->endOfLoopValidations($this->lexer); @@ -77,7 +78,7 @@ class Comment extends PartParser private function warnEscaping() : bool { //Backslash found - if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) { + if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) { return false; } @@ -86,12 +87,12 @@ class Comment extends PartParser } $this->warnings[QuotedPart::CODE] = - new QuotedPart($this->lexer->getPrevious()['type'], $this->lexer->token['type']); + new QuotedPart($this->lexer->getPrevious()['type'], ((array) $this->lexer->token)['type']); return true; } - private function noClosingParenthesis() : bool + private function noClosingParenthesis() : bool { try { $this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS); @@ -100,4 +101,4 @@ class Comment extends PartParser return true; } } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php index c388efd..410032f 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php @@ -15,4 +15,4 @@ interface CommentStrategy public function endOfLoopValidations(EmailLexer $lexer) : Result; public function getWarnings() : array; -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php index b34ce29..17b686b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php @@ -23,7 +23,7 @@ class DomainComment implements CommentStrategy { //test for end of string if (!$lexer->isNextToken(EmailLexer::S_DOT)) { - return new InvalidEmail(new ExpectingATEXT('DOT not found near CLOSEPARENTHESIS'), $lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT('DOT not found near CLOSEPARENTHESIS'), ((array) $lexer->token)['value']); } //add warning //Address is valid within the message but cannot be used unmodified for the envelope @@ -34,4 +34,4 @@ class DomainComment implements CommentStrategy { return []; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php index 73bc7b2..179802b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php @@ -24,7 +24,7 @@ class LocalComment implements CommentStrategy public function endOfLoopValidations(EmailLexer $lexer) : Result { if (!$lexer->isNextToken(EmailLexer::S_AT)) { - return new InvalidEmail(new ExpectingATEXT('ATEX is not expected after closing comments'), $lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT('ATEX is not expected after closing comments'), ((array) $lexer->token)['value']); } $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt(); return new ValidEmail(); @@ -34,4 +34,4 @@ class LocalComment implements CommentStrategy { return $this->warnings; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/DomainLiteral.php b/plugins/email/vendor/egulias/email-validator/src/Parser/DomainLiteral.php index 4e5b8bf..1048634 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/DomainLiteral.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/DomainLiteral.php @@ -22,9 +22,9 @@ use Egulias\EmailValidator\Warning\DomainLiteral as WarningDomainLiteral; class DomainLiteral extends PartParser { - const IPV4_REGEX = '/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'; + public const IPV4_REGEX = '/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'; - const OBSOLETE_WARNINGS = [ + public const OBSOLETE_WARNINGS = [ EmailLexer::INVALID, EmailLexer::C_DEL, EmailLexer::S_LF, @@ -39,14 +39,14 @@ class DomainLiteral extends PartParser $addressLiteral = ''; do { - if ($this->lexer->token['type'] === EmailLexer::C_NUL) { - return new InvalidEmail(new ExpectingDTEXT(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) { + return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']); } $this->addObsoleteWarnings(); if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENBRACKET, EmailLexer::S_OPENBRACKET))) { - return new InvalidEmail(new ExpectingDTEXT(), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']); } if ($this->lexer->isNextTokenAny( @@ -57,21 +57,21 @@ class DomainLiteral extends PartParser } if ($this->lexer->isNextToken(EmailLexer::S_CR)) { - return new InvalidEmail(new CRNoLF(), $this->lexer->token['value']); + return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) { - return new InvalidEmail(new UnusualElements($this->lexer->token['value']), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH) { + return new InvalidEmail(new UnusualElements(((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_IPV6TAG) { $IPv6TAG = true; } - if ($this->lexer->token['type'] === EmailLexer::S_CLOSEBRACKET) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEBRACKET) { break; } - $addressLiteral .= $this->lexer->token['value']; + $addressLiteral .= ((array) $this->lexer->token)['value']; } while ($this->lexer->moveNext()); @@ -144,7 +144,7 @@ class DomainLiteral extends PartParser $this->warnings[IPV6Deprecated::CODE] = new IPV6Deprecated(); } } - + public function convertIPv4ToIPv6(string $addressLiteralIPv4) : string { $matchesIP = []; @@ -189,7 +189,7 @@ class DomainLiteral extends PartParser private function addObsoleteWarnings() : void { - if(in_array($this->lexer->token['type'], self::OBSOLETE_WARNINGS)) { + if(in_array(((array) $this->lexer->token)['type'], self::OBSOLETE_WARNINGS)) { $this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT(); } } @@ -208,4 +208,4 @@ class DomainLiteral extends PartParser } } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/DomainPart.php b/plugins/email/vendor/egulias/email-validator/src/Parser/DomainPart.php index f171740..84a4180 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/DomainPart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/DomainPart.php @@ -2,6 +2,7 @@ namespace Egulias\EmailValidator\Parser; +use Doctrine\Common\Lexer\Token; use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\Warning\TLD; use Egulias\EmailValidator\Result\Result; @@ -24,8 +25,8 @@ use Egulias\EmailValidator\Parser\DomainLiteral as DomainLiteralParser; class DomainPart extends PartParser { - const DOMAIN_MAX_LENGTH = 253; - const LABEL_MAX_LENGTH = 63; + public const DOMAIN_MAX_LENGTH = 253; + public const LABEL_MAX_LENGTH = 63; /** * @var string @@ -49,8 +50,8 @@ class DomainPart extends PartParser return $domainChecks; } - if ($this->lexer->token['type'] === EmailLexer::S_AT) { - return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_AT) { + return new InvalidEmail(new ConsecutiveAt(), ((array) $this->lexer->token)['value']); } $result = $this->doParseDomainPart(); @@ -68,7 +69,7 @@ class DomainPart extends PartParser $length = strlen($this->domainPart); if ($length > self::DOMAIN_MAX_LENGTH) { - return new InvalidEmail(new DomainTooLong(), $this->lexer->token['value']); + return new InvalidEmail(new DomainTooLong(), ((array) $this->lexer->token)['value']); } return new ValidEmail(); @@ -78,13 +79,13 @@ class DomainPart extends PartParser { $prev = $this->lexer->getPrevious(); if ($prev['type'] === EmailLexer::S_DOT) { - return new InvalidEmail(new DotAtEnd(), $this->lexer->token['value']); + return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']); } if ($prev['type'] === EmailLexer::S_HYPHEN) { return new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), $prev['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_SP) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_SP) { return new InvalidEmail(new CRLFAtTheEnd(), $prev['value']); } return new ValidEmail(); @@ -97,13 +98,13 @@ class DomainPart extends PartParser if ($invalidTokens->isInvalid()) { return $invalidTokens; } - + $missingDomain = $this->checkEmptyDomain(); if ($missingDomain->isInvalid()) { return $missingDomain; } - if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) { $this->warnings[DeprecatedComment::CODE] = new DeprecatedComment(); } return new ValidEmail(); @@ -111,12 +112,12 @@ class DomainPart extends PartParser private function checkEmptyDomain() : Result { - $thereIsNoDomain = $this->lexer->token['type'] === EmailLexer::S_EMPTY || - ($this->lexer->token['type'] === EmailLexer::S_SP && + $thereIsNoDomain = ((array) $this->lexer->token)['type'] === EmailLexer::S_EMPTY || + (((array) $this->lexer->token)['type'] === EmailLexer::S_SP && !$this->lexer->isNextToken(EmailLexer::GENERIC)); if ($thereIsNoDomain) { - return new InvalidEmail(new NoDomainPart(), $this->lexer->token['value']); + return new InvalidEmail(new NoDomainPart(), ((array) $this->lexer->token)['value']); } return new ValidEmail(); @@ -124,11 +125,11 @@ class DomainPart extends PartParser private function checkInvalidTokensAfterAT() : Result { - if ($this->lexer->token['type'] === EmailLexer::S_DOT) { - return new InvalidEmail(new DotAtStart(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT) { + return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN) { - return new InvalidEmail(new DomainHyphened('After AT'), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN) { + return new InvalidEmail(new DomainHyphened('After AT'), ((array) $this->lexer->token)['value']); } return new ValidEmail(); } @@ -155,8 +156,8 @@ class DomainPart extends PartParser return $notAllowedChars; } - if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS || - $this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS || + ((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { $hasComments = true; $commentsResult = $this->parseComments(); @@ -171,7 +172,7 @@ class DomainPart extends PartParser return $dotsResult; } - if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET) { $literalResult = $this->parseDomainLiteral(); $this->addTLDWarnings($tldMissing); @@ -188,9 +189,9 @@ class DomainPart extends PartParser return $FwsResult; } - $domain .= $this->lexer->token['value']; + $domain .= ((array) $this->lexer->token)['value']; - if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::GENERIC)) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::GENERIC)) { $tldMissing = false; } @@ -200,7 +201,7 @@ class DomainPart extends PartParser } $this->lexer->moveNext(); - } while (null !== $this->lexer->token['type']); + } while (null !== ((array) $this->lexer->token)['type']); $labelCheck = $this->checkLabelLength(true); if ($labelCheck->isInvalid()) { @@ -212,11 +213,14 @@ class DomainPart extends PartParser return new ValidEmail(); } - private function checkNotAllowedChars(array $token) : Result + /** + * @psalm-param array|Token $token + */ + private function checkNotAllowedChars($token) : Result { $notAllowed = [EmailLexer::S_BACKSLASH => true, EmailLexer::S_SLASH=> true]; - if (isset($notAllowed[$token['type']])) { - return new InvalidEmail(new CharNotAllowed(), $token['value']); + if (isset($notAllowed[((array) $token)['type']])) { + return new InvalidEmail(new CharNotAllowed(), ((array) $token)['value']); } return new ValidEmail(); } @@ -229,7 +233,7 @@ class DomainPart extends PartParser try { $this->lexer->find(EmailLexer::S_CLOSEBRACKET); } catch (\RuntimeException $e) { - return new InvalidEmail(new ExpectingDomainLiteralClose(), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingDomainLiteralClose(), ((array) $this->lexer->token)['value']); } $domainLiteralParser = new DomainLiteralParser($this->lexer); @@ -240,17 +244,17 @@ class DomainPart extends PartParser protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result { - if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET && $prev['type'] !== EmailLexer::S_AT) { - return new InvalidEmail(new ExpectingATEXT('OPENBRACKET not after AT'), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET && $prev['type'] !== EmailLexer::S_AT) { + return new InvalidEmail(new ExpectingATEXT('OPENBRACKET not after AT'), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { - return new InvalidEmail(new DomainHyphened('Hypen found near DOT'), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new DomainHyphened('Hypen found near DOT'), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::GENERIC)) { - return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), ((array) $this->lexer->token)['value']); } return $this->validateTokens($hasComments); @@ -269,8 +273,8 @@ class DomainPart extends PartParser $validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true; } - if (!isset($validDomainTokens[$this->lexer->token['type']])) { - return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']); + if (!isset($validDomainTokens[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); } return new ValidEmail(); @@ -278,13 +282,13 @@ class DomainPart extends PartParser private function checkLabelLength(bool $isEndOfDomain = false) : Result { - if ($this->lexer->token['type'] === EmailLexer::S_DOT || $isEndOfDomain) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT || $isEndOfDomain) { if ($this->isLabelTooLong($this->label)) { - return new InvalidEmail(new LabelTooLong(), $this->lexer->token['value']); + return new InvalidEmail(new LabelTooLong(), ((array) $this->lexer->token)['value']); } $this->label = ''; } - $this->label .= $this->lexer->token['value']; + $this->label .= ((array) $this->lexer->token)['value']; return new ValidEmail(); } diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/DoubleQuote.php b/plugins/email/vendor/egulias/email-validator/src/Parser/DoubleQuote.php index 8b83273..d722292 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/DoubleQuote.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/DoubleQuote.php @@ -2,7 +2,6 @@ namespace Egulias\EmailValidator\Parser; use Egulias\EmailValidator\EmailLexer; -use Egulias\EmailValidator\Parser\Parser; use Egulias\EmailValidator\Result\ValidEmail; use Egulias\EmailValidator\Result\InvalidEmail; use Egulias\EmailValidator\Warning\CFWSWithFWS; @@ -31,24 +30,24 @@ class DoubleQuote extends PartParser EmailLexer::S_CR => true, EmailLexer::S_LF => true ]; - + $setSpecialsWarning = true; $this->lexer->moveNext(); - while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && null !== $this->lexer->token['type']) { - if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) { + while (((array) $this->lexer->token)['type'] !== EmailLexer::S_DQUOTE && null !== ((array) $this->lexer->token)['type']) { + if (isset($special[((array) $this->lexer->token)['type']]) && $setSpecialsWarning) { $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); $setSpecialsWarning = false; } - if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) { $this->lexer->moveNext(); } $this->lexer->moveNext(); - if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) { - return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), $this->lexer->token['value']); + if (!$this->escaped() && isset($invalid[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']); } } @@ -60,7 +59,7 @@ class DoubleQuote extends PartParser } if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) { - return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']); } return new ValidEmail(); @@ -72,17 +71,17 @@ class DoubleQuote extends PartParser if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) { $description = 'https://tools.ietf.org/html/rfc5322#section-3.2.4 - quoted string should be a unit'; - return new InvalidEmail(new ExpectingATEXT($description), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT($description), ((array) $this->lexer->token)['value']); } try { $this->lexer->find(EmailLexer::S_DQUOTE); } catch (\Exception $e) { - return new InvalidEmail(new UnclosedQuotedString(), $this->lexer->token['value']); + return new InvalidEmail(new UnclosedQuotedString(), ((array) $this->lexer->token)['value']); } - $this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], $this->lexer->token['value']); + $this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], ((array) $this->lexer->token)['value']); return new ValidEmail(); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php b/plugins/email/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php index da17d43..be4b05b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php @@ -15,7 +15,7 @@ use Egulias\EmailValidator\Result\ValidEmail; class FoldingWhiteSpace extends PartParser { - const FWS_TYPES = [ + public const FWS_TYPES = [ EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::S_CR, @@ -36,16 +36,16 @@ class FoldingWhiteSpace extends PartParser return $resultCRLF; } - if ($this->lexer->token['type'] === EmailLexer::S_CR) { - return new InvalidEmail(new CRNoLF(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CR) { + return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']); } if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) { - return new InvalidEmail(new AtextAfterCFWS(), $this->lexer->token['value']); + return new InvalidEmail(new AtextAfterCFWS(), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::C_NUL) { - return new InvalidEmail(new ExpectingCTEXT(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_LF || ((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) { + return new InvalidEmail(new ExpectingCTEXT(), ((array) $this->lexer->token)['value']); } if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) { @@ -59,28 +59,28 @@ class FoldingWhiteSpace extends PartParser protected function checkCRLFInFWS() : Result { - if ($this->lexer->token['type'] !== EmailLexer::CRLF) { + if (((array) $this->lexer->token)['type'] !== EmailLexer::CRLF) { return new ValidEmail(); } if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { - return new InvalidEmail(new CRLFX2(), $this->lexer->token['value']); + return new InvalidEmail(new CRLFX2(), ((array) $this->lexer->token)['value']); } //this has no coverage. Condition is repeated from above one if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { - return new InvalidEmail(new CRLFAtTheEnd(), $this->lexer->token['value']); + return new InvalidEmail(new CRLFAtTheEnd(), ((array) $this->lexer->token)['value']); } return new ValidEmail(); } - + protected function isFWS() : bool { if ($this->escaped()) { return false; } - return in_array($this->lexer->token['type'], self::FWS_TYPES); + return in_array(((array) $this->lexer->token)['type'], self::FWS_TYPES); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/IDLeftPart.php b/plugins/email/vendor/egulias/email-validator/src/Parser/IDLeftPart.php index abb4982..3b01ae2 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/IDLeftPart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/IDLeftPart.php @@ -3,7 +3,6 @@ namespace Egulias\EmailValidator\Parser; use Egulias\EmailValidator\Result\Result; -use Egulias\EmailValidator\Parser\LocalPart; use Egulias\EmailValidator\Result\InvalidEmail; use Egulias\EmailValidator\Result\Reason\CommentsInIDRight; @@ -11,6 +10,6 @@ class IDLeftPart extends LocalPart { protected function parseComments(): Result { - return new InvalidEmail(new CommentsInIDRight(), $this->lexer->token['value']); + return new InvalidEmail(new CommentsInIDRight(), ((array) $this->lexer->token)['value']); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/IDRightPart.php b/plugins/email/vendor/egulias/email-validator/src/Parser/IDRightPart.php index 2432562..d19e05a 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/IDRightPart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/IDRightPart.php @@ -20,10 +20,10 @@ class IDRightPart extends DomainPart EmailLexer::S_GREATERTHAN => true, EmailLexer::S_LOWERTHAN => true, ]; - - if (isset($invalidDomainTokens[$this->lexer->token['type']])) { - return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']); + + if (isset($invalidDomainTokens[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); } return new ValidEmail(); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/LocalPart.php b/plugins/email/vendor/egulias/email-validator/src/Parser/LocalPart.php index 90f01a5..3f2ef7d 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/LocalPart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/LocalPart.php @@ -15,7 +15,7 @@ use Egulias\EmailValidator\Parser\CommentStrategy\LocalComment; class LocalPart extends PartParser { - const INVALID_TOKENS = [ + public const INVALID_TOKENS = [ EmailLexer::S_COMMA => EmailLexer::S_COMMA, EmailLexer::S_CLOSEBRACKET => EmailLexer::S_CLOSEBRACKET, EmailLexer::S_OPENBRACKET => EmailLexer::S_OPENBRACKET, @@ -36,12 +36,12 @@ class LocalPart extends PartParser { $this->lexer->startRecording(); - while ($this->lexer->token['type'] !== EmailLexer::S_AT && null !== $this->lexer->token['type']) { + while (((array) $this->lexer->token)['type'] !== EmailLexer::S_AT && null !== ((array) $this->lexer->token)['type']) { if ($this->hasDotAtStart()) { - return new InvalidEmail(new DotAtStart(), $this->lexer->token['value']); + return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_DQUOTE) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DQUOTE) { $dquoteParsingResult = $this->parseDoubleQuote(); //Invalid double quote parsing @@ -50,8 +50,8 @@ class LocalPart extends PartParser } } - if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS || - $this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS || + ((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { $commentsResult = $this->parseComments(); //Invalid comment parsing @@ -60,14 +60,14 @@ class LocalPart extends PartParser } } - if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { - return new InvalidEmail(new ConsecutiveDot(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']); } - if ($this->lexer->token['type'] === EmailLexer::S_DOT && + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_AT) ) { - return new InvalidEmail(new DotAtEnd(), $this->lexer->token['value']); + return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']); } $resultEscaping = $this->validateEscaping(); @@ -99,8 +99,8 @@ class LocalPart extends PartParser protected function validateTokens(bool $hasComments) : Result { - if (isset(self::INVALID_TOKENS[$this->lexer->token['type']])) { - return new InvalidEmail(new ExpectingATEXT('Invalid token found'), $this->lexer->token['value']); + if (isset(self::INVALID_TOKENS[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token found'), ((array) $this->lexer->token)['value']); } return new ValidEmail(); } @@ -110,7 +110,7 @@ class LocalPart extends PartParser return $this->localPart; } - private function parseLocalFWS() : Result + private function parseLocalFWS() : Result { $foldingWS = new FoldingWhiteSpace($this->lexer); $resultFWS = $foldingWS->parse(); @@ -122,7 +122,7 @@ class LocalPart extends PartParser private function hasDotAtStart() : bool { - return $this->lexer->token['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type']; + return ((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type']; } private function parseDoubleQuote() : Result @@ -148,12 +148,12 @@ class LocalPart extends PartParser private function validateEscaping() : Result { //Backslash found - if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) { + if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) { return new ValidEmail(); } if ($this->lexer->isNextToken(EmailLexer::GENERIC)) { - return new InvalidEmail(new ExpectingATEXT('Found ATOM after escaping'), $this->lexer->token['value']); + return new InvalidEmail(new ExpectingATEXT('Found ATOM after escaping'), ((array) $this->lexer->token)['value']); } if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) { @@ -162,4 +162,4 @@ class LocalPart extends PartParser return new ValidEmail(); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Parser/PartParser.php b/plugins/email/vendor/egulias/email-validator/src/Parser/PartParser.php index fd65fc5..7fc6d7b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Parser/PartParser.php +++ b/plugins/email/vendor/egulias/email-validator/src/Parser/PartParser.php @@ -45,8 +45,8 @@ abstract class PartParser protected function checkConsecutiveDots() : Result { - if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { - return new InvalidEmail(new ConsecutiveDot(), $this->lexer->token['value']); + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']); } return new ValidEmail(); @@ -58,6 +58,6 @@ abstract class PartParser return $previous && $previous['type'] === EmailLexer::S_BACKSLASH && - $this->lexer->token['type'] !== EmailLexer::GENERIC; + ((array) $this->lexer->token)['type'] !== EmailLexer::GENERIC; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/InvalidEmail.php b/plugins/email/vendor/egulias/email-validator/src/Result/InvalidEmail.php index 3d85e15..180f4d8 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/InvalidEmail.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/InvalidEmail.php @@ -6,7 +6,7 @@ use Egulias\EmailValidator\Result\Reason\Reason; class InvalidEmail implements Result { - private $token; + private $token; /** * @var Reason */ @@ -43,4 +43,4 @@ class InvalidEmail implements Result return $this->reason; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php index 76015a2..96e2284 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php @@ -13,4 +13,4 @@ class AtextAfterCFWS implements Reason { return 'ATEXT found after CFWS'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php index a0b66e7..185b9eb 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php @@ -4,8 +4,8 @@ namespace Egulias\EmailValidator\Result\Reason; class CRLFAtTheEnd implements Reason { - const CODE = 149; - const REASON = "CRLF at the end"; + public const CODE = 149; + public const REASON = "CRLF at the end"; public function code() : int { diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php index 45999b3..7840cc7 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php @@ -13,4 +13,4 @@ class CharNotAllowed implements Reason { return "Character not allowed"; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php index 93d3b56..055f145 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php @@ -13,4 +13,4 @@ class CommaInDomain implements Reason { return "Comma ',' is not allowed in domain part"; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php index 43a7cf7..6567a11 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php @@ -13,4 +13,4 @@ class CommentsInIDRight implements Reason { return 'Comments are not allowed in IDRight for message-id'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php index 1751987..8541c92 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php @@ -10,4 +10,4 @@ abstract class DetailedReason implements Reason { $this->detailedDescription = $details; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php index 55f44bb..bcaefb6 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php @@ -13,4 +13,4 @@ class DomainAcceptsNoMail implements Reason { return 'Domain accepts no mail (Null MX, RFC7505)'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php index 8b1135d..ffed86c 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php @@ -23,4 +23,4 @@ class ExceptionFound implements Reason { return $this->exception->getMessage(); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php index 7deffca..525e7ac 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php @@ -13,4 +13,4 @@ class ExpectingDomainLiteralClose implements Reason { return "Closing bracket ']' for domain literal not found"; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php index bc7c5d5..c464767 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php @@ -13,4 +13,4 @@ class LocalOrReservedDomain implements Reason { return 'Local, mDNS or reserved domain (RFC2606, RFC6762)'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php index e217d02..2c966c2 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php @@ -13,4 +13,4 @@ class NoDNSRecord implements Reason { return 'No MX or A DSN record was found for this email'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/Reason.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/Reason.php index e6810b9..786eb9b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/Reason.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/Reason.php @@ -13,4 +13,4 @@ interface Reason * Short description of the result, human readable. */ public function description() : string; -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php index c76a584..b0a4316 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php @@ -13,4 +13,4 @@ class UnOpenedComment implements Reason { return 'Missing opening comment parentheses - https://tools.ietf.org/html/rfc5322#section-3.2.2'; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php index 03873dc..861f3bc 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php @@ -23,4 +23,4 @@ class UnusualElements implements Reason { return 'Unusual element found, wourld render invalid in majority of cases. Element found: ' . $this->element; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/Result.php b/plugins/email/vendor/egulias/email-validator/src/Result/Result.php index 1e16bcc..fd13e6c 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/Result.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/Result.php @@ -24,4 +24,4 @@ interface Result * Code for user land to act upon. */ public function code() : int; -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/SpoofEmail.php b/plugins/email/vendor/egulias/email-validator/src/Result/SpoofEmail.php index 9f010de..0ad449b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/SpoofEmail.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/SpoofEmail.php @@ -1,7 +1,6 @@ reason = new ReasonSpoofEmail(); parent::__construct($this->reason, ''); } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Result/ValidEmail.php b/plugins/email/vendor/egulias/email-validator/src/Result/ValidEmail.php index 4f3693a..fdc882f 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Result/ValidEmail.php +++ b/plugins/email/vendor/egulias/email-validator/src/Result/ValidEmail.php @@ -24,4 +24,4 @@ class ValidEmail implements Result return 0; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php index 4e0041b..4882b80 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php +++ b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php @@ -2,7 +2,6 @@ namespace Egulias\EmailValidator\Validation; -use Egulias\EmailValidator\Validation\DNSGetRecordWrapper; use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\Result\InvalidEmail; use Egulias\EmailValidator\Result\Reason\DomainAcceptsNoMail; @@ -22,7 +21,7 @@ class DNSCheckValidation implements EmailValidation * Reserved Top Level DNS Names (https://tools.ietf.org/html/rfc2606#section-2), * mDNS and private DNS Namespaces (https://tools.ietf.org/html/rfc6762#appendix-G) */ - const RESERVED_DNS_TOP_LEVEL_NAMES = [ + public const RESERVED_DNS_TOP_LEVEL_NAMES = [ // Reserved Top Level DNS Names 'test', 'example', @@ -61,7 +60,7 @@ class DNSCheckValidation implements EmailValidation */ private $dnsGetRecord; - public function __construct(DNSGetRecordWrapper $dnsGetRecord = null) + public function __construct(?DNSGetRecordWrapper $dnsGetRecord = null) { if (!function_exists('idn_to_ascii')) { throw new \LogicException(sprintf('The %s class requires the Intl extension.', __CLASS__)); @@ -189,4 +188,4 @@ class DNSCheckValidation implements EmailValidation return true; } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php index ec6fe4b..f493c57 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php +++ b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php @@ -25,4 +25,4 @@ class DNSGetRecordWrapper restore_error_handler(); } } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSRecords.php b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSRecords.php index afda213..b026a2d 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Validation/DNSRecords.php +++ b/plugins/email/vendor/egulias/email-validator/src/Validation/DNSRecords.php @@ -32,4 +32,4 @@ class DNSRecords } -} \ No newline at end of file +} diff --git a/plugins/email/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php b/plugins/email/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php index ee7c41a..4a031b1 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php +++ b/plugins/email/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php @@ -9,7 +9,7 @@ class EmptyValidationList extends \InvalidArgumentException /** * @param int $code */ - public function __construct($code = 0, Exception $previous = null) + public function __construct($code = 0, ?Exception $previous = null) { parent::__construct("Empty validation list is not allowed", $code, $previous); } diff --git a/plugins/email/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php b/plugins/email/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php index 90d4f0d..abafe75 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php +++ b/plugins/email/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php @@ -13,13 +13,13 @@ class MultipleValidationWithAnd implements EmailValidation * If one of validations fails, the remaining validations will be skipped. * This means MultipleErrors will only contain a single error, the first found. */ - const STOP_ON_ERROR = 0; + public const STOP_ON_ERROR = 0; /** * All of validations will be invoked even if one of them got failure. * So MultipleErrors will contain all causes. */ - const ALLOW_ALL_ERRORS = 1; + public const ALLOW_ALL_ERRORS = 1; /** * @var EmailValidation[] diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/AddressLiteral.php b/plugins/email/vendor/egulias/email-validator/src/Warning/AddressLiteral.php index 77e70f7..474ff0e 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/AddressLiteral.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/AddressLiteral.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class AddressLiteral extends Warning { - const CODE = 12; + public const CODE = 12; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php b/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php index be43bbe..8bac12b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class CFWSNearAt extends Warning { - const CODE = 49; + public const CODE = 49; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php b/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php index dea3450..ba57601 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class CFWSWithFWS extends Warning { - const CODE = 18; + public const CODE = 18; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/Comment.php b/plugins/email/vendor/egulias/email-validator/src/Warning/Comment.php index 704c290..6508295 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/Comment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/Comment.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class Comment extends Warning { - const CODE = 17; + public const CODE = 17; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php b/plugins/email/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php index ad43bd7..a257807 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class DeprecatedComment extends Warning { - const CODE = 37; + public const CODE = 37; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/DomainLiteral.php b/plugins/email/vendor/egulias/email-validator/src/Warning/DomainLiteral.php index 6f36b5e..034388c 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/DomainLiteral.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/DomainLiteral.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class DomainLiteral extends Warning { - const CODE = 70; + public const CODE = 70; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/EmailTooLong.php b/plugins/email/vendor/egulias/email-validator/src/Warning/EmailTooLong.php index 497309d..d25ad12 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/EmailTooLong.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/EmailTooLong.php @@ -6,7 +6,7 @@ use Egulias\EmailValidator\EmailParser; class EmailTooLong extends Warning { - const CODE = 66; + public const CODE = 66; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php index ba2fcc0..3ecd5bc 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6BadChar extends Warning { - const CODE = 74; + public const CODE = 74; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php index 41afa78..3f0c2f2 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6ColonEnd extends Warning { - const CODE = 77; + public const CODE = 77; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php index 1bf754e..742fb3b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6ColonStart extends Warning { - const CODE = 76; + public const CODE = 76; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php index d752caa..59c3037 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6Deprecated extends Warning { - const CODE = 13; + public const CODE = 13; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php index 4f82394..d406602 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6DoubleColon extends Warning { - const CODE = 73; + public const CODE = 73; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php index a59d317..551bc3a 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6GroupCount extends Warning { - const CODE = 72; + public const CODE = 72; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php index 936274c..7f8a410 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class IPV6MaxGroups extends Warning { - const CODE = 75; + public const CODE = 75; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/LocalTooLong.php b/plugins/email/vendor/egulias/email-validator/src/Warning/LocalTooLong.php index 0d08d8b..b46b874 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/LocalTooLong.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/LocalTooLong.php @@ -4,8 +4,8 @@ namespace Egulias\EmailValidator\Warning; class LocalTooLong extends Warning { - const CODE = 64; - const LOCAL_PART_LENGTH = 64; + public const CODE = 64; + public const LOCAL_PART_LENGTH = 64; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php b/plugins/email/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php index b3c21a1..bddb96b 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class NoDNSMXRecord extends Warning { - const CODE = 6; + public const CODE = 6; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php b/plugins/email/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php index 10f19e3..412fd49 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class ObsoleteDTEXT extends Warning { - const CODE = 71; + public const CODE = 71; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedPart.php b/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedPart.php index 36a4265..afa1f9e 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedPart.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedPart.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class QuotedPart extends Warning { - const CODE = 36; + public const CODE = 36; /** * @param scalar $prevToken diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedString.php b/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedString.php index 817e4e8..c152ec2 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedString.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/QuotedString.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class QuotedString extends Warning { - const CODE = 11; + public const CODE = 11; /** * @param scalar $prevToken diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/TLD.php b/plugins/email/vendor/egulias/email-validator/src/Warning/TLD.php index 2338b9f..10cec28 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/TLD.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/TLD.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; class TLD extends Warning { - const CODE = 9; + public const CODE = 9; public function __construct() { diff --git a/plugins/email/vendor/egulias/email-validator/src/Warning/Warning.php b/plugins/email/vendor/egulias/email-validator/src/Warning/Warning.php index a0158a2..8b39d64 100644 --- a/plugins/email/vendor/egulias/email-validator/src/Warning/Warning.php +++ b/plugins/email/vendor/egulias/email-validator/src/Warning/Warning.php @@ -4,7 +4,7 @@ namespace Egulias\EmailValidator\Warning; abstract class Warning { - const CODE = 0; + public const CODE = 0; /** * @var string diff --git a/plugins/email/vendor/symfony/amqp-messenger/LICENSE b/plugins/email/vendor/symfony/amqp-messenger/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/LICENSE +++ b/plugins/email/vendor/symfony/amqp-messenger/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpReceiver.php b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpReceiver.php index 141ab8c..3cadcc1 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpReceiver.php +++ b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpReceiver.php @@ -30,7 +30,7 @@ class AmqpReceiver implements QueueReceiverInterface, MessageCountAwareInterface private $serializer; private $connection; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); diff --git a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpSender.php b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpSender.php index 5fdfdff..c0c3e9b 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpSender.php +++ b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpSender.php @@ -29,7 +29,7 @@ class AmqpSender implements SenderInterface private $serializer; private $connection; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); diff --git a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpStamp.php b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpStamp.php index 5835bdc..ba09690 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpStamp.php +++ b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpStamp.php @@ -24,7 +24,7 @@ final class AmqpStamp implements NonSendableStampInterface private $attributes; private $isRetryAttempt = false; - public function __construct(string $routingKey = null, int $flags = \AMQP_NOPARAM, array $attributes = []) + public function __construct(?string $routingKey = null, int $flags = \AMQP_NOPARAM, array $attributes = []) { $this->routingKey = $routingKey; $this->flags = $flags; @@ -46,7 +46,7 @@ final class AmqpStamp implements NonSendableStampInterface return $this->attributes; } - public static function createFromAmqpEnvelope(\AMQPEnvelope $amqpEnvelope, self $previousStamp = null, string $retryRoutingKey = null): self + public static function createFromAmqpEnvelope(\AMQPEnvelope $amqpEnvelope, ?self $previousStamp = null, ?string $retryRoutingKey = null): self { $attr = $previousStamp->attributes ?? []; @@ -79,7 +79,7 @@ final class AmqpStamp implements NonSendableStampInterface return $this->isRetryAttempt; } - public static function createWithAttributes(array $attributes, self $previousStamp = null): self + public static function createWithAttributes(array $attributes, ?self $previousStamp = null): self { return new self( $previousStamp->routingKey ?? null, diff --git a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpTransport.php b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpTransport.php index 9ffda47..52b5299 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpTransport.php +++ b/plugins/email/vendor/symfony/amqp-messenger/Transport/AmqpTransport.php @@ -29,7 +29,7 @@ class AmqpTransport implements QueueReceiverInterface, TransportInterface, Setup private $receiver; private $sender; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); diff --git a/plugins/email/vendor/symfony/amqp-messenger/Transport/Connection.php b/plugins/email/vendor/symfony/amqp-messenger/Transport/Connection.php index e5a9d59..3ea7784 100644 --- a/plugins/email/vendor/symfony/amqp-messenger/Transport/Connection.php +++ b/plugins/email/vendor/symfony/amqp-messenger/Transport/Connection.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Messenger\Bridge\Amqp\Transport; use Symfony\Component\Messenger\Exception\InvalidArgumentException; use Symfony\Component\Messenger\Exception\LogicException; +use Symfony\Component\Messenger\Exception\TransportException; /** * An AMQP connection. @@ -32,6 +33,9 @@ class Connection 'x-message-ttl', ]; + /** + * @see https://github.com/php-amqp/php-amqp/blob/master/amqp_connection_resource.h + */ private const AVAILABLE_OPTIONS = [ 'host', 'port', @@ -53,6 +57,7 @@ class Connection 'write_timeout', 'confirm_timeout', 'connect_timeout', + 'rpc_timeout', 'cacert', 'cert', 'key', @@ -102,7 +107,12 @@ class Connection */ private $amqpDelayExchange; - public function __construct(array $connectionOptions, array $exchangeOptions, array $queuesOptions, AmqpFactory $amqpFactory = null) + /** + * @var int + */ + private $lastActivityTime = 0; + + public function __construct(array $connectionOptions, array $exchangeOptions, array $queuesOptions, ?AmqpFactory $amqpFactory = null) { if (!\extension_loaded('amqp')) { throw new LogicException(sprintf('You cannot use the "%s" as the "amqp" extension is not installed.', __CLASS__)); @@ -166,26 +176,26 @@ class Connection * * verify: Enable or disable peer verification. If peer verification is enabled then the common name in the * server certificate must match the server name. Peer verification is enabled by default. */ - public static function fromDsn(string $dsn, array $options = [], AmqpFactory $amqpFactory = null): self + public static function fromDsn(string $dsn, array $options = [], ?AmqpFactory $amqpFactory = null): self { - if (false === $parsedUrl = parse_url($dsn)) { + if (false === $params = parse_url($dsn)) { // this is a valid URI that parse_url cannot handle when you want to pass all parameters as options if (!\in_array($dsn, ['amqp://', 'amqps://'])) { - throw new InvalidArgumentException(sprintf('The given AMQP DSN "%s" is invalid.', $dsn)); + throw new InvalidArgumentException('The given AMQP DSN is invalid.'); } - $parsedUrl = []; + $params = []; } $useAmqps = 0 === strpos($dsn, 'amqps://'); - $pathParts = isset($parsedUrl['path']) ? explode('/', trim($parsedUrl['path'], '/')) : []; + $pathParts = isset($params['path']) ? explode('/', trim($params['path'], '/')) : []; $exchangeName = $pathParts[1] ?? 'messages'; - parse_str($parsedUrl['query'] ?? '', $parsedQuery); + parse_str($params['query'] ?? '', $parsedQuery); $port = $useAmqps ? 5671 : 5672; $amqpOptions = array_replace_recursive([ - 'host' => $parsedUrl['host'] ?? 'localhost', - 'port' => $parsedUrl['port'] ?? $port, + 'host' => $params['host'] ?? 'localhost', + 'port' => $params['port'] ?? $port, 'vhost' => isset($pathParts[0]) ? urldecode($pathParts[0]) : '/', 'exchange' => [ 'name' => $exchangeName, @@ -194,12 +204,12 @@ class Connection self::validateOptions($amqpOptions); - if (isset($parsedUrl['user'])) { - $amqpOptions['login'] = urldecode($parsedUrl['user']); + if (isset($params['user'])) { + $amqpOptions['login'] = rawurldecode($params['user']); } - if (isset($parsedUrl['pass'])) { - $amqpOptions['password'] = urldecode($parsedUrl['pass']); + if (isset($params['pass'])) { + $amqpOptions['password'] = rawurldecode($params['pass']); } if (!isset($amqpOptions['queues'])) { @@ -288,7 +298,7 @@ class Connection /** * @throws \AMQPException */ - public function publish(string $body, array $headers = [], int $delayInMs = 0, AmqpStamp $amqpStamp = null): void + public function publish(string $body, array $headers = [], int $delayInMs = 0, ?AmqpStamp $amqpStamp = null): void { $this->clearWhenDisconnected(); @@ -324,7 +334,7 @@ class Connection /** * @throws \AMQPException */ - private function publishWithDelay(string $body, array $headers, int $delay, AmqpStamp $amqpStamp = null) + private function publishWithDelay(string $body, array $headers, int $delay, ?AmqpStamp $amqpStamp = null) { $routingKey = $this->getRoutingKeyForMessage($amqpStamp); $isRetryAttempt = $amqpStamp ? $amqpStamp->isRetryAttempt() : false; @@ -340,13 +350,15 @@ class Connection ); } - private function publishOnExchange(\AMQPExchange $exchange, string $body, string $routingKey = null, array $headers = [], AmqpStamp $amqpStamp = null) + private function publishOnExchange(\AMQPExchange $exchange, string $body, ?string $routingKey = null, array $headers = [], ?AmqpStamp $amqpStamp = null) { $attributes = $amqpStamp ? $amqpStamp->getAttributes() : []; $attributes['headers'] = array_merge($attributes['headers'] ?? [], $headers); $attributes['delivery_mode'] = $attributes['delivery_mode'] ?? 2; $attributes['timestamp'] = $attributes['timestamp'] ?? time(); + $this->lastActivityTime = time(); + $exchange->publish( $body, $routingKey, @@ -401,7 +413,7 @@ class Connection // delete the delay queue 10 seconds after the message expires // publishing another message redeclares the queue which renews the lease 'x-expires' => $delay + 10000, - // message should be broadcasted to all consumers during delay, but to only one queue during retry + // message should be broadcast to all consumers during delay, but to only one queue during retry // empty name is default direct exchange 'x-dead-letter-exchange' => $isRetryAttempt ? '' : $this->exchangeOptions['name'], // after being released from to DLX, make sure the original routing key will be used @@ -445,12 +457,12 @@ class Connection public function ack(\AMQPEnvelope $message, string $queueName): bool { - return $this->queue($queueName)->ack($message->getDeliveryTag()); + return $this->queue($queueName)->ack($message->getDeliveryTag()) ?? true; } public function nack(\AMQPEnvelope $message, string $queueName, int $flags = \AMQP_NOPARAM): bool { - return $this->queue($queueName)->nack($message->getDeliveryTag(), $flags); + return $this->queue($queueName)->nack($message->getDeliveryTag(), $flags) ?? true; } public function setup(): void @@ -505,11 +517,16 @@ class Connection static function (): bool { return false; }, - static function (): bool { - return false; + static function () { + throw new TransportException('Message publication failed due to a negative acknowledgment (nack) from the broker.'); } ); } + + $this->lastActivityTime = time(); + } elseif (0 < ($this->connectionOptions['heartbeat'] ?? 0) && time() > $this->lastActivityTime + 2 * $this->connectionOptions['heartbeat']) { + $disconnectMethod = 'true' === ($this->connectionOptions['persistent'] ?? 'false') ? 'pdisconnect' : 'disconnect'; + $this->amqpChannel->getConnection()->{$disconnectMethod}(); } return $this->amqpChannel; @@ -518,7 +535,7 @@ class Connection public function queue(string $queueName): \AMQPQueue { if (!isset($this->amqpQueues[$queueName])) { - $queueConfig = $this->queuesOptions[$queueName]; + $queueConfig = $this->queuesOptions[$queueName] ?? []; $amqpQueue = $this->amqpFactory->createQueue($this->channel()); $amqpQueue->setName($queueName); diff --git a/plugins/email/vendor/symfony/deprecation-contracts/LICENSE b/plugins/email/vendor/symfony/deprecation-contracts/LICENSE index 406242f..0ed3a24 100644 --- a/plugins/email/vendor/symfony/deprecation-contracts/LICENSE +++ b/plugins/email/vendor/symfony/deprecation-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020-2022 Fabien Potencier +Copyright (c) 2020-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/doctrine-messenger/LICENSE b/plugins/email/vendor/symfony/doctrine-messenger/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/LICENSE +++ b/plugins/email/vendor/symfony/doctrine-messenger/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/Connection.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/Connection.php index b760df6..79b3027 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/Connection.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/Connection.php @@ -66,7 +66,7 @@ class Connection implements ResetInterface private $schemaSynchronizer; private $autoSetup; - public function __construct(array $configuration, DBALConnection $driverConnection, SchemaSynchronizer $schemaSynchronizer = null) + public function __construct(array $configuration, DBALConnection $driverConnection, ?SchemaSynchronizer $schemaSynchronizer = null) { $this->configuration = array_replace_recursive(static::DEFAULT_OPTIONS, $configuration); $this->driverConnection = $driverConnection; @@ -86,16 +86,16 @@ class Connection implements ResetInterface public static function buildConfiguration(string $dsn, array $options = []): array { - if (false === $components = parse_url($dsn)) { - throw new InvalidArgumentException(sprintf('The given Doctrine Messenger DSN "%s" is invalid.', $dsn)); + if (false === $params = parse_url($dsn)) { + throw new InvalidArgumentException('The given Doctrine Messenger DSN is invalid.'); } $query = []; - if (isset($components['query'])) { - parse_str($components['query'], $query); + if (isset($params['query'])) { + parse_str($params['query'], $query); } - $configuration = ['connection' => $components['host']]; + $configuration = ['connection' => $params['host']]; $configuration += $query + $options + static::DEFAULT_OPTIONS; $configuration['auto_setup'] = filter_var($configuration['auto_setup'], \FILTER_VALIDATE_BOOLEAN); @@ -125,7 +125,7 @@ class Connection implements ResetInterface public function send(string $body, array $headers, int $delay = 0): string { $now = new \DateTime(); - $availableAt = (clone $now)->modify(sprintf('+%d seconds', $delay / 1000)); + $availableAt = (clone $now)->modify(sprintf('%+d seconds', $delay / 1000)); $queryBuilder = $this->driverConnection->createQueryBuilder() ->insert($this->configuration['table_name']) @@ -144,9 +144,9 @@ class Connection implements ResetInterface $now, $availableAt, ], [ - null, - null, - null, + Types::STRING, + Types::STRING, + Types::STRING, Types::DATETIME_MUTABLE, Types::DATETIME_MUTABLE, ]); @@ -161,6 +161,10 @@ class Connection implements ResetInterface $this->driverConnection->delete($this->configuration['table_name'], ['delivered_at' => '9999-12-31 23:59:59']); } catch (DriverException $e) { // Ignore the exception + } catch (TableNotFoundException $e) { + if ($this->autoSetup) { + $this->setup(); + } } } @@ -171,13 +175,32 @@ class Connection implements ResetInterface ->orderBy('available_at', 'ASC') ->setMaxResults(1); + if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) { + $query->select('m.id'); + } + // Append pessimistic write lock to FROM clause if db platform supports it $sql = $query->getSQL(); - if (($fromPart = $query->getQueryPart('from')) && - ($table = $fromPart[0]['table'] ?? null) && - ($alias = $fromPart[0]['alias'] ?? null) - ) { - $fromClause = sprintf('%s %s', $table, $alias); + + // Wrap the rownum query in a sub-query to allow writelocks without ORA-02014 error + if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) { + $query = $this->createQueryBuilder('w') + ->where('w.id IN ('.str_replace('SELECT a.* FROM', 'SELECT a.id FROM', $sql).')') + ->setParameters($query->getParameters(), $query->getParameterTypes()); + + if (method_exists(QueryBuilder::class, 'forUpdate')) { + $query->forUpdate(); + } + + $sql = $query->getSQL(); + } elseif (method_exists(QueryBuilder::class, 'forUpdate')) { + $query->forUpdate(); + try { + $sql = $query->getSQL(); + } catch (DBALException $e) { + } + } elseif (preg_match('/FROM (.+) WHERE/', (string) $sql, $matches)) { + $fromClause = $matches[1]; $sql = str_replace( sprintf('FROM %s WHERE', $fromClause), sprintf('FROM %s WHERE', $this->driverConnection->getDatabasePlatform()->appendLockHint($fromClause, LockMode::PESSIMISTIC_WRITE)), @@ -185,25 +208,13 @@ class Connection implements ResetInterface ); } - // Wrap the rownum query in a sub-query to allow writelocks without ORA-02014 error - if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) { - $sql = str_replace('SELECT a.* FROM', 'SELECT a.id FROM', $sql); - - $wrappedQuery = $this->driverConnection->createQueryBuilder() - ->select( - 'w.id AS "id", w.body AS "body", w.headers AS "headers", w.queue_name AS "queue_name", '. - 'w.created_at AS "created_at", w.available_at AS "available_at", '. - 'w.delivered_at AS "delivered_at"' - ) - ->from($this->configuration['table_name'], 'w') - ->where('w.id IN('.$sql.')'); - - $sql = $wrappedQuery->getSQL(); + // use SELECT ... FOR UPDATE to lock table + if (!method_exists(QueryBuilder::class, 'forUpdate')) { + $sql .= ' '.$this->driverConnection->getDatabasePlatform()->getWriteLockSQL(); } - // use SELECT ... FOR UPDATE to lock table $stmt = $this->executeQuery( - $sql.' '.$this->driverConnection->getDatabasePlatform()->getWriteLockSQL(), + $sql, $query->getParameters(), $query->getParameterTypes() ); @@ -278,7 +289,7 @@ class Connection implements ResetInterface { $configuration = $this->driverConnection->getConfiguration(); $assetFilter = $configuration->getSchemaAssetsFilter(); - $configuration->setSchemaAssetsFilter(null); + $configuration->setSchemaAssetsFilter(static function () { return true; }); $this->updateSchema(); $configuration->setSchemaAssetsFilter($assetFilter); $this->autoSetup = false; @@ -287,7 +298,7 @@ class Connection implements ResetInterface public function getMessageCount(): int { $queryBuilder = $this->createAvailableMessagesQueryBuilder() - ->select('COUNT(m.id) as message_count') + ->select('COUNT(m.id) AS message_count') ->setMaxResults(1); $stmt = $this->executeQuery($queryBuilder->getSQL(), $queryBuilder->getParameters(), $queryBuilder->getParameterTypes()); @@ -295,9 +306,10 @@ class Connection implements ResetInterface return $stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchOne() : $stmt->fetchColumn(); } - public function findAll(int $limit = null): array + public function findAll(?int $limit = null): array { $queryBuilder = $this->createAvailableMessagesQueryBuilder(); + if (null !== $limit) { $queryBuilder->setMaxResults($limit); } @@ -352,24 +364,39 @@ class Connection implements ResetInterface $redeliverLimit = (clone $now)->modify(sprintf('-%d seconds', $this->configuration['redeliver_timeout'])); return $this->createQueryBuilder() - ->where('m.delivered_at is null OR m.delivered_at < ?') + ->where('m.queue_name = ?') + ->andWhere('m.delivered_at is null OR m.delivered_at < ?') ->andWhere('m.available_at <= ?') - ->andWhere('m.queue_name = ?') ->setParameters([ + $this->configuration['queue_name'], $redeliverLimit, $now, - $this->configuration['queue_name'], ], [ + Types::STRING, Types::DATETIME_MUTABLE, Types::DATETIME_MUTABLE, ]); } - private function createQueryBuilder(): QueryBuilder + private function createQueryBuilder(string $alias = 'm'): QueryBuilder { - return $this->driverConnection->createQueryBuilder() - ->select('m.*') - ->from($this->configuration['table_name'], 'm'); + $queryBuilder = $this->driverConnection->createQueryBuilder() + ->from($this->configuration['table_name'], $alias); + + $alias .= '.'; + + if (!$this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) { + return $queryBuilder->select($alias.'*'); + } + + // Oracle databases use UPPER CASE on tables and column identifiers. + // Column alias is added to force the result to be lowercase even when the actual field is all caps. + + return $queryBuilder->select(str_replace(', ', ', '.$alias, + $alias.'id AS "id", body AS "body", headers AS "headers", queue_name AS "queue_name", '. + 'created_at AS "created_at", available_at AS "available_at", '. + 'delivered_at AS "delivered_at"' + )); } private function executeQuery(string $sql, array $parameters = [], array $types = []) @@ -470,13 +497,41 @@ class Connection implements ResetInterface $schemaManager = $this->createSchemaManager(); $comparator = $this->createComparator($schemaManager); - $schemaDiff = $this->compareSchemas($comparator, $schemaManager->createSchema(), $this->getSchema()); + $schemaDiff = $this->compareSchemas($comparator, method_exists($schemaManager, 'introspectSchema') ? $schemaManager->introspectSchema() : $schemaManager->createSchema(), $this->getSchema()); + $platform = $this->driverConnection->getDatabasePlatform(); + $exec = method_exists($this->driverConnection, 'executeStatement') ? 'executeStatement' : 'exec'; - foreach ($schemaDiff->toSaveSql($this->driverConnection->getDatabasePlatform()) as $sql) { - if (method_exists($this->driverConnection, 'executeStatement')) { - $this->driverConnection->executeStatement($sql); - } else { - $this->driverConnection->exec($sql); + if (!method_exists(SchemaDiff::class, 'getCreatedSchemas')) { + foreach ($schemaDiff->toSaveSql($platform) as $sql) { + $this->driverConnection->$exec($sql); + } + + return; + } + + if ($platform->supportsSchemas()) { + foreach ($schemaDiff->getCreatedSchemas() as $schema) { + $this->driverConnection->$exec($platform->getCreateSchemaSQL($schema)); + } + } + + if ($platform->supportsSequences()) { + foreach ($schemaDiff->getAlteredSequences() as $sequence) { + $this->driverConnection->$exec($platform->getAlterSequenceSQL($sequence)); + } + + foreach ($schemaDiff->getCreatedSequences() as $sequence) { + $this->driverConnection->$exec($platform->getCreateSequenceSQL($sequence)); + } + } + + foreach ($platform->getCreateTablesSQL($schemaDiff->getCreatedTables()) as $sql) { + $this->driverConnection->$exec($sql); + } + + foreach ($schemaDiff->getAlteredTables() as $tableDiff) { + foreach ($platform->getAlterTableSQL($tableDiff) as $sql) { + $this->driverConnection->$exec($sql); } } } @@ -497,7 +552,7 @@ class Connection implements ResetInterface private function compareSchemas(Comparator $comparator, Schema $from, Schema $to): SchemaDiff { - return method_exists($comparator, 'compareSchemas') + return method_exists($comparator, 'compareSchemas') || method_exists($comparator, 'doCompareSchemas') ? $comparator->compareSchemas($from, $to) : $comparator->compare($from, $to); } diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineReceiver.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineReceiver.php index 69cf0ed..1448be8 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineReceiver.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineReceiver.php @@ -33,7 +33,7 @@ class DoctrineReceiver implements ListableReceiverInterface, MessageCountAwareIn private $connection; private $serializer; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); @@ -107,7 +107,7 @@ class DoctrineReceiver implements ListableReceiverInterface, MessageCountAwareIn /** * {@inheritdoc} */ - public function all(int $limit = null): iterable + public function all(?int $limit = null): iterable { try { $doctrineEnvelopes = $this->connection->findAll($limit); diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineSender.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineSender.php index 6e5aa60..3285736 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineSender.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineSender.php @@ -28,7 +28,7 @@ class DoctrineSender implements SenderInterface private $connection; private $serializer; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransport.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransport.php index 97bc6fa..fe0b385 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransport.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransport.php @@ -72,7 +72,7 @@ class DoctrineTransport implements TransportInterface, SetupableTransportInterfa /** * {@inheritdoc} */ - public function all(int $limit = null): iterable + public function all(?int $limit = null): iterable { return ($this->receiver ?? $this->getReceiver())->all($limit); } diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransportFactory.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransportFactory.php index f634e55..4011dec 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransportFactory.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/DoctrineTransportFactory.php @@ -35,6 +35,9 @@ class DoctrineTransportFactory implements TransportFactoryInterface $this->registry = $registry; } + /** + * @param array $options You can set 'use_notify' to false to not use LISTEN/NOTIFY with postgresql + */ public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface { $useNotify = ($options['use_notify'] ?? true); @@ -45,7 +48,7 @@ class DoctrineTransportFactory implements TransportFactoryInterface try { $driverConnection = $this->registry->getConnection($configuration['connection']); } catch (\InvalidArgumentException $e) { - throw new TransportException(sprintf('Could not find Doctrine connection from Messenger DSN "%s".', $dsn), 0, $e); + throw new TransportException('Could not find Doctrine connection from Messenger DSN.', 0, $e); } if ($useNotify && $driverConnection->getDatabasePlatform() instanceof PostgreSQLPlatform) { diff --git a/plugins/email/vendor/symfony/doctrine-messenger/Transport/PostgreSqlConnection.php b/plugins/email/vendor/symfony/doctrine-messenger/Transport/PostgreSqlConnection.php index 3691a93..545856d 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/Transport/PostgreSqlConnection.php +++ b/plugins/email/vendor/symfony/doctrine-messenger/Transport/PostgreSqlConnection.php @@ -16,6 +16,8 @@ use Doctrine\DBAL\Schema\Table; /** * Uses PostgreSQL LISTEN/NOTIFY to push messages to workers. * + * If you do not want to use the LISTEN mechanism, set the `use_notify` option to `false` when calling DoctrineTransportFactory::createTransport. + * * @internal * * @author Kévin Dunglas @@ -23,12 +25,10 @@ use Doctrine\DBAL\Schema\Table; final class PostgreSqlConnection extends Connection { /** - * * use_notify: Set to false to disable the use of LISTEN/NOTIFY. Default: true * * check_delayed_interval: The interval to check for delayed messages, in milliseconds. Set to 0 to disable checks. Default: 60000 (1 minute) * * get_notify_timeout: The length of time to wait for a response when calling PDO::pgsqlGetNotify, in milliseconds. Default: 0. */ protected const DEFAULT_OPTIONS = parent::DEFAULT_OPTIONS + [ - 'use_notify' => true, 'check_delayed_interval' => 60000, 'get_notify_timeout' => 0, ]; @@ -64,6 +64,7 @@ final class PostgreSqlConnection extends Connection // https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS $this->executeStatement(sprintf('LISTEN "%s"', $this->configuration['table_name'])); + // The condition should be removed once support for DBAL <3.3 is dropped if (method_exists($this->driverConnection, 'getNativeConnection')) { $wrappedConnection = $this->driverConnection->getNativeConnection(); } else { diff --git a/plugins/email/vendor/symfony/doctrine-messenger/composer.json b/plugins/email/vendor/symfony/doctrine-messenger/composer.json index 3a9494a..e1490a7 100644 --- a/plugins/email/vendor/symfony/doctrine-messenger/composer.json +++ b/plugins/email/vendor/symfony/doctrine-messenger/composer.json @@ -21,7 +21,7 @@ "symfony/service-contracts": "^1.1|^2|^3" }, "require-dev": { - "doctrine/dbal": "^2.13|^3.0", + "doctrine/dbal": "^2.13|^3|^4", "doctrine/persistence": "^1.3|^2|^3", "symfony/property-access": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" diff --git a/plugins/email/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/plugins/email/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php index 351dc51..81f4e89 100644 --- a/plugins/email/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ b/plugins/email/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php @@ -27,5 +27,5 @@ interface EventDispatcherInterface extends PsrEventDispatcherInterface * * @return object The passed $event MUST be returned */ - public function dispatch(object $event, string $eventName = null): object; + public function dispatch(object $event, ?string $eventName = null): object; } diff --git a/plugins/email/vendor/symfony/event-dispatcher-contracts/LICENSE b/plugins/email/vendor/symfony/event-dispatcher-contracts/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/event-dispatcher-contracts/LICENSE +++ b/plugins/email/vendor/symfony/event-dispatcher-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/plugins/email/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php index acfbf61..84d6a08 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ b/plugins/email/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -42,7 +42,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa private $requestStack; private $currentRequestHash = ''; - public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) + public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, ?LoggerInterface $logger = null, ?RequestStack $requestStack = null) { $this->dispatcher = $dispatcher; $this->stopwatch = $stopwatch; @@ -97,7 +97,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function getListeners(string $eventName = null) + public function getListeners(?string $eventName = null) { return $this->dispatcher->getListeners($eventName); } @@ -123,7 +123,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null) + public function hasListeners(?string $eventName = null) { return $this->dispatcher->hasListeners($eventName); } @@ -131,7 +131,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * {@inheritdoc} */ - public function dispatch(object $event, string $eventName = null): object + public function dispatch(object $event, ?string $eventName = null): object { $eventName = $eventName ?? \get_class($event); @@ -171,7 +171,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * @return array */ - public function getCalledListeners(Request $request = null) + public function getCalledListeners(?Request $request = null) { if (null === $this->callStack) { return []; @@ -192,7 +192,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa /** * @return array */ - public function getNotCalledListeners(Request $request = null) + public function getNotCalledListeners(?Request $request = null) { try { $allListeners = $this->getListeners(); @@ -235,7 +235,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa return $notCalled; } - public function getOrphanedEvents(Request $request = null): array + public function getOrphanedEvents(?Request $request = null): array { if ($request) { return $this->orphanedEvents[spl_object_hash($request)] ?? []; diff --git a/plugins/email/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/plugins/email/vendor/symfony/event-dispatcher/Debug/WrappedListener.php index 3916716..80d49a1 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/Debug/WrappedListener.php +++ b/plugins/email/vendor/symfony/event-dispatcher/Debug/WrappedListener.php @@ -33,7 +33,7 @@ final class WrappedListener private $priority; private static $hasClassStub; - public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) + public function __construct($listener, ?string $name, Stopwatch $stopwatch, ?EventDispatcherInterface $dispatcher = null) { $this->listener = $listener; $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); @@ -49,7 +49,7 @@ final class WrappedListener $r = new \ReflectionFunction($listener); if (str_contains($r->name, '{closure}')) { $this->pretty = $this->name = 'closure'; - } elseif ($class = $r->getClosureScopeClass()) { + } elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) { $this->name = $class->name; $this->pretty = $this->name.'::'.$r->name; } else { @@ -114,10 +114,12 @@ final class WrappedListener $e = $this->stopwatch->start($this->name, 'event_listener'); - ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); - - if ($e->isStarted()) { - $e->stop(); + try { + ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); + } finally { + if ($e->isStarted()) { + $e->stop(); + } } if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { diff --git a/plugins/email/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/plugins/email/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php index 8eabe7d..5f44ff0 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php +++ b/plugins/email/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php @@ -115,14 +115,18 @@ class RegisterListenersPass implements CompilerPassInterface ], function ($matches) { return strtoupper($matches[0]); }, $event['event']); $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); - if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) { + if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) { + if (!$r->hasMethod('__invoke')) { + throw new InvalidArgumentException(sprintf('None of the "%s" or "__invoke" methods exist for the service "%s". Please define the "method" attribute on "%s" tags.', $event['method'], $id, $this->listenerTag)); + } + $event['method'] = '__invoke'; } } $dispatcherDefinition = $globalDispatcherDefinition; if (isset($event['dispatcher'])) { - $dispatcherDefinition = $container->getDefinition($event['dispatcher']); + $dispatcherDefinition = $container->findDefinition($event['dispatcher']); } $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); @@ -161,7 +165,7 @@ class RegisterListenersPass implements CompilerPassInterface continue; } - $dispatcherDefinitions[$attributes['dispatcher']] = $container->getDefinition($attributes['dispatcher']); + $dispatcherDefinitions[$attributes['dispatcher']] = $container->findDefinition($attributes['dispatcher']); } if (!$dispatcherDefinitions) { diff --git a/plugins/email/vendor/symfony/event-dispatcher/EventDispatcher.php b/plugins/email/vendor/symfony/event-dispatcher/EventDispatcher.php index 8fe8fb5..9c86bd9 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/EventDispatcher.php +++ b/plugins/email/vendor/symfony/event-dispatcher/EventDispatcher.php @@ -45,7 +45,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function dispatch(object $event, string $eventName = null): object + public function dispatch(object $event, ?string $eventName = null): object { $eventName = $eventName ?? \get_class($event); @@ -65,7 +65,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListeners(string $eventName = null) + public function getListeners(?string $eventName = null) { if (null !== $eventName) { if (empty($this->listeners[$eventName])) { @@ -120,7 +120,7 @@ class EventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null) + public function hasListeners(?string $eventName = null) { if (null !== $eventName) { return !empty($this->listeners[$eventName]); diff --git a/plugins/email/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/plugins/email/vendor/symfony/event-dispatcher/EventDispatcherInterface.php index cc324e1..4b65e5a 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/EventDispatcherInterface.php +++ b/plugins/email/vendor/symfony/event-dispatcher/EventDispatcherInterface.php @@ -50,7 +50,7 @@ interface EventDispatcherInterface extends ContractsEventDispatcherInterface * * @return array */ - public function getListeners(string $eventName = null); + public function getListeners(?string $eventName = null); /** * Gets the listener priority for a specific event. @@ -66,5 +66,5 @@ interface EventDispatcherInterface extends ContractsEventDispatcherInterface * * @return bool */ - public function hasListeners(string $eventName = null); + public function hasListeners(?string $eventName = null); } diff --git a/plugins/email/vendor/symfony/event-dispatcher/GenericEvent.php b/plugins/email/vendor/symfony/event-dispatcher/GenericEvent.php index b32a301..4ecd29e 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/GenericEvent.php +++ b/plugins/email/vendor/symfony/event-dispatcher/GenericEvent.php @@ -29,7 +29,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate protected $arguments; /** - * Encapsulate an event with $subject and $args. + * Encapsulate an event with $subject and $arguments. * * @param mixed $subject The subject of the event, usually an object or a callable * @param array $arguments Arguments to store in the event diff --git a/plugins/email/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/plugins/email/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php index 568d79c..4e00bfa 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php +++ b/plugins/email/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php @@ -28,7 +28,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function dispatch(object $event, string $eventName = null): object + public function dispatch(object $event, ?string $eventName = null): object { return $this->dispatcher->dispatch($event, $eventName); } @@ -68,7 +68,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function getListeners(string $eventName = null) + public function getListeners(?string $eventName = null) { return $this->dispatcher->getListeners($eventName); } @@ -84,7 +84,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface /** * {@inheritdoc} */ - public function hasListeners(string $eventName = null) + public function hasListeners(?string $eventName = null) { return $this->dispatcher->hasListeners($eventName); } diff --git a/plugins/email/vendor/symfony/event-dispatcher/LICENSE b/plugins/email/vendor/symfony/event-dispatcher/LICENSE index 88bf75b..0138f8f 100644 --- a/plugins/email/vendor/symfony/event-dispatcher/LICENSE +++ b/plugins/email/vendor/symfony/event-dispatcher/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2022 Fabien Potencier +Copyright (c) 2004-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/mailer/CHANGELOG.md b/plugins/email/vendor/symfony/mailer/CHANGELOG.md index cc6cd6f..bdeffe4 100644 --- a/plugins/email/vendor/symfony/mailer/CHANGELOG.md +++ b/plugins/email/vendor/symfony/mailer/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +5.4.21 +------ + + * [BC BREAK] The following data providers for `TransportFactoryTestCase` are now static: + `supportsProvider()`, `createProvider()`, `unsupportedSchemeProvider()`and `incompleteDsnProvider()` + 5.4 --- diff --git a/plugins/email/vendor/symfony/mailer/DataCollector/MessageDataCollector.php b/plugins/email/vendor/symfony/mailer/DataCollector/MessageDataCollector.php index 07f77b2..ba94d9b 100644 --- a/plugins/email/vendor/symfony/mailer/DataCollector/MessageDataCollector.php +++ b/plugins/email/vendor/symfony/mailer/DataCollector/MessageDataCollector.php @@ -32,7 +32,7 @@ final class MessageDataCollector extends DataCollector /** * {@inheritdoc} */ - public function collect(Request $request, Response $response, \Throwable $exception = null) + public function collect(Request $request, Response $response, ?\Throwable $exception = null) { $this->data['events'] = $this->events; } diff --git a/plugins/email/vendor/symfony/mailer/Event/MessageEvents.php b/plugins/email/vendor/symfony/mailer/Event/MessageEvents.php index b526649..b6b89b3 100644 --- a/plugins/email/vendor/symfony/mailer/Event/MessageEvents.php +++ b/plugins/email/vendor/symfony/mailer/Event/MessageEvents.php @@ -35,7 +35,7 @@ class MessageEvents /** * @return MessageEvent[] */ - public function getEvents(string $name = null): array + public function getEvents(?string $name = null): array { if (null === $name) { return $this->events; @@ -54,7 +54,7 @@ class MessageEvents /** * @return RawMessage[] */ - public function getMessages(string $name = null): array + public function getMessages(?string $name = null): array { $events = $this->getEvents($name); $messages = []; diff --git a/plugins/email/vendor/symfony/mailer/EventListener/EnvelopeListener.php b/plugins/email/vendor/symfony/mailer/EventListener/EnvelopeListener.php index b2980bc..db9c0a4 100644 --- a/plugins/email/vendor/symfony/mailer/EventListener/EnvelopeListener.php +++ b/plugins/email/vendor/symfony/mailer/EventListener/EnvelopeListener.php @@ -30,7 +30,7 @@ class EnvelopeListener implements EventSubscriberInterface * @param Address|string $sender * @param array $recipients */ - public function __construct($sender = null, array $recipients = null) + public function __construct($sender = null, ?array $recipients = null) { if (null !== $sender) { $this->sender = Address::create($sender); diff --git a/plugins/email/vendor/symfony/mailer/EventListener/MessageListener.php b/plugins/email/vendor/symfony/mailer/EventListener/MessageListener.php index f23c69d..b654bea 100644 --- a/plugins/email/vendor/symfony/mailer/EventListener/MessageListener.php +++ b/plugins/email/vendor/symfony/mailer/EventListener/MessageListener.php @@ -43,7 +43,7 @@ class MessageListener implements EventSubscriberInterface private $headerRules = []; private $renderer; - public function __construct(Headers $headers = null, BodyRendererInterface $renderer = null, array $headerRules = self::DEFAULT_RULES) + public function __construct(?Headers $headers = null, ?BodyRendererInterface $renderer = null, array $headerRules = self::DEFAULT_RULES) { $this->headers = $headers; $this->renderer = $renderer; diff --git a/plugins/email/vendor/symfony/mailer/Exception/HttpTransportException.php b/plugins/email/vendor/symfony/mailer/Exception/HttpTransportException.php index c72eb6c..0ba35ee 100644 --- a/plugins/email/vendor/symfony/mailer/Exception/HttpTransportException.php +++ b/plugins/email/vendor/symfony/mailer/Exception/HttpTransportException.php @@ -20,7 +20,7 @@ class HttpTransportException extends TransportException { private $response; - public function __construct(?string $message, ResponseInterface $response, int $code = 0, \Throwable $previous = null) + public function __construct(?string $message, ResponseInterface $response, int $code = 0, ?\Throwable $previous = null) { if (null === $message) { trigger_deprecation('symfony/mailer', '5.3', 'Passing null as $message to "%s()" is deprecated, pass an empty string instead.', __METHOD__); diff --git a/plugins/email/vendor/symfony/mailer/Exception/UnsupportedSchemeException.php b/plugins/email/vendor/symfony/mailer/Exception/UnsupportedSchemeException.php index e47a129..46acf83 100644 --- a/plugins/email/vendor/symfony/mailer/Exception/UnsupportedSchemeException.php +++ b/plugins/email/vendor/symfony/mailer/Exception/UnsupportedSchemeException.php @@ -58,7 +58,7 @@ class UnsupportedSchemeException extends LogicException ], ]; - public function __construct(Dsn $dsn, string $name = null, array $supported = []) + public function __construct(Dsn $dsn, ?string $name = null, array $supported = []) { $provider = $dsn->getScheme(); if (false !== $pos = strpos($provider, '+')) { diff --git a/plugins/email/vendor/symfony/mailer/LICENSE b/plugins/email/vendor/symfony/mailer/LICENSE index 9c907a4..f37c76b 100644 --- a/plugins/email/vendor/symfony/mailer/LICENSE +++ b/plugins/email/vendor/symfony/mailer/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2019-2022 Fabien Potencier +Copyright (c) 2019-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/mailer/Mailer.php b/plugins/email/vendor/symfony/mailer/Mailer.php index cbdcdf2..f4e7f8c 100644 --- a/plugins/email/vendor/symfony/mailer/Mailer.php +++ b/plugins/email/vendor/symfony/mailer/Mailer.php @@ -32,14 +32,14 @@ final class Mailer implements MailerInterface private $bus; private $dispatcher; - public function __construct(TransportInterface $transport, MessageBusInterface $bus = null, EventDispatcherInterface $dispatcher = null) + public function __construct(TransportInterface $transport, ?MessageBusInterface $bus = null, ?EventDispatcherInterface $dispatcher = null) { $this->transport = $transport; $this->bus = $bus; $this->dispatcher = class_exists(Event::class) && $dispatcher instanceof SymfonyEventDispatcherInterface ? LegacyEventDispatcherProxy::decorate($dispatcher) : $dispatcher; } - public function send(RawMessage $message, Envelope $envelope = null): void + public function send(RawMessage $message, ?Envelope $envelope = null): void { if (null === $this->bus) { $this->transport->send($message, $envelope); diff --git a/plugins/email/vendor/symfony/mailer/MailerInterface.php b/plugins/email/vendor/symfony/mailer/MailerInterface.php index eb44cf6..8d9540a 100644 --- a/plugins/email/vendor/symfony/mailer/MailerInterface.php +++ b/plugins/email/vendor/symfony/mailer/MailerInterface.php @@ -26,5 +26,5 @@ interface MailerInterface /** * @throws TransportExceptionInterface */ - public function send(RawMessage $message, Envelope $envelope = null): void; + public function send(RawMessage $message, ?Envelope $envelope = null): void; } diff --git a/plugins/email/vendor/symfony/mailer/Messenger/SendEmailMessage.php b/plugins/email/vendor/symfony/mailer/Messenger/SendEmailMessage.php index b06ac83..622408a 100644 --- a/plugins/email/vendor/symfony/mailer/Messenger/SendEmailMessage.php +++ b/plugins/email/vendor/symfony/mailer/Messenger/SendEmailMessage.php @@ -22,7 +22,7 @@ class SendEmailMessage private $message; private $envelope; - public function __construct(RawMessage $message, Envelope $envelope = null) + public function __construct(RawMessage $message, ?Envelope $envelope = null) { $this->message = $message; $this->envelope = $envelope; diff --git a/plugins/email/vendor/symfony/mailer/Test/Constraint/EmailCount.php b/plugins/email/vendor/symfony/mailer/Test/Constraint/EmailCount.php index 59a7812..0b4d945 100644 --- a/plugins/email/vendor/symfony/mailer/Test/Constraint/EmailCount.php +++ b/plugins/email/vendor/symfony/mailer/Test/Constraint/EmailCount.php @@ -20,7 +20,7 @@ final class EmailCount extends Constraint private $transport; private $queued; - public function __construct(int $expectedValue, string $transport = null, bool $queued = false) + public function __construct(int $expectedValue, ?string $transport = null, bool $queued = false) { $this->expectedValue = $expectedValue; $this->transport = $transport; diff --git a/plugins/email/vendor/symfony/mailer/Test/TransportFactoryTestCase.php b/plugins/email/vendor/symfony/mailer/Test/TransportFactoryTestCase.php index c2426a0..bc9635d 100644 --- a/plugins/email/vendor/symfony/mailer/Test/TransportFactoryTestCase.php +++ b/plugins/email/vendor/symfony/mailer/Test/TransportFactoryTestCase.php @@ -37,16 +37,16 @@ abstract class TransportFactoryTestCase extends TestCase abstract public function getFactory(): TransportFactoryInterface; - abstract public function supportsProvider(): iterable; + abstract public static function supportsProvider(): iterable; - abstract public function createProvider(): iterable; + abstract public static function createProvider(): iterable; - public function unsupportedSchemeProvider(): iterable + public static function unsupportedSchemeProvider(): iterable { return []; } - public function incompleteDsnProvider(): iterable + public static function incompleteDsnProvider(): iterable { return []; } @@ -77,7 +77,7 @@ abstract class TransportFactoryTestCase extends TestCase /** * @dataProvider unsupportedSchemeProvider */ - public function testUnsupportedSchemeException(Dsn $dsn, string $message = null) + public function testUnsupportedSchemeException(Dsn $dsn, ?string $message = null) { $factory = $this->getFactory(); @@ -102,7 +102,7 @@ abstract class TransportFactoryTestCase extends TestCase protected function getDispatcher(): EventDispatcherInterface { - return $this->dispatcher ?? $this->dispatcher = $this->createMock(EventDispatcherInterface::class); + return $this->dispatcher ?? $this->dispatcher = $this->createMock(EventDispatcherInterface::class); } protected function getClient(): HttpClientInterface diff --git a/plugins/email/vendor/symfony/mailer/Transport.php b/plugins/email/vendor/symfony/mailer/Transport.php index c2b813f..294442e 100644 --- a/plugins/email/vendor/symfony/mailer/Transport.php +++ b/plugins/email/vendor/symfony/mailer/Transport.php @@ -63,7 +63,7 @@ class Transport * @param HttpClientInterface|null $client * @param LoggerInterface|null $logger */ - public static function fromDsn(string $dsn/* , EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): TransportInterface + public static function fromDsn(string $dsn/* , ?EventDispatcherInterface $dispatcher = null, ?HttpClientInterface $client = null, ?LoggerInterface $logger = null */): TransportInterface { $dispatcher = 2 <= \func_num_args() ? func_get_arg(1) : null; $client = 3 <= \func_num_args() ? func_get_arg(2) : null; @@ -79,7 +79,7 @@ class Transport * @param HttpClientInterface|null $client * @param LoggerInterface|null $logger */ - public static function fromDsns(array $dsns/* , EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): TransportInterface + public static function fromDsns(array $dsns/* , ?EventDispatcherInterface $dispatcher = null, ?HttpClientInterface $client = null, ?LoggerInterface $logger = null */): TransportInterface { $dispatcher = 2 <= \func_num_args() ? func_get_arg(1) : null; $client = 3 <= \func_num_args() ? func_get_arg(2) : null; @@ -112,7 +112,7 @@ class Transport { [$transport, $offset] = $this->parseDsn($dsn); if ($offset !== \strlen($dsn)) { - throw new InvalidArgumentException(sprintf('The DSN has some garbage at the end: "%s".', substr($dsn, $offset))); + throw new InvalidArgumentException('The mailer DSN has some garbage at the end.'); } return $transport; @@ -183,7 +183,7 @@ class Transport * * @return \Traversable */ - public static function getDefaultFactories(/* EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): iterable + public static function getDefaultFactories(/* ?EventDispatcherInterface $dispatcher = null, ?HttpClientInterface $client = null, ?LoggerInterface $logger = null */): iterable { $dispatcher = 1 <= \func_num_args() ? func_get_arg(0) : null; $client = 2 <= \func_num_args() ? func_get_arg(1) : null; diff --git a/plugins/email/vendor/symfony/mailer/Transport/AbstractHttpTransport.php b/plugins/email/vendor/symfony/mailer/Transport/AbstractHttpTransport.php index 2317a0d..47e73c9 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/AbstractHttpTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/AbstractHttpTransport.php @@ -28,7 +28,7 @@ abstract class AbstractHttpTransport extends AbstractTransport protected $port; protected $client; - public function __construct(HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) + public function __construct(?HttpClientInterface $client = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { $this->client = $client; if (null === $client) { diff --git a/plugins/email/vendor/symfony/mailer/Transport/AbstractTransport.php b/plugins/email/vendor/symfony/mailer/Transport/AbstractTransport.php index 77d810b..f7fd409 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/AbstractTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/AbstractTransport.php @@ -33,7 +33,7 @@ abstract class AbstractTransport implements TransportInterface private $rate = 0; private $lastSent = 0; - public function __construct(EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) + public function __construct(?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { $this->dispatcher = class_exists(Event::class) && $dispatcher instanceof SymfonyEventDispatcherInterface ? LegacyEventDispatcherProxy::decorate($dispatcher) : $dispatcher; $this->logger = $logger ?? new NullLogger(); @@ -56,7 +56,7 @@ abstract class AbstractTransport implements TransportInterface return $this; } - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage { $message = clone $message; $envelope = null !== $envelope ? clone $envelope : Envelope::create($message); @@ -65,6 +65,7 @@ abstract class AbstractTransport implements TransportInterface $event = new MessageEvent($message, $envelope, (string) $this); $this->dispatcher->dispatch($event); $envelope = $event->getEnvelope(); + $message = $event->getMessage(); } $message = new SentMessage($message, $envelope); @@ -103,7 +104,7 @@ abstract class AbstractTransport implements TransportInterface $sleep = (1 / $this->rate) - (microtime(true) - $this->lastSent); if (0 < $sleep) { $this->logger->debug(sprintf('Email transport "%s" sleeps for %.2f seconds', __CLASS__, $sleep)); - usleep($sleep * 1000000); + usleep((int) ($sleep * 1000000)); } $this->lastSent = microtime(true); } diff --git a/plugins/email/vendor/symfony/mailer/Transport/AbstractTransportFactory.php b/plugins/email/vendor/symfony/mailer/Transport/AbstractTransportFactory.php index e1617d2..1f47344 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/AbstractTransportFactory.php +++ b/plugins/email/vendor/symfony/mailer/Transport/AbstractTransportFactory.php @@ -25,7 +25,7 @@ abstract class AbstractTransportFactory implements TransportFactoryInterface protected $client; protected $logger; - public function __construct(EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null) + public function __construct(?EventDispatcherInterface $dispatcher = null, ?HttpClientInterface $client = null, ?LoggerInterface $logger = null) { $this->dispatcher = $dispatcher; $this->client = $client; diff --git a/plugins/email/vendor/symfony/mailer/Transport/Dsn.php b/plugins/email/vendor/symfony/mailer/Transport/Dsn.php index 04d3540..8272be7 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Dsn.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Dsn.php @@ -25,7 +25,7 @@ final class Dsn private $port; private $options; - public function __construct(string $scheme, string $host, string $user = null, string $password = null, int $port = null, array $options = []) + public function __construct(string $scheme, string $host, ?string $user = null, ?string $password = null, ?int $port = null, array $options = []) { $this->scheme = $scheme; $this->host = $host; @@ -37,24 +37,24 @@ final class Dsn public static function fromString(string $dsn): self { - if (false === $parsedDsn = parse_url($dsn)) { - throw new InvalidArgumentException(sprintf('The "%s" mailer DSN is invalid.', $dsn)); + if (false === $params = parse_url($dsn)) { + throw new InvalidArgumentException('The mailer DSN is invalid.'); } - if (!isset($parsedDsn['scheme'])) { - throw new InvalidArgumentException(sprintf('The "%s" mailer DSN must contain a scheme.', $dsn)); + if (!isset($params['scheme'])) { + throw new InvalidArgumentException('The mailer DSN must contain a scheme.'); } - if (!isset($parsedDsn['host'])) { - throw new InvalidArgumentException(sprintf('The "%s" mailer DSN must contain a host (use "default" by default).', $dsn)); + if (!isset($params['host'])) { + throw new InvalidArgumentException('The mailer DSN must contain a host (use "default" by default).'); } - $user = '' !== ($parsedDsn['user'] ?? '') ? urldecode($parsedDsn['user']) : null; - $password = '' !== ($parsedDsn['pass'] ?? '') ? urldecode($parsedDsn['pass']) : null; - $port = $parsedDsn['port'] ?? null; - parse_str($parsedDsn['query'] ?? '', $query); + $user = '' !== ($params['user'] ?? '') ? rawurldecode($params['user']) : null; + $password = '' !== ($params['pass'] ?? '') ? rawurldecode($params['pass']) : null; + $port = $params['port'] ?? null; + parse_str($params['query'] ?? '', $query); - return new self($parsedDsn['scheme'], $parsedDsn['host'], $user, $password, $port, $query); + return new self($params['scheme'], $params['host'], $user, $password, $port, $query); } public function getScheme(): string @@ -77,7 +77,7 @@ final class Dsn return $this->password; } - public function getPort(int $default = null): ?int + public function getPort(?int $default = null): ?int { return $this->port ?? $default; } diff --git a/plugins/email/vendor/symfony/mailer/Transport/RoundRobinTransport.php b/plugins/email/vendor/symfony/mailer/Transport/RoundRobinTransport.php index 2f35138..2568e48 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/RoundRobinTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/RoundRobinTransport.php @@ -46,17 +46,21 @@ class RoundRobinTransport implements TransportInterface $this->retryPeriod = $retryPeriod; } - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage { + $exception = null; + while ($transport = $this->getNextTransport()) { try { return $transport->send($message, $envelope); } catch (TransportExceptionInterface $e) { + $exception = $exception ?? new TransportException('All transports failed.'); + $exception->appendDebug(sprintf("Transport \"%s\": %s\n", $transport, $e->getDebug())); $this->deadTransports[$transport] = microtime(true); } } - throw new TransportException('All transports failed.'); + throw $exception ?? new TransportException('No transports found.'); } public function __toString(): string diff --git a/plugins/email/vendor/symfony/mailer/Transport/SendmailTransport.php b/plugins/email/vendor/symfony/mailer/Transport/SendmailTransport.php index 43d0920..22aea4e 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/SendmailTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/SendmailTransport.php @@ -23,9 +23,9 @@ use Symfony\Component\Mime\RawMessage; /** * SendmailTransport for sending mail through a Sendmail/Postfix (etc..) binary. * - * Transport can be instanciated through SendmailTransportFactory or NativeTransportFactory: + * Transport can be instantiated through SendmailTransportFactory or NativeTransportFactory: * - * - SendmailTransportFactory to use most common sendmail path and recommanded options + * - SendmailTransportFactory to use most common sendmail path and recommended options * - NativeTransportFactory when configuration is set via php.ini * * @author Fabien Potencier @@ -49,7 +49,7 @@ class SendmailTransport extends AbstractTransport * * -f flag will be appended automatically if one is not present. */ - public function __construct(string $command = null, EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) + public function __construct(?string $command = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { parent::__construct($dispatcher, $logger); @@ -68,7 +68,7 @@ class SendmailTransport extends AbstractTransport } } - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage { if ($this->transport) { return $this->transport->send($message, $envelope); diff --git a/plugins/email/vendor/symfony/mailer/Transport/Smtp/EsmtpTransport.php b/plugins/email/vendor/symfony/mailer/Transport/Smtp/EsmtpTransport.php index 1dcb53f..a223205 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Smtp/EsmtpTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Smtp/EsmtpTransport.php @@ -30,7 +30,7 @@ class EsmtpTransport extends SmtpTransport private $username = ''; private $password = ''; - public function __construct(string $host = 'localhost', int $port = 0, bool $tls = null, EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) + public function __construct(string $host = 'localhost', int $port = 0, ?bool $tls = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { parent::__construct(null, $dispatcher, $logger); diff --git a/plugins/email/vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php b/plugins/email/vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php index 92af6aa..b01bb37 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php @@ -40,7 +40,7 @@ class SmtpTransport extends AbstractTransport private $stream; private $domain = '[127.0.0.1]'; - public function __construct(AbstractStream $stream = null, EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) + public function __construct(?AbstractStream $stream = null, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { parent::__construct($dispatcher, $logger); @@ -130,7 +130,7 @@ class SmtpTransport extends AbstractTransport return $this->domain; } - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage { try { $message = parent::send($message, $envelope); diff --git a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/AbstractStream.php b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/AbstractStream.php index 28cb616..2be8fce 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/AbstractStream.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/AbstractStream.php @@ -27,6 +27,7 @@ abstract class AbstractStream protected $stream; protected $in; protected $out; + protected $err; private $debug = ''; @@ -65,7 +66,7 @@ abstract class AbstractStream public function terminate(): void { - $this->stream = $this->out = $this->in = null; + $this->stream = $this->err = $this->out = $this->in = null; } public function readLine(): string @@ -74,8 +75,8 @@ abstract class AbstractStream return ''; } - $line = fgets($this->out); - if ('' === $line) { + $line = @fgets($this->out); + if ('' === $line || false === $line) { $metas = stream_get_meta_data($this->out); if ($metas['timed_out']) { throw new TransportException(sprintf('Connection to "%s" timed out.', $this->getReadConnectionDescription())); @@ -83,6 +84,9 @@ abstract class AbstractStream if ($metas['eof']) { throw new TransportException(sprintf('Connection to "%s" has been closed unexpectedly.', $this->getReadConnectionDescription())); } + if (false === $line) { + throw new TransportException(sprintf('Unable to read from connection to "%s": ', $this->getReadConnectionDescription()).error_get_last()['message']); + } } $this->debug .= sprintf('< %s', $line); diff --git a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/ProcessStream.php b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/ProcessStream.php index a8a8603..808d9eb 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/ProcessStream.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/ProcessStream.php @@ -35,7 +35,7 @@ final class ProcessStream extends AbstractStream $descriptorSpec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], + 2 => ['pipe', '\\' === \DIRECTORY_SEPARATOR ? 'a' : 'w'], ]; $pipes = []; $this->stream = proc_open($this->command, $descriptorSpec, $pipes); @@ -45,14 +45,20 @@ final class ProcessStream extends AbstractStream } $this->in = &$pipes[0]; $this->out = &$pipes[1]; + $this->err = &$pipes[2]; } public function terminate(): void { if (null !== $this->stream) { fclose($this->in); + $out = stream_get_contents($this->out); fclose($this->out); - proc_close($this->stream); + $err = stream_get_contents($this->err); + fclose($this->err); + if (0 !== $exitCode = proc_close($this->stream)) { + throw new TransportException('Process failed with exit code '.$exitCode.': '.$out.$err); + } } parent::terminate(); diff --git a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/SocketStream.php b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/SocketStream.php index 144ab7f..e2db248 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/SocketStream.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Smtp/Stream/SocketStream.php @@ -145,7 +145,7 @@ final class SocketStream extends AbstractStream if ($this->streamContextOptions) { $options = array_merge($options, $this->streamContextOptions); } - // do it unconditionnally as it will be used by STARTTLS as well if supported + // do it unconditionally as it will be used by STARTTLS as well if supported $options['ssl']['crypto_method'] = $options['ssl']['crypto_method'] ?? \STREAM_CRYPTO_METHOD_TLS_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; $streamContext = stream_context_create($options); @@ -160,7 +160,7 @@ final class SocketStream extends AbstractStream } stream_set_blocking($this->stream, true); - stream_set_timeout($this->stream, $timeout); + stream_set_timeout($this->stream, (int) $timeout, (int) (($timeout - (int) $timeout) * 1000000)); $this->in = &$this->stream; $this->out = &$this->stream; } diff --git a/plugins/email/vendor/symfony/mailer/Transport/TransportInterface.php b/plugins/email/vendor/symfony/mailer/Transport/TransportInterface.php index ed562cf..25c2e59 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/TransportInterface.php +++ b/plugins/email/vendor/symfony/mailer/Transport/TransportInterface.php @@ -29,7 +29,7 @@ interface TransportInterface /** * @throws TransportExceptionInterface */ - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage; + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage; public function __toString(): string; } diff --git a/plugins/email/vendor/symfony/mailer/Transport/Transports.php b/plugins/email/vendor/symfony/mailer/Transport/Transports.php index 702fc5c..63daa38 100644 --- a/plugins/email/vendor/symfony/mailer/Transport/Transports.php +++ b/plugins/email/vendor/symfony/mailer/Transport/Transports.php @@ -44,7 +44,7 @@ final class Transports implements TransportInterface } } - public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMessage { /** @var Message $message */ if (RawMessage::class === \get_class($message) || !$message->getHeaders()->has('X-Transport')) { diff --git a/plugins/email/vendor/symfony/mailer/composer.json b/plugins/email/vendor/symfony/mailer/composer.json index 53cf0f5..42416e1 100644 --- a/plugins/email/vendor/symfony/mailer/composer.json +++ b/plugins/email/vendor/symfony/mailer/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": ">=7.2.5", - "egulias/email-validator": "^2.1.10|^3", + "egulias/email-validator": "^2.1.10|^3|^4", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.1|^3", @@ -27,7 +27,7 @@ "symfony/service-contracts": "^1.1|^2|^3" }, "require-dev": { - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/messenger": "^4.4|^5.0|^6.0" }, "conflict": { diff --git a/plugins/email/vendor/symfony/messenger/CHANGELOG.md b/plugins/email/vendor/symfony/messenger/CHANGELOG.md index ede59fe..6e21913 100644 --- a/plugins/email/vendor/symfony/messenger/CHANGELOG.md +++ b/plugins/email/vendor/symfony/messenger/CHANGELOG.md @@ -29,7 +29,6 @@ CHANGELOG * Added factory methods `DelayStamp::delayFor(\DateInterval)` and `DelayStamp::delayUntil(\DateTimeInterface)`. * Removed the exception when dispatching a message with a `DispatchAfterCurrentBusStamp` and not in a context of another dispatch call * Added `WorkerMessageRetriedEvent` - * Added `WorkerMessageReceivedEvent::setEnvelope()` and made event mutable 5.1.0 ----- diff --git a/plugins/email/vendor/symfony/messenger/Command/AbstractFailedMessagesCommand.php b/plugins/email/vendor/symfony/messenger/Command/AbstractFailedMessagesCommand.php index 7a6fc21..43ad833 100644 --- a/plugins/email/vendor/symfony/messenger/Command/AbstractFailedMessagesCommand.php +++ b/plugins/email/vendor/symfony/messenger/Command/AbstractFailedMessagesCommand.php @@ -185,7 +185,7 @@ abstract class AbstractFailedMessagesCommand extends Command /** * @param string|null $name */ - protected function getReceiver(/* string $name = null */): ReceiverInterface + protected function getReceiver(/* ?string $name = null */): ReceiverInterface { if (1 > \func_num_args() && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \Mockery\MockInterface) { trigger_deprecation('symfony/messenger', '5.3', 'The "%s()" method will have a new "string $name" argument in version 6.0, not defining it is deprecated.', __METHOD__); diff --git a/plugins/email/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php b/plugins/email/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php index 6e9a02b..5b60942 100644 --- a/plugins/email/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php +++ b/plugins/email/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php @@ -16,6 +16,7 @@ use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\InvalidOptionException; use Symfony\Component\Console\Exception\RuntimeException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -49,7 +50,7 @@ class ConsumeMessagesCommand extends Command private $resetServicesListener; private $busIds; - public function __construct(RoutableMessageBus $routableBus, ContainerInterface $receiverLocator, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null, array $receiverNames = [], ResetServicesListener $resetServicesListener = null, array $busIds = []) + public function __construct(RoutableMessageBus $routableBus, ContainerInterface $receiverLocator, EventDispatcherInterface $eventDispatcher, ?LoggerInterface $logger = null, array $receiverNames = [], ?ResetServicesListener $resetServicesListener = null, array $busIds = []) { $this->routableBus = $routableBus; $this->receiverLocator = $receiverLocator; @@ -133,7 +134,7 @@ EOF { $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output); - if ($this->receiverNames && 0 === \count($input->getArgument('receivers'))) { + if ($this->receiverNames && !$input->getArgument('receivers')) { $io->block('Which transports/receivers do you want to consume?', null, 'fg=white;bg=blue', ' ', true); $io->writeln('Choose which receivers you want to consume messages from in order of priority.'); @@ -147,7 +148,7 @@ EOF $input->setArgument('receivers', $io->askQuestion($question)); } - if (0 === \count($input->getArgument('receivers'))) { + if (!$input->getArgument('receivers')) { throw new RuntimeException('Please pass at least one receiver.'); } } @@ -176,7 +177,11 @@ EOF } $stopsWhen = []; - if ($limit = $input->getOption('limit')) { + if (null !== $limit = $input->getOption('limit')) { + if (!is_numeric($limit) || 0 >= $limit) { + throw new InvalidOptionException(sprintf('Option "limit" must be a positive integer, "%s" passed.', $limit)); + } + $stopsWhen[] = "processed {$limit} messages"; $this->eventDispatcher->addSubscriber(new StopWorkerOnMessageLimitListener($limit, $this->logger)); } @@ -191,7 +196,11 @@ EOF $this->eventDispatcher->addSubscriber(new StopWorkerOnMemoryLimitListener($this->convertToBytes($memoryLimit), $this->logger)); } - if (null !== ($timeLimit = $input->getOption('time-limit'))) { + if (null !== $timeLimit = $input->getOption('time-limit')) { + if (!is_numeric($timeLimit) || 0 >= $timeLimit) { + throw new InvalidOptionException(sprintf('Option "time-limit" must be a positive integer, "%s" passed.', $timeLimit)); + } + $stopsWhen[] = "been running for {$timeLimit}s"; $this->eventDispatcher->addSubscriber(new StopWorkerOnTimeLimitListener($timeLimit, $this->logger)); } @@ -199,7 +208,7 @@ EOF $stopsWhen[] = 'received a stop signal via the messenger:stop-workers command'; $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output); - $io->success(sprintf('Consuming messages from transport%s "%s".', \count($receivers) > 0 ? 's' : '', implode(', ', $receiverNames))); + $io->success(sprintf('Consuming messages from transport%s "%s".', \count($receivers) > 1 ? 's' : '', implode(', ', $receiverNames))); if ($stopsWhen) { $last = array_pop($stopsWhen); diff --git a/plugins/email/vendor/symfony/messenger/Command/FailedMessagesRetryCommand.php b/plugins/email/vendor/symfony/messenger/Command/FailedMessagesRetryCommand.php index 0ef9984..f6ad8a7 100644 --- a/plugins/email/vendor/symfony/messenger/Command/FailedMessagesRetryCommand.php +++ b/plugins/email/vendor/symfony/messenger/Command/FailedMessagesRetryCommand.php @@ -41,7 +41,7 @@ class FailedMessagesRetryCommand extends AbstractFailedMessagesCommand private $messageBus; private $logger; - public function __construct(?string $globalReceiverName, $failureTransports, MessageBusInterface $messageBus, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null) + public function __construct(?string $globalReceiverName, $failureTransports, MessageBusInterface $messageBus, EventDispatcherInterface $eventDispatcher, ?LoggerInterface $logger = null) { $this->eventDispatcher = $eventDispatcher; $this->messageBus = $messageBus; diff --git a/plugins/email/vendor/symfony/messenger/DataCollector/MessengerDataCollector.php b/plugins/email/vendor/symfony/messenger/DataCollector/MessengerDataCollector.php index ef1ec4e..e27457e 100644 --- a/plugins/email/vendor/symfony/messenger/DataCollector/MessengerDataCollector.php +++ b/plugins/email/vendor/symfony/messenger/DataCollector/MessengerDataCollector.php @@ -35,7 +35,7 @@ class MessengerDataCollector extends DataCollector implements LateDataCollectorI /** * {@inheritdoc} */ - public function collect(Request $request, Response $response, \Throwable $exception = null) + public function collect(Request $request, Response $response, ?\Throwable $exception = null) { // Noop. Everything is collected live by the traceable buses & cloned as late as possible. } @@ -121,7 +121,7 @@ class MessengerDataCollector extends DataCollector implements LateDataCollectorI return $debugRepresentation; } - public function getExceptionsCount(string $bus = null): int + public function getExceptionsCount(?string $bus = null): int { $count = 0; foreach ($this->getMessages($bus) as $message) { @@ -131,7 +131,7 @@ class MessengerDataCollector extends DataCollector implements LateDataCollectorI return $count; } - public function getMessages(string $bus = null): array + public function getMessages(?string $bus = null): array { if (null === $bus) { return $this->data['messages']; diff --git a/plugins/email/vendor/symfony/messenger/DependencyInjection/MessengerPass.php b/plugins/email/vendor/symfony/messenger/DependencyInjection/MessengerPass.php index f423889..a659e3d 100644 --- a/plugins/email/vendor/symfony/messenger/DependencyInjection/MessengerPass.php +++ b/plugins/email/vendor/symfony/messenger/DependencyInjection/MessengerPass.php @@ -115,18 +115,16 @@ class MessengerPass implements CompilerPassInterface $options = ['method' => $options]; } - if (!isset($options['from_transport']) && isset($tag['from_transport'])) { - $options['from_transport'] = $tag['from_transport']; - } - - $priority = $tag['priority'] ?? $options['priority'] ?? 0; + $options += array_filter($tag); + unset($options['handles']); + $priority = $options['priority'] ?? 0; $method = $options['method'] ?? '__invoke'; if (isset($options['bus'])) { if (!\in_array($options['bus'], $busIds)) { $messageLocation = isset($tag['handles']) ? 'declared in your tag attribute "handles"' : ($r->implementsInterface(MessageSubscriberInterface::class) ? sprintf('returned by method "%s::getHandledMessages()"', $r->getName()) : sprintf('used as argument type in method "%s::%s()"', $r->getName(), $method)); - throw new RuntimeException(sprintf('Invalid configuration "%s" for message "%s": bus "%s" does not exist.', $messageLocation, $message, $options['bus'])); + throw new RuntimeException(sprintf('Invalid configuration '.$messageLocation.' for message "%s": bus "%s" does not exist.', $message, $options['bus'])); } $buses = [$options['bus']]; @@ -135,7 +133,7 @@ class MessengerPass implements CompilerPassInterface if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) { $messageLocation = isset($tag['handles']) ? 'declared in your tag attribute "handles"' : ($r->implementsInterface(MessageSubscriberInterface::class) ? sprintf('returned by method "%s::getHandledMessages()"', $r->getName()) : sprintf('used as argument type in method "%s::%s()"', $r->getName(), $method)); - throw new RuntimeException(sprintf('Invalid handler service "%s": class or interface "%s" "%s" not found.', $serviceId, $message, $messageLocation)); + throw new RuntimeException(sprintf('Invalid handler service "%s": class or interface "%s" '.$messageLocation.' not found.', $serviceId, $message)); } if (!$r->hasMethod($method)) { @@ -143,7 +141,7 @@ class MessengerPass implements CompilerPassInterface } if ('__invoke' !== $method) { - $wrapperDefinition = (new Definition('callable'))->addArgument([new Reference($serviceId), $method])->setFactory('Closure::fromCallable'); + $wrapperDefinition = (new Definition('Closure'))->addArgument([new Reference($serviceId), $method])->setFactory('Closure::fromCallable'); $definitions[$definitionId = '.messenger.method_on_object_wrapper.'.ContainerBuilder::hash($message.':'.$priority.':'.$serviceId.':'.$method)] = $wrapperDefinition; } else { diff --git a/plugins/email/vendor/symfony/messenger/Envelope.php b/plugins/email/vendor/symfony/messenger/Envelope.php index 49476fe..ad6fd3f 100644 --- a/plugins/email/vendor/symfony/messenger/Envelope.php +++ b/plugins/email/vendor/symfony/messenger/Envelope.php @@ -102,7 +102,7 @@ final class Envelope /** * @return StampInterface[]|StampInterface[][] The stamps for the specified FQCN, or all stamps by their class name */ - public function all(string $stampFqcn = null): array + public function all(?string $stampFqcn = null): array { if (null !== $stampFqcn) { return $this->stamps[$this->resolveAlias($stampFqcn)] ?? []; diff --git a/plugins/email/vendor/symfony/messenger/Event/WorkerMessageReceivedEvent.php b/plugins/email/vendor/symfony/messenger/Event/WorkerMessageReceivedEvent.php index 5b99edc..2842949 100644 --- a/plugins/email/vendor/symfony/messenger/Event/WorkerMessageReceivedEvent.php +++ b/plugins/email/vendor/symfony/messenger/Event/WorkerMessageReceivedEvent.php @@ -20,7 +20,7 @@ final class WorkerMessageReceivedEvent extends AbstractWorkerMessageEvent { private $shouldHandle = true; - public function shouldHandle(bool $shouldHandle = null): bool + public function shouldHandle(?bool $shouldHandle = null): bool { if (null !== $shouldHandle) { $this->shouldHandle = $shouldHandle; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageForRetryListener.php b/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageForRetryListener.php index dab74b2..e87aaef 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageForRetryListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageForRetryListener.php @@ -39,7 +39,7 @@ class SendFailedMessageForRetryListener implements EventSubscriberInterface private $eventDispatcher; private $historySize; - public function __construct(ContainerInterface $sendersLocator, ContainerInterface $retryStrategyLocator, LoggerInterface $logger = null, EventDispatcherInterface $eventDispatcher = null, int $historySize = 10) + public function __construct(ContainerInterface $sendersLocator, ContainerInterface $retryStrategyLocator, ?LoggerInterface $logger = null, ?EventDispatcherInterface $eventDispatcher = null, int $historySize = 10) { $this->sendersLocator = $sendersLocator; $this->retryStrategyLocator = $retryStrategyLocator; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageToFailureTransportListener.php b/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageToFailureTransportListener.php index 644f5a6..86004b2 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageToFailureTransportListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/SendFailedMessageToFailureTransportListener.php @@ -33,7 +33,7 @@ class SendFailedMessageToFailureTransportListener implements EventSubscriberInte /** * @param ContainerInterface $failureSenders */ - public function __construct($failureSenders, LoggerInterface $logger = null) + public function __construct($failureSenders, ?LoggerInterface $logger = null) { if (!$failureSenders instanceof ContainerInterface) { trigger_deprecation('symfony/messenger', '5.3', 'Passing a SenderInterface value as 1st argument to "%s()" is deprecated, pass a ServiceLocator instead.', __METHOD__); diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnFailureLimitListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnFailureLimitListener.php index 29dc6aa..e0eb6eb 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnFailureLimitListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnFailureLimitListener.php @@ -26,7 +26,7 @@ class StopWorkerOnFailureLimitListener implements EventSubscriberInterface private $logger; private $failedMessages = 0; - public function __construct(int $maximumNumberOfFailures, LoggerInterface $logger = null) + public function __construct(int $maximumNumberOfFailures, ?LoggerInterface $logger = null) { $this->maximumNumberOfFailures = $maximumNumberOfFailures; $this->logger = $logger; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMemoryLimitListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMemoryLimitListener.php index 73350fd..6f707e7 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMemoryLimitListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMemoryLimitListener.php @@ -25,7 +25,7 @@ class StopWorkerOnMemoryLimitListener implements EventSubscriberInterface private $logger; private $memoryResolver; - public function __construct(int $memoryLimit, LoggerInterface $logger = null, callable $memoryResolver = null) + public function __construct(int $memoryLimit, ?LoggerInterface $logger = null, ?callable $memoryResolver = null) { $this->memoryLimit = $memoryLimit; $this->logger = $logger; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMessageLimitListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMessageLimitListener.php index ca71ff1..5aa801c 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMessageLimitListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnMessageLimitListener.php @@ -26,7 +26,7 @@ class StopWorkerOnMessageLimitListener implements EventSubscriberInterface private $logger; private $receivedMessages = 0; - public function __construct(int $maximumNumberOfMessages, LoggerInterface $logger = null) + public function __construct(int $maximumNumberOfMessages, ?LoggerInterface $logger = null) { $this->maximumNumberOfMessages = $maximumNumberOfMessages; $this->logger = $logger; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnRestartSignalListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnRestartSignalListener.php index 0fb3d40..7e4f219 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnRestartSignalListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnRestartSignalListener.php @@ -28,7 +28,7 @@ class StopWorkerOnRestartSignalListener implements EventSubscriberInterface private $logger; private $workerStartedAt; - public function __construct(CacheItemPoolInterface $cachePool, LoggerInterface $logger = null) + public function __construct(CacheItemPoolInterface $cachePool, ?LoggerInterface $logger = null) { $this->cachePool = $cachePool; $this->logger = $logger; diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnSigtermSignalListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnSigtermSignalListener.php index c865546..e2dfe2e 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnSigtermSignalListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnSigtermSignalListener.php @@ -22,7 +22,7 @@ class StopWorkerOnSigtermSignalListener implements EventSubscriberInterface { private $logger; - public function __construct(LoggerInterface $logger = null) + public function __construct(?LoggerInterface $logger = null) { $this->logger = $logger; } diff --git a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnTimeLimitListener.php b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnTimeLimitListener.php index a3f982d..c16e714 100644 --- a/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnTimeLimitListener.php +++ b/plugins/email/vendor/symfony/messenger/EventListener/StopWorkerOnTimeLimitListener.php @@ -15,6 +15,7 @@ use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Messenger\Event\WorkerRunningEvent; use Symfony\Component\Messenger\Event\WorkerStartedEvent; +use Symfony\Component\Messenger\Exception\InvalidArgumentException; /** * @author Simon Delicata @@ -26,10 +27,14 @@ class StopWorkerOnTimeLimitListener implements EventSubscriberInterface private $logger; private $endTime; - public function __construct(int $timeLimitInSeconds, LoggerInterface $logger = null) + public function __construct(int $timeLimitInSeconds, ?LoggerInterface $logger = null) { $this->timeLimitInSeconds = $timeLimitInSeconds; $this->logger = $logger; + + if ($timeLimitInSeconds <= 0) { + throw new InvalidArgumentException('Time limit must be greater than zero.'); + } } public function onWorkerStarted(): void diff --git a/plugins/email/vendor/symfony/messenger/Exception/StopWorkerException.php b/plugins/email/vendor/symfony/messenger/Exception/StopWorkerException.php index e53bd32..c2100c2 100644 --- a/plugins/email/vendor/symfony/messenger/Exception/StopWorkerException.php +++ b/plugins/email/vendor/symfony/messenger/Exception/StopWorkerException.php @@ -16,7 +16,7 @@ namespace Symfony\Component\Messenger\Exception; */ class StopWorkerException extends RuntimeException implements StopWorkerExceptionInterface { - public function __construct(string $message = 'Worker should stop.', \Throwable $previous = null) + public function __construct(string $message = 'Worker should stop.', ?\Throwable $previous = null) { parent::__construct($message, 0, $previous); } diff --git a/plugins/email/vendor/symfony/messenger/Handler/Acknowledger.php b/plugins/email/vendor/symfony/messenger/Handler/Acknowledger.php index a2317b7..6b62e52 100644 --- a/plugins/email/vendor/symfony/messenger/Handler/Acknowledger.php +++ b/plugins/email/vendor/symfony/messenger/Handler/Acknowledger.php @@ -24,9 +24,9 @@ class Acknowledger private $result = null; /** - * @param null|\Closure(\Throwable|null, mixed):void $ack + * @param \Closure(\Throwable|null, mixed):void|null $ack */ - public function __construct(string $handlerClass, \Closure $ack = null) + public function __construct(string $handlerClass, ?\Closure $ack = null) { $this->handlerClass = $handlerClass; $this->ack = $ack ?? static function () {}; @@ -70,7 +70,7 @@ class Acknowledger } } - private function doAck(\Throwable $e = null, $result = null): void + private function doAck(?\Throwable $e = null, $result = null): void { if (!$ack = $this->ack) { throw new LogicException(sprintf('The acknowledger cannot be called twice by the "%s" batch handler.', $this->handlerClass)); diff --git a/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerInterface.php b/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerInterface.php index a2fce4e..42a8590 100644 --- a/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerInterface.php +++ b/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerInterface.php @@ -23,7 +23,7 @@ interface BatchHandlerInterface * @return mixed The number of pending messages in the batch if $ack is not null, * the result from handling the message otherwise */ - // public function __invoke(object $message, Acknowledger $ack = null): mixed; + // public function __invoke(object $message, ?Acknowledger $ack = null): mixed; /** * Flushes any pending buffers. diff --git a/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerTrait.php b/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerTrait.php index be7124d..539956e 100644 --- a/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerTrait.php +++ b/plugins/email/vendor/symfony/messenger/Handler/BatchHandlerTrait.php @@ -66,7 +66,7 @@ trait BatchHandlerTrait /** * Completes the jobs in the list. * - * @list $jobs A list of pairs of messages and their corresponding acknowledgers + * @param list $jobs A list of pairs of messages and their corresponding acknowledgers */ private function process(array $jobs): void { diff --git a/plugins/email/vendor/symfony/messenger/Handler/HandlerDescriptor.php b/plugins/email/vendor/symfony/messenger/Handler/HandlerDescriptor.php index 6acb2c2..5957e3f 100644 --- a/plugins/email/vendor/symfony/messenger/Handler/HandlerDescriptor.php +++ b/plugins/email/vendor/symfony/messenger/Handler/HandlerDescriptor.php @@ -37,7 +37,7 @@ final class HandlerDescriptor if (str_contains($r->name, '{closure}')) { $this->name = 'Closure'; } elseif (!$handler = $r->getClosureThis()) { - $class = $r->getClosureScopeClass(); + $class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass(); $this->name = ($class ? $class->name.'::' : '').$r->name; } else { diff --git a/plugins/email/vendor/symfony/messenger/LICENSE b/plugins/email/vendor/symfony/messenger/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/messenger/LICENSE +++ b/plugins/email/vendor/symfony/messenger/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php b/plugins/email/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php index 149f304..13f49bd 100644 --- a/plugins/email/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php +++ b/plugins/email/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php @@ -57,8 +57,10 @@ class HandleMessageMiddleware implements MiddlewareInterface ]; $exceptions = []; + $alreadyHandled = false; foreach ($this->handlersLocator->getHandlers($envelope) as $handlerDescriptor) { if ($this->messageHasAlreadyBeenHandled($envelope, $handlerDescriptor)) { + $alreadyHandled = true; continue; } @@ -68,7 +70,7 @@ class HandleMessageMiddleware implements MiddlewareInterface /** @var AckStamp $ackStamp */ if ($batchHandler && $ackStamp = $envelope->last(AckStamp::class)) { - $ack = new Acknowledger(get_debug_type($batchHandler), static function (\Throwable $e = null, $result = null) use ($envelope, $ackStamp, $handlerDescriptor) { + $ack = new Acknowledger(get_debug_type($batchHandler), static function (?\Throwable $e = null, $result = null) use ($envelope, $ackStamp, $handlerDescriptor) { if (null !== $e) { $e = new HandlerFailedException($envelope, [$e]); } else { @@ -116,7 +118,7 @@ class HandleMessageMiddleware implements MiddlewareInterface } } - if (null === $handler) { + if (null === $handler && !$alreadyHandled) { if (!$this->allowNoHandlers) { throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $context['class'])); } diff --git a/plugins/email/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php b/plugins/email/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php index 669fe76..794310c 100644 --- a/plugins/email/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php +++ b/plugins/email/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php @@ -33,7 +33,7 @@ class SendMessageMiddleware implements MiddlewareInterface private $sendersLocator; private $eventDispatcher; - public function __construct(SendersLocatorInterface $sendersLocator, EventDispatcherInterface $eventDispatcher = null) + public function __construct(SendersLocatorInterface $sendersLocator, ?EventDispatcherInterface $eventDispatcher = null) { $this->sendersLocator = $sendersLocator; $this->eventDispatcher = class_exists(Event::class) ? LegacyEventDispatcherProxy::decorate($eventDispatcher) : $eventDispatcher; diff --git a/plugins/email/vendor/symfony/messenger/Middleware/TraceableMiddleware.php b/plugins/email/vendor/symfony/messenger/Middleware/TraceableMiddleware.php index f391cfe..3297fc8 100644 --- a/plugins/email/vendor/symfony/messenger/Middleware/TraceableMiddleware.php +++ b/plugins/email/vendor/symfony/messenger/Middleware/TraceableMiddleware.php @@ -94,4 +94,9 @@ class TraceableStack implements StackInterface } $this->currentEvent = null; } + + public function __clone() + { + $this->stack = clone $this->stack; + } } diff --git a/plugins/email/vendor/symfony/messenger/Retry/MultiplierRetryStrategy.php b/plugins/email/vendor/symfony/messenger/Retry/MultiplierRetryStrategy.php index c081830..4a1b9a1 100644 --- a/plugins/email/vendor/symfony/messenger/Retry/MultiplierRetryStrategy.php +++ b/plugins/email/vendor/symfony/messenger/Retry/MultiplierRetryStrategy.php @@ -66,7 +66,7 @@ class MultiplierRetryStrategy implements RetryStrategyInterface /** * @param \Throwable|null $throwable The cause of the failed handling */ - public function isRetryable(Envelope $message, \Throwable $throwable = null): bool + public function isRetryable(Envelope $message, ?\Throwable $throwable = null): bool { $retries = RedeliveryStamp::getRetryCountFromEnvelope($message); @@ -76,7 +76,7 @@ class MultiplierRetryStrategy implements RetryStrategyInterface /** * @param \Throwable|null $throwable The cause of the failed handling */ - public function getWaitingTime(Envelope $message, \Throwable $throwable = null): int + public function getWaitingTime(Envelope $message, ?\Throwable $throwable = null): int { $retries = RedeliveryStamp::getRetryCountFromEnvelope($message); diff --git a/plugins/email/vendor/symfony/messenger/Retry/RetryStrategyInterface.php b/plugins/email/vendor/symfony/messenger/Retry/RetryStrategyInterface.php index 52c294b..7abce0d 100644 --- a/plugins/email/vendor/symfony/messenger/Retry/RetryStrategyInterface.php +++ b/plugins/email/vendor/symfony/messenger/Retry/RetryStrategyInterface.php @@ -23,12 +23,12 @@ interface RetryStrategyInterface /** * @param \Throwable|null $throwable The cause of the failed handling */ - public function isRetryable(Envelope $message/* , \Throwable $throwable = null */): bool; + public function isRetryable(Envelope $message/* , ?\Throwable $throwable = null */): bool; /** * @param \Throwable|null $throwable The cause of the failed handling * * @return int The time to delay/wait in milliseconds */ - public function getWaitingTime(Envelope $message/* , \Throwable $throwable = null */): int; + public function getWaitingTime(Envelope $message/* , ?\Throwable $throwable = null */): int; } diff --git a/plugins/email/vendor/symfony/messenger/RoutableMessageBus.php b/plugins/email/vendor/symfony/messenger/RoutableMessageBus.php index ece1478..190d45c 100644 --- a/plugins/email/vendor/symfony/messenger/RoutableMessageBus.php +++ b/plugins/email/vendor/symfony/messenger/RoutableMessageBus.php @@ -28,7 +28,7 @@ class RoutableMessageBus implements MessageBusInterface private $busLocator; private $fallbackBus; - public function __construct(ContainerInterface $busLocator, MessageBusInterface $fallbackBus = null) + public function __construct(ContainerInterface $busLocator, ?MessageBusInterface $fallbackBus = null) { $this->busLocator = $busLocator; $this->fallbackBus = $fallbackBus; diff --git a/plugins/email/vendor/symfony/messenger/Stamp/AckStamp.php b/plugins/email/vendor/symfony/messenger/Stamp/AckStamp.php index b94c2c9..e2716e1 100644 --- a/plugins/email/vendor/symfony/messenger/Stamp/AckStamp.php +++ b/plugins/email/vendor/symfony/messenger/Stamp/AckStamp.php @@ -28,7 +28,7 @@ final class AckStamp implements NonSendableStampInterface $this->ack = $ack; } - public function ack(Envelope $envelope, \Throwable $e = null): void + public function ack(Envelope $envelope, ?\Throwable $e = null): void { ($this->ack)($envelope, $e); } diff --git a/plugins/email/vendor/symfony/messenger/Stamp/ErrorDetailsStamp.php b/plugins/email/vendor/symfony/messenger/Stamp/ErrorDetailsStamp.php index 62abf23..9805671 100644 --- a/plugins/email/vendor/symfony/messenger/Stamp/ErrorDetailsStamp.php +++ b/plugins/email/vendor/symfony/messenger/Stamp/ErrorDetailsStamp.php @@ -13,7 +13,6 @@ namespace Symfony\Component\Messenger\Stamp; use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\Messenger\Exception\HandlerFailedException; -use Throwable; /** * Stamp applied when a messages fails due to an exception in the handler. @@ -35,7 +34,7 @@ final class ErrorDetailsStamp implements StampInterface /** * @param int|string $exceptionCode */ - public function __construct(string $exceptionClass, $exceptionCode, string $exceptionMessage, FlattenException $flattenException = null) + public function __construct(string $exceptionClass, $exceptionCode, string $exceptionMessage, ?FlattenException $flattenException = null) { $this->exceptionClass = $exceptionClass; $this->exceptionCode = $exceptionCode; @@ -43,7 +42,7 @@ final class ErrorDetailsStamp implements StampInterface $this->flattenException = $flattenException; } - public static function create(Throwable $throwable): self + public static function create(\Throwable $throwable): self { if ($throwable instanceof HandlerFailedException) { $throwable = $throwable->getPrevious(); diff --git a/plugins/email/vendor/symfony/messenger/Stamp/RedeliveryStamp.php b/plugins/email/vendor/symfony/messenger/Stamp/RedeliveryStamp.php index fef9b06..ab0aa74 100644 --- a/plugins/email/vendor/symfony/messenger/Stamp/RedeliveryStamp.php +++ b/plugins/email/vendor/symfony/messenger/Stamp/RedeliveryStamp.php @@ -25,31 +25,19 @@ final class RedeliveryStamp implements StampInterface private $flattenException; /** - * @param \DateTimeInterface|null $exceptionMessage + * @param \DateTimeInterface|null $redeliveredAt */ - public function __construct(int $retryCount, $exceptionMessage = null, FlattenException $flattenException = null, \DateTimeInterface $redeliveredAt = null) + public function __construct(int $retryCount, $redeliveredAt = null) { + if (2 < \func_num_args() || null !== $redeliveredAt && !$redeliveredAt instanceof \DateTimeInterface) { + trigger_deprecation('symfony/messenger', '5.2', sprintf('Using parameters "$exceptionMessage" or "$flattenException" of class "%s" is deprecated, use "%s" instead and/or pass "$redeliveredAt" as parameter #2.', self::class, ErrorDetailsStamp::class)); + $this->exceptionMessage = $redeliveredAt instanceof \DateTimeInterface ? null : $redeliveredAt; + $redeliveredAt = 4 <= \func_num_args() ? func_get_arg(3) : ($redeliveredAt instanceof \DateTimeInterface ? $redeliveredAt : null); + $this->flattenException = 3 <= \func_num_args() ? func_get_arg(2) : null; + } + $this->retryCount = $retryCount; $this->redeliveredAt = $redeliveredAt ?? new \DateTimeImmutable(); - if (null !== $redeliveredAt) { - trigger_deprecation('symfony/messenger', '5.2', sprintf('Using the "$redeliveredAt" as 4th argument of the "%s::__construct()" is deprecated, pass "$redeliveredAt" as second argument instead.', self::class)); - } - - if ($exceptionMessage instanceof \DateTimeInterface) { - // In Symfony 6.0, the second argument will be $redeliveredAt - $this->redeliveredAt = $exceptionMessage; - if (null !== $redeliveredAt) { - throw new \LogicException('It is deprecated to specify a redeliveredAt as 4th argument. The correct way is to specify redeliveredAt as the second argument. Using both is not allowed.'); - } - } elseif (null !== $exceptionMessage) { - trigger_deprecation('symfony/messenger', '5.2', sprintf('Using the "$exceptionMessage" parameter in the "%s" class is deprecated, use the "%s" class instead.', self::class, ErrorDetailsStamp::class)); - $this->exceptionMessage = $exceptionMessage; - } - - if (null !== $flattenException) { - trigger_deprecation('symfony/messenger', '5.2', sprintf('Using the "$flattenException" parameter in the "%s" class is deprecated, use the "%s" class instead.', self::class, ErrorDetailsStamp::class)); - } - $this->flattenException = $flattenException; } public static function getRetryCountFromEnvelope(Envelope $envelope): int diff --git a/plugins/email/vendor/symfony/messenger/Stamp/SentStamp.php b/plugins/email/vendor/symfony/messenger/Stamp/SentStamp.php index eebbfc3..5b7b2ef 100644 --- a/plugins/email/vendor/symfony/messenger/Stamp/SentStamp.php +++ b/plugins/email/vendor/symfony/messenger/Stamp/SentStamp.php @@ -23,7 +23,7 @@ final class SentStamp implements NonSendableStampInterface private $senderClass; private $senderAlias; - public function __construct(string $senderClass, string $senderAlias = null) + public function __construct(string $senderClass, ?string $senderAlias = null) { $this->senderAlias = $senderAlias; $this->senderClass = $senderClass; diff --git a/plugins/email/vendor/symfony/messenger/Test/Middleware/MiddlewareTestCase.php b/plugins/email/vendor/symfony/messenger/Test/Middleware/MiddlewareTestCase.php index 08c3d6a..99fc294 100644 --- a/plugins/email/vendor/symfony/messenger/Test/Middleware/MiddlewareTestCase.php +++ b/plugins/email/vendor/symfony/messenger/Test/Middleware/MiddlewareTestCase.php @@ -46,7 +46,7 @@ abstract class MiddlewareTestCase extends TestCase return new StackMiddleware($nextMiddleware); } - protected function getThrowingStackMock(\Throwable $throwable = null) + protected function getThrowingStackMock(?\Throwable $throwable = null) { $nextMiddleware = $this->createMock(MiddlewareInterface::class); $nextMiddleware diff --git a/plugins/email/vendor/symfony/messenger/Transport/InMemoryTransport.php b/plugins/email/vendor/symfony/messenger/Transport/InMemoryTransport.php index eedbb9c..d403ae0 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/InMemoryTransport.php +++ b/plugins/email/vendor/symfony/messenger/Transport/InMemoryTransport.php @@ -51,7 +51,7 @@ class InMemoryTransport implements TransportInterface, ResetInterface */ private $serializer; - public function __construct(SerializerInterface $serializer = null) + public function __construct(?SerializerInterface $serializer = null) { $this->serializer = $serializer; } diff --git a/plugins/email/vendor/symfony/messenger/Transport/Receiver/ListableReceiverInterface.php b/plugins/email/vendor/symfony/messenger/Transport/Receiver/ListableReceiverInterface.php index 897c7a5..ede5dc8 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/Receiver/ListableReceiverInterface.php +++ b/plugins/email/vendor/symfony/messenger/Transport/Receiver/ListableReceiverInterface.php @@ -29,7 +29,7 @@ interface ListableReceiverInterface extends ReceiverInterface * * @return Envelope[]|iterable */ - public function all(int $limit = null): iterable; + public function all(?int $limit = null): iterable; /** * Returns the Envelope by id or none. diff --git a/plugins/email/vendor/symfony/messenger/Transport/Receiver/ReceiverInterface.php b/plugins/email/vendor/symfony/messenger/Transport/Receiver/ReceiverInterface.php index 68f72c5..01e1ca9 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/Receiver/ReceiverInterface.php +++ b/plugins/email/vendor/symfony/messenger/Transport/Receiver/ReceiverInterface.php @@ -39,9 +39,9 @@ interface ReceiverInterface * be retried again (e.g. if there's a queue, it should be removed) * and a MessageDecodingFailedException should be thrown. * - * @throws TransportException If there is an issue communicating with the transport - * * @return Envelope[] + * + * @throws TransportException If there is an issue communicating with the transport */ public function get(): iterable; diff --git a/plugins/email/vendor/symfony/messenger/Transport/Serialization/Normalizer/FlattenExceptionNormalizer.php b/plugins/email/vendor/symfony/messenger/Transport/Serialization/Normalizer/FlattenExceptionNormalizer.php index 5f335d0..bacb4a7 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/Serialization/Normalizer/FlattenExceptionNormalizer.php +++ b/plugins/email/vendor/symfony/messenger/Transport/Serialization/Normalizer/FlattenExceptionNormalizer.php @@ -32,7 +32,7 @@ final class FlattenExceptionNormalizer implements DenormalizerInterface, Context * * @throws InvalidArgumentException */ - public function normalize($object, string $format = null, array $context = []): array + public function normalize($object, ?string $format = null, array $context = []): array { $normalized = [ 'message' => $object->getMessage(), @@ -54,7 +54,7 @@ final class FlattenExceptionNormalizer implements DenormalizerInterface, Context /** * {@inheritdoc} */ - public function supportsNormalization($data, string $format = null, array $context = []): bool + public function supportsNormalization($data, ?string $format = null, array $context = []): bool { return $data instanceof FlattenException && ($context[Serializer::MESSENGER_SERIALIZATION_CONTEXT] ?? false); } @@ -62,7 +62,7 @@ final class FlattenExceptionNormalizer implements DenormalizerInterface, Context /** * {@inheritdoc} */ - public function denormalize($data, string $type, string $format = null, array $context = []): FlattenException + public function denormalize($data, string $type, ?string $format = null, array $context = []): FlattenException { $object = new FlattenException(); @@ -93,7 +93,7 @@ final class FlattenExceptionNormalizer implements DenormalizerInterface, Context /** * {@inheritdoc} */ - public function supportsDenormalization($data, string $type, string $format = null, array $context = []): bool + public function supportsDenormalization($data, string $type, ?string $format = null, array $context = []): bool { return FlattenException::class === $type && ($context[Serializer::MESSENGER_SERIALIZATION_CONTEXT] ?? false); } diff --git a/plugins/email/vendor/symfony/messenger/Transport/Serialization/PhpSerializer.php b/plugins/email/vendor/symfony/messenger/Transport/Serialization/PhpSerializer.php index e6332b3..0af44fd 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/Serialization/PhpSerializer.php +++ b/plugins/email/vendor/symfony/messenger/Transport/Serialization/PhpSerializer.php @@ -20,9 +20,6 @@ use Symfony\Component\Messenger\Stamp\NonSendableStampInterface; */ class PhpSerializer implements SerializerInterface { - /** - * {@inheritdoc} - */ public function decode(array $encodedEnvelope): Envelope { if (empty($encodedEnvelope['body'])) { @@ -38,9 +35,6 @@ class PhpSerializer implements SerializerInterface return $this->safelyUnserialize($serializeEnvelope); } - /** - * {@inheritdoc} - */ public function encode(Envelope $envelope): array { $envelope = $envelope->withoutStampsOfType(NonSendableStampInterface::class); @@ -62,24 +56,30 @@ class PhpSerializer implements SerializerInterface throw new MessageDecodingFailedException('Could not decode an empty message using PHP serialization.'); } - $signalingException = new MessageDecodingFailedException(sprintf('Could not decode message using PHP serialization: %s.', $contents)); $prevUnserializeHandler = ini_set('unserialize_callback_func', self::class.'::handleUnserializeCallback'); - $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler, $signalingException) { - if (__FILE__ === $file) { - throw $signalingException; + $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler) { + if (__FILE__ === $file && !\in_array($type, [\E_DEPRECATED, \E_USER_DEPRECATED], true)) { + throw new \ErrorException($msg, 0, $type, $file, $line); } return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; }); try { - $meta = unserialize($contents); + /** @var Envelope */ + $envelope = unserialize($contents); + } catch (\Throwable $e) { + if ($e instanceof MessageDecodingFailedException) { + throw $e; + } + + throw new MessageDecodingFailedException('Could not decode Envelope: '.$e->getMessage(), 0, $e); } finally { restore_error_handler(); ini_set('unserialize_callback_func', $prevUnserializeHandler); } - return $meta; + return $envelope; } /** diff --git a/plugins/email/vendor/symfony/messenger/Transport/Serialization/Serializer.php b/plugins/email/vendor/symfony/messenger/Transport/Serialization/Serializer.php index 6142266..dcdf28f 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/Serialization/Serializer.php +++ b/plugins/email/vendor/symfony/messenger/Transport/Serialization/Serializer.php @@ -21,6 +21,7 @@ use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Encoder\XmlEncoder; use Symfony\Component\Serializer\Exception\ExceptionInterface; use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; +use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Serializer as SymfonySerializer; use Symfony\Component\Serializer\SerializerInterface as SymfonySerializerInterface; @@ -37,7 +38,7 @@ class Serializer implements SerializerInterface private $format; private $context; - public function __construct(SymfonySerializerInterface $serializer = null, string $format = 'json', array $context = []) + public function __construct(?SymfonySerializerInterface $serializer = null, string $format = 'json', array $context = []) { $this->serializer = $serializer ?? self::create()->serializer; $this->format = $format; @@ -51,7 +52,7 @@ class Serializer implements SerializerInterface } $encoders = [new XmlEncoder(), new JsonEncoder()]; - $normalizers = [new ArrayDenormalizer(), new ObjectNormalizer()]; + $normalizers = [new DateTimeNormalizer(), new ArrayDenormalizer(), new ObjectNormalizer()]; $serializer = new SymfonySerializer($normalizers, $encoders); return new self($serializer); diff --git a/plugins/email/vendor/symfony/messenger/Transport/TransportFactory.php b/plugins/email/vendor/symfony/messenger/Transport/TransportFactory.php index 474dd6f..a6fa16e 100644 --- a/plugins/email/vendor/symfony/messenger/Transport/TransportFactory.php +++ b/plugins/email/vendor/symfony/messenger/Transport/TransportFactory.php @@ -51,7 +51,7 @@ class TransportFactory implements TransportFactoryInterface $packageSuggestion = ' Run "composer require symfony/beanstalkd-messenger" to install Beanstalkd transport.'; } - throw new InvalidArgumentException(sprintf('No transport supports the given Messenger DSN "%s".%s.', $dsn, $packageSuggestion)); + throw new InvalidArgumentException('No transport supports the given Messenger DSN.'.$packageSuggestion); } public function supports(string $dsn, array $options): bool diff --git a/plugins/email/vendor/symfony/messenger/Worker.php b/plugins/email/vendor/symfony/messenger/Worker.php index 33358d3..bba19aa 100644 --- a/plugins/email/vendor/symfony/messenger/Worker.php +++ b/plugins/email/vendor/symfony/messenger/Worker.php @@ -52,7 +52,7 @@ class Worker /** * @param ReceiverInterface[] $receivers Where the key is the transport name */ - public function __construct(array $receivers, MessageBusInterface $bus, EventDispatcherInterface $eventDispatcher = null, LoggerInterface $logger = null) + public function __construct(array $receivers, MessageBusInterface $bus, ?EventDispatcherInterface $eventDispatcher = null, ?LoggerInterface $logger = null) { $this->receivers = $receivers; $this->bus = $bus; @@ -148,7 +148,7 @@ class Worker } $acked = false; - $ack = function (Envelope $envelope, \Throwable $e = null) use ($transportName, &$acked) { + $ack = function (Envelope $envelope, ?\Throwable $e = null) use ($transportName, &$acked) { $acked = true; $this->acks[] = [$transportName, $envelope, $e]; }; diff --git a/plugins/email/vendor/symfony/mime/Crypto/SMimeEncrypter.php b/plugins/email/vendor/symfony/mime/Crypto/SMimeEncrypter.php index 9081860..e92b37b 100644 --- a/plugins/email/vendor/symfony/mime/Crypto/SMimeEncrypter.php +++ b/plugins/email/vendor/symfony/mime/Crypto/SMimeEncrypter.php @@ -26,7 +26,7 @@ final class SMimeEncrypter extends SMime * @param string|string[] $certificate The path (or array of paths) of the file(s) containing the X.509 certificate(s) * @param int|null $cipher A set of algorithms used to encrypt the message. Must be one of these PHP constants: https://www.php.net/manual/en/openssl.ciphers.php */ - public function __construct($certificate, int $cipher = null) + public function __construct($certificate, ?int $cipher = null) { if (!\extension_loaded('openssl')) { throw new \LogicException('PHP extension "openssl" is required to use SMime.'); diff --git a/plugins/email/vendor/symfony/mime/Crypto/SMimeSigner.php b/plugins/email/vendor/symfony/mime/Crypto/SMimeSigner.php index 5b94a45..94c2bbd 100644 --- a/plugins/email/vendor/symfony/mime/Crypto/SMimeSigner.php +++ b/plugins/email/vendor/symfony/mime/Crypto/SMimeSigner.php @@ -31,7 +31,7 @@ final class SMimeSigner extends SMime * @param string|null $extraCerts The path of the file containing intermediate certificates (in PEM format) needed by the signing certificate * @param int|null $signOptions Bitwise operator options for openssl_pkcs7_sign() (@see https://secure.php.net/manual/en/openssl.pkcs7.flags.php) */ - public function __construct(string $certificate, string $privateKey, string $privateKeyPassphrase = null, string $extraCerts = null, int $signOptions = null) + public function __construct(string $certificate, string $privateKey, ?string $privateKeyPassphrase = null, ?string $extraCerts = null, ?int $signOptions = null) { if (!\extension_loaded('openssl')) { throw new \LogicException('PHP extension "openssl" is required to use SMime.'); diff --git a/plugins/email/vendor/symfony/mime/Email.php b/plugins/email/vendor/symfony/mime/Email.php index bd0a476..5365294 100644 --- a/plugins/email/vendor/symfony/mime/Email.php +++ b/plugins/email/vendor/symfony/mime/Email.php @@ -121,6 +121,10 @@ class Email extends Message */ public function from(...$addresses) { + if (!$addresses) { + throw new LogicException('"from()" must be called with at least one address.'); + } + return $this->setListAddressHeaderBody('From', $addresses); } @@ -342,7 +346,7 @@ class Email extends Message * * @return $this */ - public function attach($body, string $name = null, string $contentType = null) + public function attach($body, ?string $name = null, ?string $contentType = null) { if (!\is_string($body) && !\is_resource($body)) { throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); @@ -357,7 +361,7 @@ class Email extends Message /** * @return $this */ - public function attachFromPath(string $path, string $name = null, string $contentType = null) + public function attachFromPath(string $path, ?string $name = null, ?string $contentType = null) { $this->cachedBody = null; $this->attachments[] = ['path' => $path, 'name' => $name, 'content-type' => $contentType, 'inline' => false]; @@ -370,7 +374,7 @@ class Email extends Message * * @return $this */ - public function embed($body, string $name = null, string $contentType = null) + public function embed($body, ?string $name = null, ?string $contentType = null) { if (!\is_string($body) && !\is_resource($body)) { throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); @@ -385,7 +389,7 @@ class Email extends Message /** * @return $this */ - public function embedFromPath(string $path, string $name = null, string $contentType = null) + public function embedFromPath(string $path, ?string $name = null, ?string $contentType = null) { $this->cachedBody = null; $this->attachments[] = ['path' => $path, 'name' => $name, 'content-type' => $contentType, 'inline' => true]; diff --git a/plugins/email/vendor/symfony/mime/FileinfoMimeTypeGuesser.php b/plugins/email/vendor/symfony/mime/FileinfoMimeTypeGuesser.php index c6c7559..1208976 100644 --- a/plugins/email/vendor/symfony/mime/FileinfoMimeTypeGuesser.php +++ b/plugins/email/vendor/symfony/mime/FileinfoMimeTypeGuesser.php @@ -24,11 +24,11 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface private $magicFile; /** - * @param string $magicFile A magic file to use with the finfo instance + * @param string|null $magicFile A magic file to use with the finfo instance * * @see http://www.php.net/manual/en/function.finfo-open.php */ - public function __construct(string $magicFile = null) + public function __construct(?string $magicFile = null) { $this->magicFile = $magicFile; } diff --git a/plugins/email/vendor/symfony/mime/Header/AbstractHeader.php b/plugins/email/vendor/symfony/mime/Header/AbstractHeader.php index 5de9066..d61df57 100644 --- a/plugins/email/vendor/symfony/mime/Header/AbstractHeader.php +++ b/plugins/email/vendor/symfony/mime/Header/AbstractHeader.php @@ -231,7 +231,7 @@ abstract class AbstractHeader implements HeaderInterface /** * Generate a list of all tokens in the final header. */ - protected function toTokens(string $string = null): array + protected function toTokens(?string $string = null): array { if (null === $string) { $string = $this->getBodyAsString(); diff --git a/plugins/email/vendor/symfony/mime/Header/Headers.php b/plugins/email/vendor/symfony/mime/Header/Headers.php index 8db9125..b1ebf9a 100644 --- a/plugins/email/vendor/symfony/mime/Header/Headers.php +++ b/plugins/email/vendor/symfony/mime/Header/Headers.php @@ -190,7 +190,7 @@ final class Headers return array_shift($values); } - public function all(string $name = null): iterable + public function all(?string $name = null): iterable { if (null === $name) { foreach ($this->headers as $name => $collection) { diff --git a/plugins/email/vendor/symfony/mime/Header/MailboxListHeader.php b/plugins/email/vendor/symfony/mime/Header/MailboxListHeader.php index 1d00fdb..ee2a26c 100644 --- a/plugins/email/vendor/symfony/mime/Header/MailboxListHeader.php +++ b/plugins/email/vendor/symfony/mime/Header/MailboxListHeader.php @@ -44,9 +44,9 @@ final class MailboxListHeader extends AbstractHeader } /** - * @throws RfcComplianceException - * * @return Address[] + * + * @throws RfcComplianceException */ public function getBody(): array { @@ -99,9 +99,9 @@ final class MailboxListHeader extends AbstractHeader /** * Gets the full mailbox list of this Header as an array of valid RFC 2822 strings. * - * @throws RfcComplianceException - * * @return string[] + * + * @throws RfcComplianceException */ public function getAddressStrings(): array { diff --git a/plugins/email/vendor/symfony/mime/Header/ParameterizedHeader.php b/plugins/email/vendor/symfony/mime/Header/ParameterizedHeader.php index e5d4238..22f46a8 100644 --- a/plugins/email/vendor/symfony/mime/Header/ParameterizedHeader.php +++ b/plugins/email/vendor/symfony/mime/Header/ParameterizedHeader.php @@ -85,7 +85,7 @@ final class ParameterizedHeader extends UnstructuredHeader * This doesn't need to be overridden in theory, but it is for implementation * reasons to prevent potential breakage of attributes. */ - protected function toTokens(string $string = null): array + protected function toTokens(?string $string = null): array { $tokens = parent::toTokens(parent::getBodyAsString()); diff --git a/plugins/email/vendor/symfony/mime/LICENSE b/plugins/email/vendor/symfony/mime/LICENSE index 298be14..4dd83ce 100644 --- a/plugins/email/vendor/symfony/mime/LICENSE +++ b/plugins/email/vendor/symfony/mime/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2022 Fabien Potencier +Copyright (c) 2010-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/mime/Message.php b/plugins/email/vendor/symfony/mime/Message.php index 651ffd4..639b26b 100644 --- a/plugins/email/vendor/symfony/mime/Message.php +++ b/plugins/email/vendor/symfony/mime/Message.php @@ -24,7 +24,7 @@ class Message extends RawMessage private $headers; private $body; - public function __construct(Headers $headers = null, AbstractPart $body = null) + public function __construct(?Headers $headers = null, ?AbstractPart $body = null) { $this->headers = $headers ? clone $headers : new Headers(); $this->body = $body; @@ -42,7 +42,7 @@ class Message extends RawMessage /** * @return $this */ - public function setBody(AbstractPart $body = null) + public function setBody(?AbstractPart $body = null) { $this->body = $body; @@ -140,7 +140,10 @@ class Message extends RawMessage if ($this->headers->has('Sender')) { $sender = $this->headers->get('Sender')->getAddress(); } elseif ($this->headers->has('From')) { - $sender = $this->headers->get('From')->getAddresses()[0]; + if (!$froms = $this->headers->get('From')->getAddresses()) { + throw new LogicException('A "From" header must have at least one email address.'); + } + $sender = $froms[0]; } else { throw new LogicException('An email must have a "From" or a "Sender" header.'); } diff --git a/plugins/email/vendor/symfony/mime/Part/DataPart.php b/plugins/email/vendor/symfony/mime/Part/DataPart.php index 4247ce7..3219df4 100644 --- a/plugins/email/vendor/symfony/mime/Part/DataPart.php +++ b/plugins/email/vendor/symfony/mime/Part/DataPart.php @@ -33,7 +33,7 @@ class DataPart extends TextPart /** * @param resource|string $body */ - public function __construct($body, string $filename = null, string $contentType = null, string $encoding = null) + public function __construct($body, ?string $filename = null, ?string $contentType = null, ?string $encoding = null) { unset($this->_parent); @@ -51,7 +51,7 @@ class DataPart extends TextPart $this->setDisposition('attachment'); } - public static function fromPath(string $path, string $name = null, string $contentType = null): self + public static function fromPath(string $path, ?string $name = null, ?string $contentType = null): self { if (null === $contentType) { $ext = strtolower(substr($path, strrpos($path, '.') + 1)); diff --git a/plugins/email/vendor/symfony/mime/Part/MessagePart.php b/plugins/email/vendor/symfony/mime/Part/MessagePart.php index 1b5c23e..00129b4 100644 --- a/plugins/email/vendor/symfony/mime/Part/MessagePart.php +++ b/plugins/email/vendor/symfony/mime/Part/MessagePart.php @@ -59,4 +59,17 @@ class MessagePart extends DataPart { return $this->message->toIterable(); } + + /** + * @return array + */ + public function __sleep() + { + return ['message']; + } + + public function __wakeup() + { + $this->__construct($this->message); + } } diff --git a/plugins/email/vendor/symfony/mime/Part/Multipart/FormDataPart.php b/plugins/email/vendor/symfony/mime/Part/Multipart/FormDataPart.php index ff6df81..e3c9afc 100644 --- a/plugins/email/vendor/symfony/mime/Part/Multipart/FormDataPart.php +++ b/plugins/email/vendor/symfony/mime/Part/Multipart/FormDataPart.php @@ -58,7 +58,7 @@ final class FormDataPart extends AbstractMultipartPart $values = []; $prepare = function ($item, $key, $root = null) use (&$values, &$prepare) { - if (\is_int($key) && \is_array($item)) { + if (null === $root && \is_int($key) && \is_array($item)) { if (1 !== \count($item)) { throw new InvalidArgumentException(sprintf('Form field values with integer keys can only have one array element, the key being the field name and the value being the field value, %d provided.', \count($item))); } diff --git a/plugins/email/vendor/symfony/mime/Part/TextPart.php b/plugins/email/vendor/symfony/mime/Part/TextPart.php index bfe41c0..fe9ca02 100644 --- a/plugins/email/vendor/symfony/mime/Part/TextPart.php +++ b/plugins/email/vendor/symfony/mime/Part/TextPart.php @@ -42,7 +42,7 @@ class TextPart extends AbstractPart /** * @param resource|string $body */ - public function __construct($body, ?string $charset = 'utf-8', string $subtype = 'plain', string $encoding = null) + public function __construct($body, ?string $charset = 'utf-8', string $subtype = 'plain', ?string $encoding = null) { unset($this->_headers); diff --git a/plugins/email/vendor/symfony/mime/RawMessage.php b/plugins/email/vendor/symfony/mime/RawMessage.php index d2a311d..ace1960 100644 --- a/plugins/email/vendor/symfony/mime/RawMessage.php +++ b/plugins/email/vendor/symfony/mime/RawMessage.php @@ -18,6 +18,9 @@ use Symfony\Component\Mime\Exception\LogicException; */ class RawMessage implements \Serializable { + /** + * @var iterable|string + */ private $message; /** diff --git a/plugins/email/vendor/symfony/mime/Resources/bin/update_mime_types.php b/plugins/email/vendor/symfony/mime/Resources/bin/update_mime_types.php index 9f13bf3..5586f09 100644 --- a/plugins/email/vendor/symfony/mime/Resources/bin/update_mime_types.php +++ b/plugins/email/vendor/symfony/mime/Resources/bin/update_mime_types.php @@ -9,6 +9,10 @@ * file that was distributed with this source code. */ +if ('cli' !== \PHP_SAPI) { + throw new Exception('This script must be run from the command line.'); +} + // load new map $data = json_decode(file_get_contents('https://cdn.jsdelivr.net/gh/jshttp/mime-db@v1.49.0/db.json'), true); $new = []; diff --git a/plugins/email/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php b/plugins/email/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php index c0adbe3..3243ec6 100644 --- a/plugins/email/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php +++ b/plugins/email/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php @@ -20,7 +20,7 @@ final class EmailAttachmentCount extends Constraint private $expectedValue; private $transport; - public function __construct(int $expectedValue, string $transport = null) + public function __construct(int $expectedValue, ?string $transport = null) { $this->expectedValue = $expectedValue; $this->transport = $transport; diff --git a/plugins/email/vendor/symfony/mime/composer.json b/plugins/email/vendor/symfony/mime/composer.json index cd04969..3bb6095 100644 --- a/plugins/email/vendor/symfony/mime/composer.json +++ b/plugins/email/vendor/symfony/mime/composer.json @@ -23,18 +23,20 @@ "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" }, "autoload": { "psr-4": { "Symfony\\Component\\Mime\\": "" }, diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php b/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php index fee3026..3dc0612 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/Idn.php @@ -11,8 +11,6 @@ namespace Symfony\Polyfill\Intl\Idn; -use Exception; -use Normalizer; use Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; use Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex; @@ -167,7 +165,7 @@ final class Idn if (1 === preg_match('/[^\x00-\x7F]/', $label)) { try { $label = 'xn--'.self::punycodeEncode($label); - } catch (Exception $e) { + } catch (\Exception $e) { $info->errors |= self::ERROR_PUNYCODE; } @@ -335,8 +333,8 @@ final class Idn $domain = self::mapCodePoints($domain, $options, $info); // Step 2. Normalize the domain name string to Unicode Normalization Form C. - if (!Normalizer::isNormalized($domain, Normalizer::FORM_C)) { - $domain = Normalizer::normalize($domain, Normalizer::FORM_C); + if (!\Normalizer::isNormalized($domain, \Normalizer::FORM_C)) { + $domain = \Normalizer::normalize($domain, \Normalizer::FORM_C); } // Step 3. Break the string into labels at U+002E (.) FULL STOP. @@ -350,7 +348,7 @@ final class Idn if ('xn--' === substr($label, 0, 4)) { try { $label = self::punycodeDecode(substr($label, 4)); - } catch (Exception $e) { + } catch (\Exception $e) { $info->errors |= self::ERROR_PUNYCODE; continue; @@ -496,7 +494,7 @@ final class Idn } // Step 1. The label must be in Unicode Normalization Form C. - if (!Normalizer::isNormalized($label, Normalizer::FORM_C)) { + if (!\Normalizer::isNormalized($label, \Normalizer::FORM_C)) { $info->errors |= self::ERROR_INVALID_ACE_LABEL; } @@ -583,7 +581,7 @@ final class Idn for ($j = 0; $j < $b; ++$j) { if ($bytes[$j] > 0x7F) { - throw new Exception('Invalid input'); + throw new \Exception('Invalid input'); } $output[$out++] = $input[$j]; @@ -599,17 +597,17 @@ final class Idn for ($k = self::BASE; /* no condition */; $k += self::BASE) { if ($in >= $inputLength) { - throw new Exception('Invalid input'); + throw new \Exception('Invalid input'); } $digit = self::$basicToDigit[$bytes[$in++] & 0xFF]; if ($digit < 0) { - throw new Exception('Invalid input'); + throw new \Exception('Invalid input'); } if ($digit > intdiv(self::MAX_INT - $i, $w)) { - throw new Exception('Integer overflow'); + throw new \Exception('Integer overflow'); } $i += $digit * $w; @@ -629,7 +627,7 @@ final class Idn $baseMinusT = self::BASE - $t; if ($w > intdiv(self::MAX_INT, $baseMinusT)) { - throw new Exception('Integer overflow'); + throw new \Exception('Integer overflow'); } $w *= $baseMinusT; @@ -639,7 +637,7 @@ final class Idn $bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi); if (intdiv($i, $outPlusOne) > self::MAX_INT - $n) { - throw new Exception('Integer overflow'); + throw new \Exception('Integer overflow'); } $n += intdiv($i, $outPlusOne); @@ -694,7 +692,7 @@ final class Idn } if ($m - $n > intdiv(self::MAX_INT - $delta, $h + 1)) { - throw new Exception('Integer overflow'); + throw new \Exception('Integer overflow'); } $delta += ($m - $n) * ($h + 1); @@ -702,7 +700,7 @@ final class Idn foreach ($iter as $codePoint) { if ($codePoint < $n && 0 === ++$delta) { - throw new Exception('Integer overflow'); + throw new \Exception('Integer overflow'); } if ($codePoint === $n) { @@ -723,7 +721,7 @@ final class Idn $qMinusT = $q - $t; $baseMinusT = self::BASE - $t; - $output .= self::encodeDigit($t + ($qMinusT) % ($baseMinusT), false); + $output .= self::encodeDigit($t + $qMinusT % $baseMinusT, false); ++$out; $q = intdiv($qMinusT, $baseMinusT); } diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/LICENSE b/plugins/email/vendor/symfony/polyfill-intl-idn/LICENSE index 03c5e25..fd0a062 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/LICENSE +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2019 Fabien Potencier and Trevor Rowbotham +Copyright (c) 2018-present Fabien Potencier and Trevor Rowbotham Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php b/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php index 5bb70e4..d285acd 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Polyfill\Intl\Idn\Resources\unidata; /** diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php b/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php index 5c1c51d..3c6af0c 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\Polyfill\Intl\Idn\Resources\unidata; /** diff --git a/plugins/email/vendor/symfony/polyfill-intl-idn/composer.json b/plugins/email/vendor/symfony/polyfill-intl-idn/composer.json index 71030a2..12f75bc 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-idn/composer.json +++ b/plugins/email/vendor/symfony/polyfill-intl-idn/composer.json @@ -33,9 +33,6 @@ }, "minimum-stability": "dev", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" diff --git a/plugins/email/vendor/symfony/polyfill-intl-normalizer/LICENSE b/plugins/email/vendor/symfony/polyfill-intl-normalizer/LICENSE index 4cd8bdd..6e3afce 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-normalizer/LICENSE +++ b/plugins/email/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015-2019 Fabien Potencier +Copyright (c) 2015-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/plugins/email/vendor/symfony/polyfill-intl-normalizer/Normalizer.php index 4443c23..81704ab 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-normalizer/Normalizer.php +++ b/plugins/email/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -90,7 +90,7 @@ class Normalizer self::$cC = self::getData('combiningClass'); } - if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { + if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { mb_internal_encoding('8bit'); } diff --git a/plugins/email/vendor/symfony/polyfill-intl-normalizer/composer.json b/plugins/email/vendor/symfony/polyfill-intl-normalizer/composer.json index eb452bf..1b93573 100644 --- a/plugins/email/vendor/symfony/polyfill-intl-normalizer/composer.json +++ b/plugins/email/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -28,9 +28,6 @@ }, "minimum-stability": "dev", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" diff --git a/plugins/email/vendor/symfony/polyfill-php80/LICENSE b/plugins/email/vendor/symfony/polyfill-php80/LICENSE index 5593b1d..0ed3a24 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/LICENSE +++ b/plugins/email/vendor/symfony/polyfill-php80/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020 Fabien Potencier +Copyright (c) 2020-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php index 7ea6d27..2b95542 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +++ b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + #[Attribute(Attribute::TARGET_CLASS)] final class Attribute { diff --git a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php index 72f1081..bd1212f 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php +++ b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -1,6 +1,15 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { class PhpToken extends Symfony\Polyfill\Php80\PhpToken { } diff --git a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php index 77e037c..7c62d75 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + if (\PHP_VERSION_ID < 80000) { interface Stringable { diff --git a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php index 37937cb..01c6c6c 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +++ b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + if (\PHP_VERSION_ID < 80000) { class UnhandledMatchError extends Error { diff --git a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php index a3a9b88..783dbc2 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +++ b/plugins/email/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + if (\PHP_VERSION_ID < 80000) { class ValueError extends Error { diff --git a/plugins/email/vendor/symfony/polyfill-php80/composer.json b/plugins/email/vendor/symfony/polyfill-php80/composer.json index cd3e9b6..46ccde2 100644 --- a/plugins/email/vendor/symfony/polyfill-php80/composer.json +++ b/plugins/email/vendor/symfony/polyfill-php80/composer.json @@ -29,9 +29,6 @@ }, "minimum-stability": "dev", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" diff --git a/plugins/email/vendor/symfony/redis-messenger/LICENSE b/plugins/email/vendor/symfony/redis-messenger/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/redis-messenger/LICENSE +++ b/plugins/email/vendor/symfony/redis-messenger/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/redis-messenger/Transport/Connection.php b/plugins/email/vendor/symfony/redis-messenger/Transport/Connection.php index ffcac3e..16633a3 100644 --- a/plugins/email/vendor/symfony/redis-messenger/Transport/Connection.php +++ b/plugins/email/vendor/symfony/redis-messenger/Transport/Connection.php @@ -23,6 +23,7 @@ use Symfony\Component\Messenger\Exception\TransportException; * @author Robin Chalas * * @internal + * * @final */ class Connection @@ -116,6 +117,10 @@ class Connection */ private static function initializeRedis(\Redis $redis, string $host, int $port, $auth, int $serializer, int $dbIndex): \Redis { + if ($redis->isConnected()) { + return $redis; + } + $redis->connect($host, $port); $redis->setOption(\Redis::OPT_SERIALIZER, $serializer); @@ -150,7 +155,7 @@ class Connection public static function fromDsn(string $dsn, array $redisOptions = [], $redis = null): self { if (false === strpos($dsn, ',')) { - $parsedUrl = self::parseDsn($dsn, $redisOptions); + $params = self::parseDsn($dsn, $redisOptions); } else { $dsns = explode(',', $dsn); $parsedUrls = array_map(function ($dsn) use (&$redisOptions) { @@ -158,12 +163,12 @@ class Connection }, $dsns); // Merge all the URLs, the last one overrides the previous ones - $parsedUrl = array_merge(...$parsedUrls); + $params = array_merge(...$parsedUrls); // Regroup all the hosts in an array interpretable by RedisCluster - $parsedUrl['host'] = array_map(function ($parsedUrl, $dsn) { + $params['host'] = array_map(function ($parsedUrl) { if (!isset($parsedUrl['host'])) { - throw new InvalidArgumentException(sprintf('Missing host in DSN part "%s", it must be defined when using Redis Cluster.', $dsn)); + throw new InvalidArgumentException('Missing host in DSN, it must be defined when using Redis Cluster.'); } return $parsedUrl['host'].':'.($parsedUrl['port'] ?? 6379); @@ -204,7 +209,7 @@ class Connection unset($redisOptions['dbindex']); } - $tls = 'rediss' === $parsedUrl['scheme']; + $tls = 'rediss' === $params['scheme']; if (\array_key_exists('tls', $redisOptions)) { trigger_deprecation('symfony/redis-messenger', '5.3', 'Providing "tls" parameter is deprecated, use "rediss://" DSN scheme instead'); $tls = filter_var($redisOptions['tls'], \FILTER_VALIDATE_BOOLEAN); @@ -237,17 +242,17 @@ class Connection 'claim_interval' => $claimInterval, ]; - if (isset($parsedUrl['host'])) { - $pass = '' !== ($parsedUrl['pass'] ?? '') ? urldecode($parsedUrl['pass']) : null; - $user = '' !== ($parsedUrl['user'] ?? '') ? urldecode($parsedUrl['user']) : null; + if (isset($params['host'])) { + $user = isset($params['user']) && '' !== $params['user'] ? rawurldecode($params['user']) : null; + $pass = isset($params['pass']) && '' !== $params['pass'] ? rawurldecode($params['pass']) : null; $connectionCredentials = [ - 'host' => $parsedUrl['host'] ?? '127.0.0.1', - 'port' => $parsedUrl['port'] ?? 6379, + 'host' => $params['host'], + 'port' => $params['port'] ?? 6379, // See: https://github.com/phpredis/phpredis/#auth 'auth' => $redisOptions['auth'] ?? (null !== $pass && null !== $user ? [$user, $pass] : ($pass ?? $user)), ]; - $pathParts = explode('/', rtrim($parsedUrl['path'] ?? '', '/')); + $pathParts = explode('/', rtrim($params['path'] ?? '', '/')); $configuration['stream'] = $pathParts[1] ?? $configuration['stream']; $configuration['group'] = $pathParts[2] ?? $configuration['group']; @@ -257,7 +262,7 @@ class Connection } } else { $connectionCredentials = [ - 'host' => $parsedUrl['path'], + 'host' => $params['path'], 'port' => 0, ]; } @@ -274,15 +279,15 @@ class Connection $url = str_replace($scheme.':', 'file:', $dsn); } - if (false === $parsedUrl = parse_url($url)) { - throw new InvalidArgumentException(sprintf('The given Redis DSN "%s" is invalid.', $dsn)); + if (false === $params = parse_url($url)) { + throw new InvalidArgumentException('The given Redis DSN is invalid.'); } - if (isset($parsedUrl['query'])) { - parse_str($parsedUrl['query'], $dsnOptions); + if (isset($params['query'])) { + parse_str($params['query'], $dsnOptions); $redisOptions = array_merge($redisOptions, $dsnOptions); } - return $parsedUrl; + return $params; } private static function validateOptions(array $options): void @@ -345,7 +350,7 @@ class Connection $now = microtime(); $now = substr($now, 11).substr($now, 2, 3); - $queuedMessageCount = $this->rawCommand('ZCOUNT', 0, $now); + $queuedMessageCount = $this->rawCommand('ZCOUNT', 0, $now) ?? 0; while ($queuedMessageCount--) { if (!$message = $this->rawCommand('ZPOPMIN', 1)) { diff --git a/plugins/email/vendor/symfony/redis-messenger/Transport/RedisReceiver.php b/plugins/email/vendor/symfony/redis-messenger/Transport/RedisReceiver.php index 1a63d33..70d5483 100644 --- a/plugins/email/vendor/symfony/redis-messenger/Transport/RedisReceiver.php +++ b/plugins/email/vendor/symfony/redis-messenger/Transport/RedisReceiver.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Messenger\Bridge\Redis\Transport; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Exception\TransportException; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; @@ -27,7 +28,7 @@ class RedisReceiver implements ReceiverInterface private $connection; private $serializer; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); @@ -44,6 +45,18 @@ class RedisReceiver implements ReceiverInterface return []; } + if (null === $message['data']) { + try { + $this->connection->reject($message['id']); + } catch (TransportException $e) { + if ($e->getPrevious()) { + throw $e; + } + } + + return $this->get(); + } + $redisEnvelope = json_decode($message['data']['message'] ?? '', true); if (null === $redisEnvelope) { diff --git a/plugins/email/vendor/symfony/redis-messenger/Transport/RedisTransport.php b/plugins/email/vendor/symfony/redis-messenger/Transport/RedisTransport.php index 88daa22..69b44a6 100644 --- a/plugins/email/vendor/symfony/redis-messenger/Transport/RedisTransport.php +++ b/plugins/email/vendor/symfony/redis-messenger/Transport/RedisTransport.php @@ -28,7 +28,7 @@ class RedisTransport implements TransportInterface, SetupableTransportInterface private $receiver; private $sender; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, ?SerializerInterface $serializer = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); diff --git a/plugins/email/vendor/symfony/service-contracts/LICENSE b/plugins/email/vendor/symfony/service-contracts/LICENSE index 74cdc2d..7536cae 100644 --- a/plugins/email/vendor/symfony/service-contracts/LICENSE +++ b/plugins/email/vendor/symfony/service-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2022 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/email/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/plugins/email/vendor/symfony/service-contracts/ServiceSubscriberTrait.php index 16e3eb2..6c560a4 100644 --- a/plugins/email/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ b/plugins/email/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -98,12 +98,13 @@ trait ServiceSubscriberTrait */ public function setContainer(ContainerInterface $container) { - $this->container = $container; - + $ret = null; if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { - return parent::setContainer($container); + $ret = parent::setContainer($container); } - return null; + $this->container = $container; + + return $ret; } } diff --git a/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php index 2a1b565..07d12b4 100644 --- a/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ b/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -11,85 +11,13 @@ namespace Symfony\Contracts\Service\Test; -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; +class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); -abstract class ServiceLocatorTest extends TestCase -{ +if (false) { /** - * @return ContainerInterface + * @deprecated since PHPUnit 9.6 */ - protected function getServiceLocator(array $factories) + class ServiceLocatorTest { - return new class($factories) implements ContainerInterface { - use ServiceLocatorTrait; - }; - } - - public function testHas() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - function () { return 'dummy'; }, - ]); - - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - - public function testGet() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$i) { - ++$i; - - return 'bar'; - }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } - - public function testThrowsOnUndefinedInternalService() - { - if (!$this->getExpectedException()) { - $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); - $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); - } - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } - - public function testThrowsOnCircularReference() - { - $this->expectException(\Psr\Container\ContainerExceptionInterface::class); - $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - 'bar' => function () use (&$locator) { return $locator->get('baz'); }, - 'baz' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); } } diff --git a/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php new file mode 100644 index 0000000..8696db7 --- /dev/null +++ b/plugins/email/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +abstract class ServiceLocatorTestCase extends TestCase +{ + /** + * @return ContainerInterface + */ + protected function getServiceLocator(array $factories) + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + function () { return 'dummy'; }, + ]); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + public function testThrowsOnUndefinedInternalService() + { + if (!$this->getExpectedException()) { + $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + } + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } + + public function testThrowsOnCircularReference() + { + $this->expectException(\Psr\Container\ContainerExceptionInterface::class); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } +} diff --git a/plugins/login/CHANGELOG.md b/plugins/login/CHANGELOG.md index 469f052..ceb523a 100644 --- a/plugins/login/CHANGELOG.md +++ b/plugins/login/CHANGELOG.md @@ -1,3 +1,23 @@ +# v3.7.9 +## 05/15/2024 + +1. [](#improved) + * Added default `site_host:` entry to `login.yaml` configuration file + +# v3.7.8.1 +## 04/19/2024 + +1. [](#bugfix) + * Fixed a typo in `Email::sendActivationEmail()` [#303](https://github.com/getgrav/grav-plugin-login/issues/303) + +# v3.7.8 +## 04/16/2024 + +1. [](#improved) + * Use `random_bytes()` for password reset and activation, only fallback to `mt_rand()` if there's a generation error - discovered by [Fortbridge](https://fortbridge.co.uk) + * Added a new `site_host` field in the "Security" section to use in password reset and activation links sent in email. This allows you to avoid any "Password Reset Poisoning" attacks. - discovered by [Fortbridge](https://fortbridge.co.uk) + * Added a new warning in reset and activation emails that shows the "site host" clearly in order to avoid any nefariously sent emails. + # v3.7.7 ## 01/05/2024 diff --git a/plugins/login/README.md b/plugins/login/README.md index 291b49e..b5c63bc 100644 --- a/plugins/login/README.md +++ b/plugins/login/README.md @@ -174,6 +174,8 @@ dynamic_page_visibility: false # Integrate access into page visibil parent_acl: false # Look to parent `access` rules for access requirements protect_protected_page_media: false # Take `access` rules into account when directly accessing a page's media +site_host: # Optionally used in password reset and activation emails, to avoid "password poisoning attacks", this should be the URL of your site including the protocol. e.g. https://foo.com + rememberme: enabled: true # Enable 'remember me' functionality timeout: 604800 # Timeout in seconds. Defaults to 1 week @@ -427,6 +429,10 @@ user_registration: send_welcome_email: false # Send a welcome email to the user (probably should not be used with `send_activation_email` ``` +## Email Security Considerations + +For increased security and to deter users from being tricked into resetting their passwords or activating their accounts on 'fake' sites utilizing a [Password Poisoning Attack](https://portswigger.net/web-security/host-header/exploiting/password-reset-poisoning), you can now set the `site_host` property in the "Security" tab of the login properties, (e.g. `https://foo.com`) to ensure the users are sent to the original site only. + ## Sending an activation email By default the registration process adds a new user, and sets it as enabled. diff --git a/plugins/login/blueprints.yaml b/plugins/login/blueprints.yaml index e0dae9f..4702e04 100644 --- a/plugins/login/blueprints.yaml +++ b/plugins/login/blueprints.yaml @@ -1,7 +1,7 @@ name: Login slug: login type: plugin -version: 3.7.7 +version: 3.7.9 testing: false description: Enables user authentication and login screen. icon: sign-in @@ -411,6 +411,12 @@ form: title: PLUGIN_LOGIN.SECURITY_TAB fields: + site_host: + type: text + size: medium + label: PLUGIN_LOGIN.SITE_HOST + help: PLUGIN_LOGIN.SITE_HOST_HELP + placeholder: "https://example.com" max_pw_resets_count: type: number size: x-small diff --git a/plugins/login/classes/Controller.php b/plugins/login/classes/Controller.php index ed006d7..76463e2 100644 --- a/plugins/login/classes/Controller.php +++ b/plugins/login/classes/Controller.php @@ -389,8 +389,14 @@ class Controller return true; } - $token = md5(uniqid((string)mt_rand(), true)); - $expire = time() + 604800; // next week + try { + $random_bytes = random_bytes(16); + } catch (\Exception $e) { + $random_bytes = mt_rand(); + } + + $token = md5(uniqid($random_bytes, true)); + $expire = time() + 86400; // 24 hours $user->reset = $token . '::' . $expire; $user->save(); diff --git a/plugins/login/classes/Email.php b/plugins/login/classes/Email.php index 74d0a98..dbf9cda 100644 --- a/plugins/login/classes/Email.php +++ b/plugins/login/classes/Email.php @@ -5,7 +5,6 @@ namespace Grav\Plugin\Login; use Grav\Common\Config\Config; use Grav\Common\Grav; use Grav\Common\Language\Language; -use Grav\Common\Page\Pages; use Grav\Common\User\Interfaces\UserInterface; use Grav\Common\Utils; use Grav\Plugin\Login\Invitations\Invitation; @@ -39,9 +38,12 @@ class Email throw new \RuntimeException('User activation route does not exist!'); } - /** @var Pages $pages */ - $pages = Grav::instance()['pages']; - $activationLink = $pages->url( + $site_host = $config->get('plugins.login.site_host'); + if (!empty($site_host)) { + $activationRoute = rtrim($site_host, '/') . '/' . ltrim($activationRoute, '/'); + } + + $activationLink = Utils::url( $activationRoute . '/token' . $param_sep . $token . '/username' . $param_sep . $user->username, null, true @@ -89,11 +91,14 @@ class Email throw new \RuntimeException('Password reset route does not exist!'); } - /** @var Pages $pages */ - $pages = Grav::instance()['pages']; - $resetLink = $pages->url( + $site_host = static::getConfig()->get('plugins.login.site_host'); + if (!empty($site_host)) { + $resetRoute = rtrim($site_host, '/') . '/' . ltrim($resetRoute, '/'); + } + + $resetLink = Utils::url( "{$resetRoute}/task{$param_sep}login.reset/token{$param_sep}{$token}/user{$param_sep}{$user->username}/nonce{$param_sep}" . Utils::getNonce('reset-form'), - null, + true, true ); @@ -190,9 +195,7 @@ class Email throw new \RuntimeException('User registration route does not exist!'); } - /** @var Pages $pages */ - $pages = Grav::instance()['pages']; - $invitationLink = $pages->url("{$inviteRoute}/{$param_sep}{$invitation->token}", null, true); + $invitationLink = Utils::url("{$inviteRoute}/{$param_sep}{$invitation->token}", true, true); $context = [ 'invitation_link' => $invitationLink, @@ -218,11 +221,17 @@ class Email $config = static::getConfig(); + $site_host = $config->get('plugins.login.site_host'); + if (empty($site_host)) { + $site_host = Grav::instance()['uri']->host(); + } + // Twig context. $context += [ 'actor' => $actor, 'user' => $user, 'site_name' => $config->get('site.title', 'Website'), + 'site_host' => $site_host, 'author' => $config->get('site.author.name', ''), ]; diff --git a/plugins/login/classes/Login.php b/plugins/login/classes/Login.php index 36b982b..f31eea4 100644 --- a/plugins/login/classes/Login.php +++ b/plugins/login/classes/Login.php @@ -491,7 +491,13 @@ class Login throw new \RuntimeException($this->language->translate('PLUGIN_LOGIN.USER_NEEDS_EMAIL_FIELD')); } - $token = md5(uniqid(mt_rand(), true)); + try { + $random_bytes = random_bytes(16); + } catch (\Exception $e) { + $random_bytes = mt_rand(); + } + + $token = md5(uniqid($random_bytes, true)); $expire = time() + 604800; // next week $user->activation_token = $token . '::' . $expire; $user->save(); diff --git a/plugins/login/languages/en.yaml b/plugins/login/languages/en.yaml index c3eb1f1..187cef5 100644 --- a/plugins/login/languages/en.yaml +++ b/plugins/login/languages/en.yaml @@ -156,4 +156,7 @@ PLUGIN_LOGIN: INVITATION_EMAIL_MESSAGE: "We welcome you to register an account to on site." INVALID_INVITE_EMAILS: "Error: An invalid list of emails was provided" INVALID_FORM: "Error: Invalid form" - FAILED_TO_SEND_EMAILS: "Failed to send emails to: %s" \ No newline at end of file + FAILED_TO_SEND_EMAILS: "Failed to send emails to: %s" + HOST_WARNING: '
NOTE: If you did not initiate this email or you don''t recognize the originating site: "%s" please ignore or delete this email.
' + SITE_HOST: "Site Host" + SITE_HOST_HELP: "For extra security, force this URL to be used in all password reset and activation emails. Leave empty to use the default site URL" \ No newline at end of file diff --git a/plugins/login/login.yaml b/plugins/login/login.yaml index 8f546c4..eefd4ce 100644 --- a/plugins/login/login.yaml +++ b/plugins/login/login.yaml @@ -4,6 +4,7 @@ redirect_to_login: false # If you try to access a page you do redirect_after_login: false # Path to redirect to after a successful login redirect_after_logout: true # Path to redirect to after a successful logout session_user_sync: false # Sync session user with changes in stored user file +site_host: # Site host to use for email links. Enhances security by ensuring links are to the correct host (e.g. https://foo.com) route: '/login' # Specific route for Login page (default is '/login') route_after_login: '/' # Route to go to after login if enabled diff --git a/plugins/login/templates/emails/login/activate.html.twig b/plugins/login/templates/emails/login/activate.html.twig index fac447c..31c3193 100644 --- a/plugins/login/templates/emails/login/activate.html.twig +++ b/plugins/login/templates/emails/login/activate.html.twig @@ -7,6 +7,7 @@ {%- do email.message.setSubject(subject) %} {%- block content -%} + {{ 'PLUGIN_LOGIN.HOST_WARNING'|t(site_host)|raw }} {{ 'PLUGIN_LOGIN.ACTIVATION_EMAIL_BODY'|t(user.fullname, activation_link, site_name, author)|raw }} {%- endblock content -%} diff --git a/plugins/login/templates/emails/login/reset-password.html.twig b/plugins/login/templates/emails/login/reset-password.html.twig index fb9b566..c6fe499 100644 --- a/plugins/login/templates/emails/login/reset-password.html.twig +++ b/plugins/login/templates/emails/login/reset-password.html.twig @@ -7,6 +7,7 @@ {%- do email.message.setSubject(subject) %} {%- block content -%} + {{ 'PLUGIN_LOGIN.HOST_WARNING'|t(site_host)|raw }} {{ 'PLUGIN_LOGIN.FORGOT_EMAIL_BODY'|t(user.fullname ?? user.username, reset_link, author, site_name)|raw }} {%- endblock content -%} diff --git a/plugins/page-toc/CHANGELOG.md b/plugins/page-toc/CHANGELOG.md index 894dca6..d1ee9a9 100644 --- a/plugins/page-toc/CHANGELOG.md +++ b/plugins/page-toc/CHANGELOG.md @@ -1,3 +1,21 @@ +# v3.2.4 +## 05/16/2024 + +1. [](#improved) + * Updated Spanish translation [#40](https://github.com/trilbymedia/grav-plugin-page-toc/pulls/40) +1. [](#bugfix) + * Reverted to use `mb_encode_nuericentity()` instead of `htmlspecialchars` / `iconv` approach to fix breaking UTF-8 characters + +# v3.2.3 +## 05/06/2024 + +1. [](#new) + * Added french translation [#28](https://github.com/trilbymedia/grav-plugin-page-toc/pulls/28) + * Added option to whitelist HTML tags in TOC [#36](https://github.com/trilbymedia/grav-plugin-page-toc/pulls/36) + * Added option to set user templates in which anchors are generated [#37](https://github.com/trilbymedia/grav-plugin-page-toc/pulls/37) +1. [](#bugfix) + * Revert Twig macro to use `_self` as it was breaking the recursion. Deprecated message remains but can't be helped. [#38](https://github.com/trilbymedia/grav-plugin-page-toc/issues/38) + # v3.2.2 ## 05/10/2023 diff --git a/plugins/page-toc/README.md b/plugins/page-toc/README.md index bad6ba5..8a877ab 100644 --- a/plugins/page-toc/README.md +++ b/plugins/page-toc/README.md @@ -36,6 +36,7 @@ Here is the default configuration and an explanation of available options: enabled: true # Plugin enabled include_css: true # Include CSS active: true # Anchor IDs processed and generated for all pages +templates: # Templates for which anchors should be generated if default is disabled start: 1 # Start header tag level (1 = h1) for TOC depth: 6 # Depth from start (2 = 2 levels deep) for TOC hclass: # Custom Header TOC styling classes @@ -61,6 +62,8 @@ page-toc: active: true ``` +Alternatively, you can activate anchor generation on all pages using a given set of `templates`. + You can also configure which header tags to start and depth on when building the id attribute anchors by changing the `start` and `depth` values. This can also be done on a per-page basis. For example if you had a start of `3` and a depth of `3` you would get a TOC for `h3`, `h4`, and `h5`. @@ -104,7 +107,7 @@ If an `id` is found in one of the header tags that page-toc is configured to use ### Anchor Shortcode Page TOC now includes a `anchor` shortcode that allows you to manually add linkable fragments in your content. -The shortcode will automatically generate the link if no options are provided. Alternatively you can use the bbode syntax of `anchor="some-custom-id"` or you can explicity set it. You can also set a `prefix` and let the shortcode autogenerate the rest. +The shortcode will automatically generate the link if no options are provided. Alternatively you can use the BBCode syntax of `anchor="some-custom-id"` or you can explicity set it. You can also set a `prefix` and let the shortcode autogenerate the rest. For example: diff --git a/plugins/page-toc/blueprints.yaml b/plugins/page-toc/blueprints.yaml index 99f9e3a..00ee699 100644 --- a/plugins/page-toc/blueprints.yaml +++ b/plugins/page-toc/blueprints.yaml @@ -1,7 +1,7 @@ name: Page Toc type: plugin slug: page-toc -version: 3.2.2 +version: 3.2.4 description: Generate a table of contents and anchors from a page icon: list author: @@ -50,6 +50,12 @@ form: 0: PLUGIN_ADMIN.DISABLED validate: type: bool + templates: + type: selectize + label: PLUGIN_PAGE_TOC.ACTIVE_FOR_TEMPLATES + help: PLUGIN_PAGE_TOC.ACTIVE_FOR_TEMPLATES_HELP + validate: + type: commalist toc_section: type: section @@ -84,6 +90,12 @@ form: type: text label: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES help: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES_HELP + tags: + type: selectize + label: PLUGIN_PAGE_TOC.ALLOWED_HTML_TAGS + help: PLUGIN_PAGE_TOC.ALLOWED_HTML_TAGS_HELP + validate: + type: commalist anchors_section: type: section diff --git a/plugins/page-toc/blueprints/page-toc.yaml b/plugins/page-toc/blueprints/page-toc.yaml index de6998f..5669c97 100644 --- a/plugins/page-toc/blueprints/page-toc.yaml +++ b/plugins/page-toc/blueprints/page-toc.yaml @@ -55,6 +55,14 @@ form: label: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES help: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES_HELP data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'hclass'] + header.page-toc.tags: + toggleable: true + type: selectize + label: PLUGIN_PAGE_TOC.ALLOWED_HTML_TAGS + help: PLUGIN_PAGE_TOC.ALLOWED_HTML_TAGS_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'tags'] + validate: + type: commalist header.page-toc-anchors-section: type: section diff --git a/plugins/page-toc/classes/HtmlHelper.php b/plugins/page-toc/classes/HtmlHelper.php index 2c48ef4..b3c7853 100644 --- a/plugins/page-toc/classes/HtmlHelper.php +++ b/plugins/page-toc/classes/HtmlHelper.php @@ -18,6 +18,7 @@ namespace Grav\Plugin\PageToc; use ArrayIterator; use DOMDocument; use DomElement; +use DomNode; use DOMXPath; /** @@ -31,6 +32,7 @@ trait HtmlHelper { libxml_use_internal_errors(true); $domDocument = new \DOMDocument(); + $html = "$markup"; $domDocument->loadHTML(mb_encode_numericentity($html, [0x80, 0x10FFFF, 0, ~0], 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $domDocument->preserveWhiteSpace = true; @@ -87,4 +89,16 @@ trait HtmlHelper return new ArrayIterator([]); } } + + protected function filteredInnerHTML(DOMNode $element, array $allowedTags): string + { + $innerHTML = ""; + $children = $element->childNodes; + + foreach ($children as $child) { + $innerHTML .= $element->ownerDocument->saveHTML($child); + } + + return strip_tags($innerHTML, $allowedTags); + } } diff --git a/plugins/page-toc/classes/TocGenerator.php b/plugins/page-toc/classes/TocGenerator.php index 7621835..55f502f 100644 --- a/plugins/page-toc/classes/TocGenerator.php +++ b/plugins/page-toc/classes/TocGenerator.php @@ -56,7 +56,7 @@ class TocGenerator * @param int $depth Depth (1 through 6) * @return ItemInterface KNP Menu */ - public function getMenu(string $markup, int $topLevel = 1, int $depth = 6): ItemInterface + public function getMenu(string $markup, int $topLevel = 1, int $depth = 6, array $allowedTags = []): ItemInterface { $menu = $this->menuFactory->createItem(static::DEFAULT_NAME); @@ -97,7 +97,8 @@ class TocGenerator $lastElem = $parent->addChild( $node->getAttribute('id'), [ - 'label' => $node->getAttribute('title') ?: $node->textContent, + 'label' => $node->getAttribute('title') ?: + ($allowedTags ? $this->filteredInnerHTML($node, $allowedTags) : $node->textContent) , 'uri' => '#' . $node->getAttribute('id') ] ); diff --git a/plugins/page-toc/languages.yaml b/plugins/page-toc/languages.yaml index 0ec73f8..c07368d 100644 --- a/plugins/page-toc/languages.yaml +++ b/plugins/page-toc/languages.yaml @@ -8,6 +8,8 @@ en: ACTIVE_BY_DEFAULT: 'Anchors generated by default' ACTIVE_BY_DEFAULT_PAGE: 'Anchors generated for this page' ACTIVE_BY_DEFAULT_PAGE_HELP: 'If the default setting is disabled, you can enable on this page, or vice versa' + ACTIVE_FOR_TEMPLATES: 'Anchors generated for these templates' + ACTIVE_FOR_TEMPLATES_HELP: 'Only relevant if default (site-wide) anchor generation is disabled' TOC_SECTION: 'Table of Contents Configuration' START_TOC_HEADERS: 'Start TOC headers' START_TOC_HEADERS_HELP: 'The Header level to start the TOC from' @@ -15,9 +17,12 @@ en: DEPTH_TOC_HEADERS_HELP: 'The number of headers levels from the ''start'' to include in the TOC' HEADER_CSS_CLASSES: 'Header CSS classes' HEADER_CSS_CLASSES_HELP: 'Any custom classes to add to the header tags when IDs for slugs are added' + ALLOWED_HTML_TAGS: 'Whitelisted HTML tags' + ALLOWED_HTML_TAGS_HELP: 'These tags if present in the headers will be preserved in the TOC' ANCHORS_SECTION: 'Anchors Configuration' START_ANCHOR_HEADERS: 'Start Anchor headers' DEPTH_ANCHOR_HEADERS: 'Depth of Anchor headers' + DEPTH_ANCHOR_HEADERS_HELP: 'The number of header levels from the ''start'' to be displayed' LINK_ANCHOR_HEADERS: 'Link Anchors' ARIA_LABEL: 'Aria Label' ANCHORS_CLASS: 'Custom CSS classes for anchors' @@ -36,3 +41,80 @@ en: SLUG_PREFIX_HELP: 'A prefix used in front of generated slugs' PAGE_ANCHORS_SECTION: 'Page Anchors Configuration' COPY_TO_CLIPBOARD: 'Copy to Clipboard' +fr: + PLUGIN_PAGE_TOC: + TABLE_OF_CONTENTS: Table des matières + INCLUDE_CSS: 'Inclure le CSS' + ACTIVE_BY_DEFAULT: 'Ancres générées par défaut' + ACTIVE_BY_DEFAULT_PAGE: 'Ancres générées sur cette page' + ACTIVE_BY_DEFAULT_PAGE_HELP: 'Si les paramètres par défaut sont désactivés, vous pouvez les activer sur cette page ou vice-versa' + TOC_SECTION: 'Configuration de la table des matières' + START_TOC_HEADERS: 'Début des titres de la table des matières' + START_TOC_HEADERS_HELP: 'Le niveau de titre de référence de la table des matières' + DEPTH_TOC_HEADERS: 'Profondeur des titres de la table des matières' + DEPTH_TOC_HEADERS_HELP: 'Le nombre de sous-niveaux de titres dans la table des matières, à partir du niveau de référence' + HEADER_CSS_CLASSES: 'Classes CSS à utiliser pour les titres' + HEADER_CSS_CLASSES_HELP: 'Classes CSS à ajouter aux tags des titres quand les identifiants de slugs sont ajoutés' + ANCHORS_SECTION: 'Configuration des ancres' + START_ANCHOR_HEADERS: 'Début des ancres de titres' + DEPTH_ANCHOR_HEADERS: 'Profondeur des ancres de titres' + DEPTH_ANCHOR_HEADERS_HELP: 'Le nombre de niveaux de titres depuis le ''début'' à afficher' + LINK_ANCHOR_HEADERS: 'Liens des ancres' + ARIA_LABEL: 'Aria Label' + ANCHORS_CLASS: 'Classes CSS personnalisées des ancres' + ANCHORS_CLASS_HELP: 'Classes CSS à ajouter aux tags des ancres' + ANCHORS_ICON: 'Symbole utilisé pour les icônes d''ancres' + ANCHORS_ICON_HELP: 'Peut être n''importe quel caractère, symbole, caractère unicode ou même un émoticône. Laissez ce champ vide si vous comptez utiliser du CSS.' + ANCHORS_POSITION: 'Position des ancres' + ANCHORS_POSITION_HELP: 'Position où afficher les ancres: avant ou après (valeurs acceptées: `before|after`)' + ANCHORS_COPY_TO_CLIPBOARD: 'Copier dans le presse-papiers' + ANCHORS_COPY_TO_CLIPBOARD_HELP: 'Lors du clic sur une ancre, cela copie également l''URL complète dans le presse-papiers. Utile pour partager/ouvrir dans un nouvel onglet' + BEFORE_TEXT: 'Avant le texte' + AFTER_TEXT: 'Après le texte' + SLUG_MAXLEN: 'Longueur maximale des slugs' + SLUG_MAXLEN_HELP: 'Longueur maximale des slugs utilisés pour les ancres' + SLUG_PREFIX: 'Préfixe des slugs' + SLUG_PREFIX_HELP: 'Un préfixe utilisé devant les slugs générés' + PAGE_ANCHORS_SECTION: 'Configuration des ancres de pages' + COPY_TO_CLIPBOARD: 'Copier dans le presse-papiers' +es: + PLUGIN_PAGE_TOC: + TABLE_OF_CONTENTS: Tabla de Contenidos + INCLUDE_CSS: 'Incluir CSS' + ACTIVE_BY_DEFAULT: 'Enlaces ancla generados por defecto' + ACTIVE_BY_DEFAULT_PAGE: 'Enlaces ancla generados para esta página' + ACTIVE_BY_DEFAULT_PAGE_HELP: 'Si la configuración por defecto está desactivada, puedes activarla en esta página, o viceversa' + ACTIVE_FOR_TEMPLATES: 'Enlaces ancla generados para estas plantillas' + ACTIVE_FOR_TEMPLATES_HELP: 'Solo es relevante si la generación de enlaces ancla predeterminada (para todo el sitio) está desactivada' + TOC_SECTION: 'Configuración de la Tabla de Contenidos' + START_TOC_HEADERS: 'Iniciar encabezados de TOC' + START_TOC_HEADERS_HELP: 'El nivel de encabezado desde el cual iniciar la TOC' + DEPTH_TOC_HEADERS: 'Profundidad de encabezados de TOC' + DEPTH_TOC_HEADERS_HELP: 'El número de niveles de encabezados desde el ''inicio'' a incluir en la TOC' + HEADER_CSS_CLASSES: 'Clases CSS de encabezado' + HEADER_CSS_CLASSES_HELP: 'Cualquier clase personalizada para agregar a las etiquetas de encabezado cuando se agreguen ID para los slugs' + ALLOWED_HTML_TAGS: 'Etiquetas HTML permitidas' + ALLOWED_HTML_TAGS_HELP: 'Estas etiquetas, si están presentes en los encabezados, se conservarán en la TOC' + ANCHORS_SECTION: 'Configuración de enlaces ancla' + START_ANCHOR_HEADERS: 'Iniciar encabezados de enlace ancla' + DEPTH_ANCHOR_HEADERS: 'Profundidad de encabezados de enlace ancla' + DEPTH_ANCHOR_HEADERS_HELP: 'El número de niveles de encabezados desde el ''inicio'' que se mostrarán' + LINK_ANCHOR_HEADERS: 'Enlaces de anclaje' + ARIA_LABEL: 'Etiqueta Aria' + ANCHORS_CLASS: 'Clases CSS personalizadas para enlaces ancla' + ANCHORS_CLASS_HELP: 'Cualquier clase personalizada para agregar a las etiquetas de enlace ancla' + ANCHORS_ICON: 'Símbolo del icono de enlace ancla' + ANCHORS_ICON_HELP: 'Puede ser cualquier carácter de texto, símbolo, carácter unicode o incluso emoji. déjalo en blanco si tienes la intención de estilizar con CSS.' + ANCHORS_POSITION: 'Posición del enlace ancla' + ANCHORS_POSITION_HELP: 'Posición para poner el enlace ancla, `antes|después`' + ANCHORS_COPY_TO_CLIPBOARD: 'Copiar al Portapapeles' + ANCHORS_COPY_TO_CLIPBOARD_HELP: 'Al hacer clic en un enlace ancla, también copiará al portapapeles la URL completa. Conveniente para compartir/abrir en una nueva pestaña' + BEFORE_TEXT: 'Texto antes' + AFTER_TEXT: 'Texto después' + SLUG_MAXLEN: 'Longitud máxima del Slug' + SLUG_MAXLEN_HELP: 'Longitud máxima de los slugs usados para los enlaces ancla' + SLUG_PREFIX: 'Prefijo del Slug' + SLUG_PREFIX_HELP: 'Un prefijo usado delante de los slugs generados' + PAGE_ANCHORS_SECTION: 'Configuración de enlaces ancla de Página' + COPY_TO_CLIPBOARD: 'Copiar al Portapapeles' + diff --git a/plugins/page-toc/page-toc.php b/plugins/page-toc/page-toc.php index f694fc8..6b51499 100644 --- a/plugins/page-toc/page-toc.php +++ b/plugins/page-toc/page-toc.php @@ -89,9 +89,11 @@ class PageTOCPlugin extends Plugin $content = $page->content(); $shortcode_exists = preg_match($this->toc_regex, $content); $active = $this->configVar('active', $page, false); + $activated_templates = $this->configVar('templates', $page, []); + $is_template_activated = in_array($page->template(), $activated_templates); // Set ID anchors if needed - if ($active || $shortcode_exists) { + if ($active || $is_template_activated || $shortcode_exists) { $this->registerTwigFunctions(); $markup_fixer = new MarkupFixer(); $content = $markup_fixer->fix($content, $this->getAnchorOptions($page)); @@ -143,9 +145,9 @@ class PageTOCPlugin extends Plugin return $this->generator->getHtmlMenu($markup, $options['start'], $options['depth'], null, true); }, ['is_safe' => ['html']])); - $twig->addFunction(new TwigFunction('toc_items', function ($markup, $start = null, $depth = null) { - $options = $this->getTocOptions(null, $start, $depth); - return $this->generator->getMenu($markup, $options['start'], $options['depth']); + $twig->addFunction(new TwigFunction('toc_items', function ($markup, $start = null, $depth = null, $tags = null) { + $options = $this->getTocOptions(null, $start, $depth, $tags); + return $this->generator->getMenu($markup, $options['start'], $options['depth'], $options['tags']); })); $twig->addFunction(new TwigFunction('add_anchors', function ($markup, $start = null, $depth = null) { @@ -189,12 +191,13 @@ class PageTOCPlugin extends Plugin } } - protected function getTocOptions(PageInterface $page = null, $start = null, $depth = null): array + protected function getTocOptions(PageInterface $page = null, $start = null, $depth = null, $tags = null): array { $page = $page ?? $this->grav['page']; return [ 'start' => $start ?? $this->configVar('start', $page,1), 'depth' => $depth ?? $this->configVar('depth', $page,6), + 'tags' => $tags ?? $this->configVar('tags', $page,[]), ]; } diff --git a/plugins/page-toc/page-toc.yaml b/plugins/page-toc/page-toc.yaml index da89e23..b8cde72 100644 --- a/plugins/page-toc/page-toc.yaml +++ b/plugins/page-toc/page-toc.yaml @@ -1,6 +1,7 @@ enabled: true # Plugin enabled include_css: true # Include CSS active: true # Anchor IDs processed and generated for all pages +templates: # Templates for which anchors should be generated if default is disabled start: 1 # Start header tag level (1 = h1) for TOC depth: 6 # Depth from start (2 = 2 levels deep) for TOC hclass: # Custom Header TOC styling classes diff --git a/plugins/page-toc/templates/components/page-toc.html.twig b/plugins/page-toc/templates/components/page-toc.html.twig index a1465d4..1229003 100644 --- a/plugins/page-toc/templates/components/page-toc.html.twig +++ b/plugins/page-toc/templates/components/page-toc.html.twig @@ -1,8 +1,10 @@ + {% macro toc_loop(items) %} + {% for item in items %} {% set class = loop.first ? 'first' : loop.last ? 'last' : null %}
  • - {{ item.label }} + {{ item.label | raw }} {% if item.children|length > 0 %}
      {{ _self.toc_loop(item.children) }} @@ -22,4 +24,4 @@
    {% endif %} -{% endif %} +{% endif %} \ No newline at end of file