Commit Graph

41601 Commits

Author SHA1 Message Date
Fabien Potencier
bfcf65f61c Change test 2020-10-04 18:34:28 +02:00
Fabien Potencier
57ad83e7e1 Merge branch '5.1'
* 5.1:
  Added Stopwatch example to the README
  Bump Symfony version to 5.1.8
  Update VERSION for 5.1.7
  Update CHANGELOG for 5.1.7
  Bump Symfony version to 4.4.16
  Update VERSION for 4.4.15
  Update CHANGELOG for 4.4.15
2020-10-04 18:29:51 +02:00
Fabien Potencier
84bec1df2d Merge branch '4.4' into 5.1
* 4.4:
  Added Stopwatch example to the README
  Bump Symfony version to 4.4.16
  Update VERSION for 4.4.15
  Update CHANGELOG for 4.4.15
2020-10-04 18:29:28 +02:00
Wouter de Jong
e2461c90d2 Added Stopwatch example to the README 2020-10-04 14:01:13 +02:00
M. Vondano
bfde15b728
Fix type annotation 2020-10-04 12:25:24 +02:00
Fabien Potencier
c91ad1239f feature #38382 [Validator] Use comparison constraints as attributes (derrabus)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Validator] Use comparison constraints as attributes

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | yes
| Tickets       | #38096
| License       | MIT
| Doc PR        | TODO, let's add it to symfony/symfony-docs#14305

This PR enables all child classes of `AbstractComparison` to be used as attributes.

Some of those constraints used a trait called `NumberConstraintTrait` for a shared implementation. After my changes, that trait did not fit well anymore, so I've added a new `ZeroComparisonConstraintTrait` as a replacement. Although I don't expect `NumberConstraintTrait` to provide much value outside of the Symfony codebase, I think we cannot safely change it because it was not labelled as `@internal`. This is basically why I went for the deprecation.

Commits
-------

b5bdf8288f [Validator] Use comparison constraints as attributes.
2020-10-04 10:54:16 +02:00
Fabien Potencier
dfcde5b409 feature #38369 [HttpFoundation] Expired cookies string representation consistency & tests (iquito)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[HttpFoundation] Expired cookies string representation consistency & tests

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| License       | MIT

These changes add consistent behavior when converting expired cookies back and forth from string representation into `Symfony\Component\HttpFoundation\Cookie` instances in `Cookie::fromString`:

- When `Max-Age` is zero and `expires` is in the past, the `expires` date is kept as is (previous behavior: `expires` is overwritten with current timestamp because it is reset to current timestamp + `Max-Age`)
- When `Max-Age` is zero and `expires` is in the future, expires is reset to current timestamp, as `Max-Age` is the preferred "source of truth" (same as previous behavior)
- Add tests for how the Cookie class handles `Max-Age` in a cookie string and how `expires` and `Max-Age` interact
- Extract helper function `expiresTimestamp` so converting to a unix timestamp can be reused in `Cookie::fromString`

This is more a new feature than a bug fix in my mind, therefore I would include it in 5.1+.

Commits
-------

4f5d5eceb0 [HttpFoundation] Expired cookies string representation consistency & tests
2020-10-04 10:45:41 +02:00
Andreas
4f5d5eceb0 [HttpFoundation] Expired cookies string representation consistency & tests 2020-10-04 10:45:35 +02:00
Fabien Potencier
89adb2133b [Mime] Prefer .jpg instead of .jpeg 2020-10-04 10:36:21 +02:00
Fabien Potencier
a6103adcf9 Bump Symfony version to 5.1.8 2020-10-04 10:00:52 +02:00
Fabien Potencier
1d18312db6 Update VERSION for 5.1.7 2020-10-04 09:57:28 +02:00
Fabien Potencier
8cb3387ce2 Bump Symfony version to 4.4.16 2020-10-04 09:55:30 +02:00
Fabien Potencier
e42cfee451 Update VERSION for 4.4.15 2020-10-04 09:48:13 +02:00
Fabien Potencier
edb5fed4bb feature #36479 [Notifier][WebProfilerBundle][FrameworkBundle] Add notifier section to profiler (jschaedl)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[Notifier][WebProfilerBundle][FrameworkBundle] Add notifier section to profiler

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets       | - <!-- prefix each issue number with "Fix #", if any -->
| License       | MIT
| Doc PR        | - <!-- required for new features -->

This is the first iteration of adding a profiler panel for the new Notifier component:

WebProfiler Toolbar:
![Screenshot 2020-10-02 at 10 26 35](https://user-images.githubusercontent.com/1880467/94903474-28bece00-049a-11eb-945c-d6ce047b35e8.png)

WebProfiler Notifier Panel:

![Screenshot 2020-10-02 at 10 28 19](https://user-images.githubusercontent.com/1880467/94903594-5277f500-049a-11eb-8c1e-27e6ec87a51c.png)
![Screenshot 2020-10-02 at 10 28 29](https://user-images.githubusercontent.com/1880467/94903591-51df5e80-049a-11eb-935a-9ba130ef69f0.png)
![Screenshot 2020-10-02 at 10 28 35](https://user-images.githubusercontent.com/1880467/94903589-5146c800-049a-11eb-8a69-28d362ef6640.png)
![Screenshot 2020-10-02 at 10 28 42](https://user-images.githubusercontent.com/1880467/94903586-50159b00-049a-11eb-97bd-382a823087a6.png)

An example project can to test the new profiler panel can be found here: https://github.com/jschaedl/notifier-profiler-integration

Commits
-------

f39e74ba9f [Notifier][WebProfilerBundle][FrameworkBundle] Add notifier section to profiler
2020-10-04 09:43:38 +02:00
Jan Schädlich
f39e74ba9f [Notifier][WebProfilerBundle][FrameworkBundle] Add notifier section to profiler 2020-10-04 09:43:31 +02:00
Fabien Potencier
f8212cc9e3 Merge branch '5.1'
* 5.1:
  Update security.he.xlf
2020-10-04 09:09:29 +02:00
Fabien Potencier
936c6afdf0 Merge branch '4.4' into 5.1
* 4.4:
  Update security.he.xlf
2020-10-04 09:09:21 +02:00
Fabien Potencier
9c1b6fc985 Merge branch '3.4' into 4.4
* 3.4:
  Update security.he.xlf
2020-10-04 09:09:09 +02:00
Fabien Potencier
62a76ba871 Merge branch '5.1'
* 5.1:
  Handle consecutive supports() calls in the RememberMeAuthenticator
2020-10-04 09:09:00 +02:00
Fabien Potencier
3b524f6d70 feature #38395 [lock] Prevent user serializing the key when store does not support it. (jderusse)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[lock] Prevent user serializing the key when store does not support it.

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | /
| License       | MIT
| Doc PR        | /

Some store relies on connection with the running process. ie. kernel relaease flock/semaphore, or zookeeper neeeds a connection to the database.

When the users tries to serialize the key to send it to another process, they are not aware that they lose the lock.

This PR throws an exception in that situation.

Commits
-------

1ec0630262 Prevent user serializing the key
2020-10-04 09:08:28 +02:00
Fabien Potencier
c6a747d64b minor #38403 Remove array return type from Request::toArray() (GrahamCampbell)
This PR was merged into the 5.2-dev branch.

Discussion
----------

Remove array return type from Request::toArray()

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #38400
| License       | MIT
| Doc PR        | -

Laravel already extends Symfony's `Request` class and defines it's own `toArray` method. https://github.com/symfony/symfony/pull/38224 added a new `toArray` method to this class with a different signature to the one that is in Laravel, causing fatal errors (https://github.com/laravel/framework/issues/34660). I think the best course of action here is to remove the return type for now, and only add it in Symfony 6. This will allow Symfony 6.0 and Laravel 11 to synchronize adding the return type.

Older versions of Laravel can't just change their signature to add an array return type to them, because that would be a breaking change for Laravel users extending Laravel's request class. I'm thinking, in particular, API packages and the like, or just straight up application code.

Commits
-------

8b291a49a6 Remove array return type from Request::toArray()
2020-10-04 09:07:32 +02:00
Ben Hakim
8d4c2f052d Update security.he.xlf 2020-10-04 09:06:34 +02:00
Fabien Potencier
b94fef4670 bug #38396 Handle consecutive supports() calls in the RememberMeAuthenticator (wouterj)
This PR was merged into the 5.1 branch.

Discussion
----------

Handle consecutive supports() calls in the RememberMeAuthenticator

| Q             | A
| ------------- | ---
| Branch?       | 5.1
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #38206
| License       | MIT
| Doc PR        | -

If I read the issue correctly, the problem is not so much that `autoLogin()` is called in supports, but that it is called multiple times in the same request (in lazy firewalls). This is fixed by this issue.

@qurben or @fancyweb do you have an application with this error, and can you please test the patch in this PR? Please let me know if this actually fixed the issue. (if you can't, I'll create a small demo app to test this one)

Commits
-------

e0d1867b54 Handle consecutive supports() calls in the RememberMeAuthenticator
2020-10-04 09:05:27 +02:00
Fabien Potencier
200392e473 minor #38404 [HttpClient] Minor fix of type and message in ExponentialBackOff (bohanyang)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[HttpClient] Minor fix of type and message in ExponentialBackOff

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

Make the type consistent and fix an error message

Commits
-------

6149a0c04b [HttpClient] Minor fix of type and message in ExponentialBackOff
2020-10-04 09:03:11 +02:00
Fabien Potencier
42d86cf2af minor #38397 [Console] Remove "php" invokation from help messages. (rodrigoaguilera)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Console] Remove "php" invokation from help messages.

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| License       | MIT

Discusstion started here:
https://github.com/symfony/symfony/pull/38349

I was a bit puzzled to find that the help for the list and help commands suggests that you call the console application by prefixing it with `php myconsoleapp`.

As suggested in the PR above I am removing the `php ` prefix from the help.

I am providing a script with a shebang like the first example suggested in the following link:
https://symfony.com/doc/current/components/console.html
Eventually I want to distribute my console app as docker image so there is no need for php installed or the users even knowing is written in php.
The script name is easy to override by just setting a different value to `$_SERVER['PHP_SELF']` but this php prefix is hardcoded into the help strings for the the two default commands available.

Slightly related to #38347 as I am trying to improve the console help output.

Commits
-------

e036c30e7a [Console] Remove "php" invokation from help messages.
2020-10-04 09:01:38 +02:00
Bohan Yang
6149a0c04b [HttpClient] Minor fix of type and message in ExponentialBackOff 2020-10-04 10:23:35 +08:00
Graham Campbell
8b291a49a6
Remove array return type from Request::toArray() 2020-10-03 23:39:59 +01:00
Rodrigo Aguilera
e036c30e7a [Console] Remove "php" invokation from help messages. 2020-10-03 16:00:31 +02:00
Fabien Potencier
8fa6b3625b Merge branch '5.1'
* 5.1:
  Fix tests
  [Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter
  [Serializer][Minor] Fix exception message
2020-10-03 15:58:25 +02:00
Fabien Potencier
40bc14ab78 Merge branch '4.4' into 5.1
* 4.4:
  Fix tests
  [Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter
  [Serializer][Minor] Fix exception message
2020-10-03 15:58:17 +02:00
Wouter de Jong
e0d1867b54 Handle consecutive supports() calls in the RememberMeAuthenticator 2020-10-03 15:02:03 +02:00
Jérémy Derussé
1ec0630262
Prevent user serializing the key 2020-10-03 14:03:42 +02:00
Fabien Potencier
2be67879b9 feature #38307 [Form] Implement Twig helpers to get field variables (tgalopin)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Form] Implement Twig helpers to get field variables

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | https://github.com/symfony/symfony-docs/pull/14308

Designing Symfony Forms has always been difficult, especially for developers not comfortable with Symfony or Twig. The reason behind this difficulty is that the current `form_*` helper functions, while providing a way to quickly render a form, are hiding the generated HTML behind a notation specific to Symfony.

HTML standards introduced many new attributes since the Form component was created, from new constraints to how should inputs be displayed, treated by screen readers, etc.

I propose to introduce a series of new Twig functions to help create more flexible forms without the hurdle of having to use `form_*` functions. I called these methods `field_*` because they aim at rendering only the tiny bits of strings necessary to map forms to the Symfony backend.

The functions introduced are:

* `field_name` returns the name of the given field
* `field_value` returns the current value of the given field
* `field_label` returns the label of the given field, translated if possible
* `field_help` returns the help of the given field, translated if possible
* `field_errors` returns an iterator of strings for each of the errors of the given field
* `field_choices` returns an iterator of choices (the structure depending on whether the field uses or doesn't use optgroup) with translated labels if possible as keys and values as values

A quick example of usage of these functions could be the following:

``` twig
<input
    name="{{ field_name(form.username) }}"
    value="{{ field_value(form.username) }}"
    placeholder="{{ field_label(form.username) }}"
    class="form-control"
/>

<select name="{{ field_name(form.country) }}" class="form-control">
    <option value="">{{ field_label(form.country) }}</option>

    {% for label, value in field_choices(form.country) %}
        <option value="{{ value }}">{{ label }}</option>
    {% endfor %}
</select>

<select name="{{ field_name(form.stockStatus) }}" class="form-control">
    <option value="">{{ field_label(form.stockStatus) }}</option>

    {% for groupLabel, groupChoices in field_choices(form.stockStatus) %}
        <optgroup label="{{ groupLabel }}">
            {% for label, value in groupChoices %}
                <option value="{{ value }}">{{ label }}</option>
            {% endfor %}
        </optgroup>
    {% endfor %}
</select>

{% for error in field_errors(form.country) %}
    <div class="text-danger mb-2">
        {{ error }}
    </div>
{% endfor %}
```

There are several advantages to using these functions instead of their `form_*` equivalents:

* they are much easier to use for developers not knowing Symfony: they rely on native HTML with bits of logic inside, instead of relying on specific tools needing to be configured to display proper HTML
* they allow for better integration with CSS frameworks or Javascript libraries as adding a new HTML attribute is trivial (no need to look at the documentation)
* they are easier to use in contexts where one would like to customize the rendering of a input in details: having the label as placeholder, displaying a select empty field, ...

The `form_*` functions are still usable of course, but I'd argue this technique is actually easier to read and understand.

Commits
-------

3941d70928 [Form] Implement Twig helpers to get field variables
2020-10-03 11:48:50 +02:00
Fabien Potencier
6a79f3e06f Fix tests 2020-10-03 08:31:32 +02:00
Fabien Potencier
35e04d9136 bug #36291 [Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter (Jontsa)
This PR was squashed before being merged into the 4.4 branch.

Discussion
----------

[Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #35350
| License       | MIT
| Doc PR        |

Updates `Symfony\Component\Lock\Store\StoreFactory` to accept same DSN syntax as `Symfony\Component\Cache\Adapter\AbstractAdapter` which is used to create Redis class instance.

Commits
-------

4ebbe3d86b [Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter
2020-10-03 08:30:09 +02:00
Joni Halme
4ebbe3d86b [Lock] Fix StoreFactory to accept same DSN syntax as AbstractAdapter 2020-10-03 08:30:00 +02:00
Fabien Potencier
534466d1cf feature #38177 [Security] Magic login link authentication (weaverryan)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[Security] Magic login link authentication

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | none
| License       | MIT
| Doc PR        | TODO

Hi!

This adds a Slack-style "magic link" login authenticator to the new login system: (A) enter your email into a form, (B) receive an email with a link in it (C) click that link and you are authenticated!

For most users, implementing this would require:

A) Create a [controller](https://github.com/weaverryan/symfony-magic-login-link-example/blob/master/src/Controller/MagicLinkLoginController.php) with the "enter your email" form and a route for the "check" functionality (similar to `form_login`)
B) Activate in `security.yaml`:

```yml
security:
    enable_authenticator_manager: true
    # ...
    firewalls:
        # ...
        main:
            # ...
            login_link:
                check_route: 'magic_link_verify'
                # this is an important and powerful option
                # An array of properties on your User that are used to sign the link.
                # If any of these change, all existing links will become invalid
                # tl;dr If you want the modification of ANY field to invalidate ALL existing magic links immediately,
                # then you can add it to this list. You could even add a "lastLoginLinkSentAt" to invalid
                # all existing login links when a new one is sent.
                signature_properties: [id, password, email]

                # optional - by default, links can be reused but have a 10 minute lifetime
                #max_uses: 3
                #used_link_cache: cache.app
```

Done! This will generate a URL that looks something like this:

> https://127.0.0.1:9033/login/verify?user=weaverryan@gmail.com&expires=1601342578&hash=YzE1ZDJlYjM3YTMyMjgwZDdkYzg2ZjFlMjZhN2E5ZWRmMzk3NjAxNjRjYThiMjMzNmIxYzAzYzQ4NmQ2Zjk4NA%3D%3D

We would implement a Maker command this config + login/controller. The implementation is done via a "signed URL" and an optional cache pool to "expire" links. The hash of the signed URL can contain any user fields you want, which give you a powerful mechanism to invalidate magic tokens on user data changes. See `signature_properties` above.

#### Security notes:

There is a LOT of variability about how secure these need to be:

* A) Many/most implementation only allow links to be used ONE time. That is *possible* with this implementation, but is not the *default*. You CAN add a `max_uses` config which stores the expired links in a cache so they cannot be re-used. However, to make this work, you need to do more work by adding some "page" between the link the users clicks and *actually* using the login link. Why? Because unless you do this, email clients may follow the link to "preview" it and will "consume" the link.

* B) Many implementations will invalidate all other login links for a user when a new one is created. We do *not* do that, but that IS possible (and we could even generate the code for it) by adding a `lastLoginLinkSentAt` field to `User` and including this in `signature_properties`.

* C) We *do* invalidate all links if the user's email address is changed (assuming the `email` is included in `signature_properties`, which it should be). You can also invalidate on password change or whatever you want.

* D) Some implementations add a "state" so that you can only use the link on the same device that created it. That is, in many cases, quite annoying. We do not currently support that, but we could in the future (and the user could add it themselves).

Thanks!

#### TODOS:

* [x] A) more tests: functional (?) traits
* [ ] B) documentation
* [ ] C) MakerBundle PR
* [ ] D) Make sure we have what we need to allow that "in between" page
* [ ] E) Create a new cache pool instead of relying on cache.app?

Commits
-------

a8afe109d8 [Security] Magic login link authentication
2020-10-03 08:23:42 +02:00
Ryan Weaver
a8afe109d8 [Security] Magic login link authentication 2020-10-03 08:23:35 +02:00
Fabien Potencier
f589ff41ca feature #38224 [HttpFoundation] Add Request::toArray() for JSON content (Nyholm)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[HttpFoundation] Add Request::toArray() for JSON content

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | ni
| New feature?  | yes
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |

The past few months I've been working more and more with javascript and APIs. I've written controllers that parse json from the request body. I've found myself copying code between projects so I looked at the possibility to add this code to the `Request` class itself.

### Usage

```http
POST /add-user
Content-Type: application/json

{"name": "Tobias", "email": "tobias.nyholm@gmail.com"}
```

```php
use Symfony\Component\HttpFoundation\Exception\JsonException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

class MyController
    // ...
    public function addUser(Request $request): JsonResponse
    {
        try {
            $data = $request->toArray();
        } catch (JsonException $e) {
            return new JsonResponse(['message'=>'Request does not contain valid json'], 415);
        }

        $command = new AddUser($data['email'] ?? '', $data['name'] ?? '');

        try {
            $this->commandBus->dispatch($command);
        } catch (ValidationFailedException $e) {
            return new JsonResponse(['message' => 'Unexpected JSON body'], 400);
        }

        return new JsonResponse(['message' => 'User successfully added']);
    }
}
```
----------

I've searched but I have not found that this has been proposed before.. With is strange.. ¯\\_(ツ)_/¯

Commits
-------

83c1a2666d [HttpFoundation] Add Request::toArray() for JSON content
2020-10-03 08:14:02 +02:00
Nyholm
83c1a2666d [HttpFoundation] Add Request::toArray() for JSON content 2020-10-03 08:13:56 +02:00
Fabien Potencier
f8b154357d Fix CS 2020-10-03 08:07:27 +02:00
Fabien Potencier
d69b525000 bug #38385 [PropertyInfo] Fix failure over array<string,mixed> PhpDoc type (romaricdrigon)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[PropertyInfo] Fix failure over array<string,mixed> PhpDoc type

| Q             | A
| ------------- | ---
| Branch?       | master (issue introduced in master)
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | /
| License       | MIT
| Doc PR        | /

**Background**

Since a few days ago ([this commit](80e5a7fbd8)), PropertyInfo 5.2 component supports array PhpDoc types, such as `array<string,string>`.
While testing SF 5.2 over my project, it was failing over:
```php
class SomeDoctrineEntityProxy implements \Doctrine\ORM\Proxy\Proxy
{
    /**
     * @var array<string, mixed> default values of properties to be lazy loaded, with keys being the property names
     *
     * @see \Doctrine\Common\Proxy\Proxy::__getLazyProperties
     */
    public static $lazyPropertiesDefaults = array();
}
```

Upon investigation, it appears `array<string,mixed>` is causing the issue: `mixed` type is not handled.

**Expected behavior**

PropertyInfo component should not guess anything for `mixed` type (return `NULL`), but it should not throw any exception.

**Comment about my fix**

I added a test case (`arrayOfMixed`) you can use to reproduce the issue.
Since array PhpDoc types were not tested at all, I also added a test case over `array<string,string>`.

Commits
-------

590177ff8e [PropertyInfo] Fix failure over array<string,mixed> PhpDoc type
2020-10-03 08:03:47 +02:00
Yonel Ceruto
3d83f94a89 Fixed undefined property in Firewall\ExceptionListener 2020-10-02 17:21:50 -04:00
Laurent VOULLEMIER
36ce9029f7 [Serializer][Minor] Fix exception message
Wrong circular reference limit displayed.
2020-10-02 22:12:42 +02:00
Romaric Drigon
590177ff8e [PropertyInfo] Fix failure over array<string,mixed> PhpDoc type 2020-10-02 16:56:39 +02:00
Nicolas Grekas
5e48c1e1c6 Merge branch '5.1'
* 5.1:
  [HttpClient] Always "buffer" empty responses
2020-10-02 16:25:10 +02:00
Nicolas Grekas
c453c3dbd5 Merge branch '4.4' into 5.1
* 4.4:
  [HttpClient] Always "buffer" empty responses
2020-10-02 16:24:03 +02:00
Nicolas Grekas
700462f118 [HttpClient] fix last fix 2020-10-02 16:15:25 +02:00
Nicolas Grekas
993525a366 [HttpClient] Fix dealing with empty responses in AsyncResponse 2020-10-02 16:11:19 +02:00
Nicolas Grekas
1f7b8fdf7b bug #38378 [HttpClient] Fix exception triggered with AsyncResponse (jderusse)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[HttpClient] Fix exception triggered with AsyncResponse

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | https://github.com/symfony/symfony/pull/38289#issuecomment-702573975
| License       | MIT
| Doc PR        | /

When a request is replayed with the AsyncResponse and the 2nd request failed, users get an exception even when they pass `$throw=false`.

In fact, there are 2 exceptions:

1. Cannot get the content of the response twice: buffering is disabled.

73ca97c97a/src/Symfony/Component/HttpClient/Response/CommonResponseTrait.php (L51-L68)

Because CommonResponseTrait::$content is null and `self::stream` yield only the LastChunk. The content is stays null

2. HTTP/2 429  returned for "https://httpbin.org/status/429"

73ca97c97a/src/Symfony/Component/HttpClient/Response/AsyncResponse.php (L209-L225)

Because on the second request passthru is null, it didn't disable the the exception thrown on destruct for the wrapped response.
This

Commits
-------

3aedb51dd8 [HttpClient] Fix exception triggered with AsyncResponse
2020-10-02 15:57:56 +02:00
Jérémy Derussé
3aedb51dd8 [HttpClient] Fix exception triggered with AsyncResponse 2020-10-02 15:57:08 +02:00
Nicolas Grekas
03d60fce47 [HttpClient] Always "buffer" empty responses 2020-10-02 15:41:48 +02:00
Fabien Potencier
a3e8c112c2 feature #38323 [Mime] Allow multiple parts with the same name in FormDataPart (HypeMC)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Mime] Allow multiple parts with the same name in FormDataPart

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | Fix #38258
| License       | MIT
| Doc PR        | -

Added the possibility to choose whether multiple parts with the same name should be suffixed or not:

```php
$f1 = new FormDataPart([
    'foo' => [
        'one',
        'two',
    ],
]);

var_dump($f1->toString());
```

```
Content-Type: multipart/form-data; boundary=6rqazwiG

--6rqazwiG
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo[0]"

one
--6rqazwiG
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo[1]"

two
--6rqazwiG--
```

```php
$f1 = new FormDataPart([
    ['foo' => 'one'],
    ['foo' => 'two'],
]);

var_dump($f1->toString());
```

```
Content-Type: multipart/form-data; boundary=xxW9dGzq

--xxW9dGzq
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo"

one
--xxW9dGzq
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo"

two
--xxW9dGzq--
```

Only applies to numeric keys:

```php
$f1 = new FormDataPart([
    'foo' => [
        'a' => 'one',
        'b' => 'two',
    ],
], true);

var_dump($f1->toString());
```

```
Content-Type: multipart/form-data; boundary=W6qkqgrD

--W6qkqgrD
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo[a]"

one
--W6qkqgrD
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Content-Disposition: form-data; name="foo[b]"

two
--W6qkqgrD--
```

Commits
-------

1f7f2c6ddc Allow multiple parts with the same name in FormDataPart
2020-10-02 15:33:43 +02:00
Alexander M. Turek
b5bdf8288f [Validator] Use comparison constraints as attributes. 2020-10-02 15:13:55 +02:00
Nicolas Grekas
9d6333a7ff Merge branch '5.1'
* 5.1:
  [5.1] Ignore more deprecations for Mockery mocks
  [PhpUnitBridge] Fix Deprecation file when it comes from the TestsListener
  disallow FrameworkBundle 4.4+
  propagate validation groups to subforms
  [Form] [Validator] Add failing testcase to demonstrate group sequence issue
2020-10-02 15:09:26 +02:00
Thomas Calvet
58e6cb1ddc [5.1] Ignore more deprecations for Mockery mocks 2020-10-02 15:05:43 +02:00
Nicolas Grekas
8ae323b8a7 bug #38384 [PhpUnitBridge] Fix Deprecation file when it comes from the TestsListener (fancyweb)
This PR was merged into the 5.1 branch.

Discussion
----------

[PhpUnitBridge] Fix Deprecation file when it comes from the TestsListener

| Q             | A
| ------------- | ---
| Branch?       | 5.1
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

https://github.com/symfony/symfony/pull/38031 caused an unwanted regression: if the frame `class` matches `SymfonyTestsListenerFor` it used to always return, now it continues so the `originClass` and `originMethod` properties are set. Therefore, the deprecation is considered as coming from the test listener. It ends up in the "legacy" group and muted because the test listeners contains the word "Legacy" in their namespaces.

Example test:
```php
<?php

namespace App\Tests;

use PHPUnit\Framework\TestCase;
use Symfony\Component\EventDispatcher\DependencyInjection\ExtractingEventDispatcher;

final class FooTest extends TestCase
{
    public function test(): void
    {
        // ExtractingEventDispatcher is @internal
        new class extends ExtractingEventDispatcher {};

        $this->assertTrue(true);
    }
}
```

On 4.4:
```
Other deprecation notices (1)

  1x: The "Symfony\Component\EventDispatcher\DependencyInjection\ExtractingEventDispatcher" class is considered internal. It may change without further notice. You should not use it from "Symfony\Component\EventDispatcher\DependencyInjection\ExtractingEventDispatcher@anonymous".
```

On 5.1:
```
Legacy deprecation notices (1)
```

Commits
-------

1ba06a0f86 [PhpUnitBridge] Fix Deprecation file when it comes from the TestsListener
2020-10-02 14:58:44 +02:00
Nicolas Grekas
8ea3e7a6bb Merge branch '4.4' into 5.1
* 4.4:
  disallow FrameworkBundle 4.4+
  propagate validation groups to subforms
  [Form] [Validator] Add failing testcase to demonstrate group sequence issue
2020-10-02 14:58:01 +02:00
Thomas Calvet
1ba06a0f86 [PhpUnitBridge] Fix Deprecation file when it comes from the TestsListener 2020-10-02 14:57:56 +02:00
Nicolas Grekas
3d39874a2c Merge branch '3.4' into 4.4
* 3.4:
  disallow FrameworkBundle 4.4+
  propagate validation groups to subforms
  [Form] [Validator] Add failing testcase to demonstrate group sequence issue
2020-10-02 14:43:11 +02:00
Nicolas Grekas
4be56f6932 bug #38380 [Form] propagate validation groups to subforms (johanderuijter, xabbuh)
This PR was merged into the 3.4 branch.

Discussion
----------

[Form] propagate validation groups to subforms

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #38300
| License       | MIT
| Doc PR        |

Commits
-------

04f5698e29 propagate validation groups to subforms
e2c7c3373d [Form] [Validator] Add failing testcase to demonstrate group sequence issue
2020-10-02 14:37:04 +02:00
Christian Flothmann
ad45e9cfdd disallow FrameworkBundle 4.4+ 2020-10-02 14:18:20 +02:00
Fabien Potencier
bd8c3c1c42 feature #38354 [RateLimiter] add Limit::ensureAccepted() which throws RateLimitExceededException if not accepted (kbond)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[RateLimiter] add Limit::ensureAccepted() which throws RateLimitExceededException if not accepted

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | Ref https://github.com/symfony/symfony/issues/38241#issuecomment-695212027
| License       | MIT
| Doc PR        | todo

Example:

```php
try {
    $limit = $limiter->consume()->ensureAccepted();
} catch (RateLimitExceededException $e) {
    $limit = $e->getLimit();
}
```

Commits
-------

a7ecd0ed08 [RateLimiter] add Limit::ensureAccepted() and RateLimitExceededException
2020-10-02 13:18:49 +02:00
Nicolas Grekas
48adfb2e4b Merge branch '5.1'
* 5.1:
  [HttpClient] fix unsetting context[ssl][peer_name]
2020-10-02 12:20:36 +02:00
Nicolas Grekas
56679fe735 Merge branch '4.4' into 5.1
* 4.4:
  [HttpClient] fix unsetting context[ssl][peer_name]
2020-10-02 12:20:30 +02:00
Nicolas Grekas
8eb8a7c400 [HttpClient] fix unsetting context[ssl][peer_name] 2020-10-02 12:07:58 +02:00
Christian Flothmann
04f5698e29 propagate validation groups to subforms 2020-10-02 11:43:30 +02:00
Johan de Ruijter
e2c7c3373d [Form] [Validator] Add failing testcase to demonstrate group sequence issue
When using group sequences on a form, sometimes constraints are ignored even though they should fail.
2020-10-02 11:43:30 +02:00
HypeMC
1f7f2c6ddc Allow multiple parts with the same name in FormDataPart 2020-10-02 11:11:56 +02:00
Nicolas Grekas
73ca97c97a Merge branch '5.1'
* 5.1:
  [HttpClient] fix using proxies with NativeHttpClient
  [4.4] Ignore more deprecations for Mockery mocks
  [Routing] fix using !important and defaults/reqs in inline route definitions
  [ErrorHandler][DebugClassLoader] Do not check Mockery mocks classes
  [HttpClient] Fix using https with proxies
  [TwigBundle] Only remove kernel exception listener if twig is used
  [DI] Fix changelog
  Remove CHANGELOG files for 4.x
  Adjust expired range check
  Fix redis connection error message
  [DI] fix dumping non-shared lazy services
2020-10-02 10:56:13 +02:00
Nicolas Grekas
d8255138ae Merge branch '4.4' into 5.1
* 4.4:
  [HttpClient] fix using proxies with NativeHttpClient
  [4.4] Ignore more deprecations for Mockery mocks
  [Routing] fix using !important and defaults/reqs in inline route definitions
  [ErrorHandler][DebugClassLoader] Do not check Mockery mocks classes
  [HttpClient] Fix using https with proxies
  [TwigBundle] Only remove kernel exception listener if twig is used
  Adjust expired range check
  Fix redis connection error message
2020-10-02 10:49:02 +02:00
Nicolas Grekas
0d8721fc01 Merge branch '3.4' into 4.4
* 3.4:
  Adjust expired range check
2020-10-02 10:38:15 +02:00
Nicolas Grekas
3cfd991ae6 bug #38377 [4.4] Ignore more deprecations for Mockery mocks (fancyweb)
This PR was merged into the 4.4 branch.

Discussion
----------

[4.4] Ignore more deprecations for Mockery mocks

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

Commits
-------

1a801e8452 [4.4] Ignore more deprecations for Mockery mocks
2020-10-02 10:36:26 +02:00
Nicolas Grekas
aca260fbd0 bug #38375 [HttpClient] fix using proxies with NativeHttpClient (nicolas-grekas)
This PR was merged into the 4.4 branch.

Discussion
----------

[HttpClient] fix using proxies with NativeHttpClient

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

As spotted by @stof in https://github.com/symfony/symfony/pull/38368#issuecomment-702272737, we cannot use local DNS resolution with HTTP proxies.

Commits
-------

28f301bf03 [HttpClient] fix using proxies with NativeHttpClient
2020-10-02 10:29:59 +02:00
Nicolas Grekas
9c8a3009cf bug #38372 [Routing] fix using !important and defaults/reqs in inline route definitions (nicolas-grekas)
This PR was merged into the 4.4 branch.

Discussion
----------

[Routing] fix using !important and defaults/reqs in inline route definitions

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #33224
| License       | MIT
| Doc PR        | -

Commits
-------

826db225b7 [Routing] fix using !important and defaults/reqs in inline route definitions
2020-10-02 10:22:10 +02:00
Nicolas Grekas
28f301bf03 [HttpClient] fix using proxies with NativeHttpClient 2020-10-02 10:17:19 +02:00
Thomas Calvet
1a801e8452 [4.4] Ignore more deprecations for Mockery mocks 2020-10-02 09:34:48 +02:00
Fabien Potencier
d0ded920e6 bug #38367 [RateLimiter] Fix cache storage (use namespaced pool + remove \Serializable) (wouterj)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[RateLimiter] Fix cache storage (use namespaced pool + remove \Serializable)

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #38365, fix #38338
| License       | MIT
| Doc PR        | -

Commits
-------

251c202874 Use a dedicated cache.rate_limiter cache pool
5dc562a318 Use __sleep/__wakeup instead of Serializable
2020-10-02 08:02:03 +02:00
Fabien Potencier
67a7be2bd0 Fix CS 2020-10-02 07:59:23 +02:00
Fabien Potencier
954009a4d7 feature #32904 [Messenger] Added ErrorDetailsStamp (TimoBakx)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Messenger] Added ErrorDetailsStamp

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | yes
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #32311
| License       | MIT
| Doc PR        | No doc changes are needed

#SymfonyHackday

This PR is part of the work started in #32341. That PR has a workaround for showing exceptions added to a previous retry. This PR stores error messages in a separate stamp, so they're more easily accessed.

I also added the exceptionClass as a separate string (independant of FlattenException), so that information is always available, even if the trace is not (due to FlattenException not being available).

Duplicated exceptions (compared to the last one) are not stored separately.

**Questions:**
- Should we limit the total amount of exceptions (remove the oldest when adding a new one)?
  - Yes, but in a new PR
- The current implementation adds this stamp in the Worker instead of the listeners to prevent duplicate code (due to the immutability of the envelope in the event). Is this the proper way to do this?
  - No, create a new listener and a way to add stamps to the envelope inside the event.
- When adding details of a `HandlerFailedException`, should we add a stamp per wrapped `Throwable`? There can be multiple errors wrapped by a single `HandlerFailedException`.
  - Yes, but in a later PR

**Todo:**
- [x] only add new information if it differs from the previous exception
- [x] add deprecations
- [x] fall back to old stamp data if no new stamp is available
- [x] rebase and retarget to master
- [x] update CHANGELOG.md
- [x] check for docs PR

**BC Breaks:**
When this PR is merged, RedeliveryStamps will no longer be populated with exception data. Any implementations that use `RedeliveryStamp::getExceptionMessage()` or `RedeliveryStamp::getFlattenedException()` will receive an empty string or `null` respectively for stamps added after this update. They should rely on `ErrorDetailsStamp` instead.

**New stuff:**
- New stamp `ErrorDetailsStamp`.
- New event subscriber `AddErrorDetailsStampListener`.
- New method `AbstractWorkerMessageEvent::addStamps`.

Commits
-------

cd27b863f9 [Messenger] Added FailedMessageErrorDetailsStamp
2020-10-02 07:56:41 +02:00
Fabien Potencier
14942dbbe8 feature #36152 [Messenger] dispatch event when a message is retried (nikophil)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[Messenger] dispatch event when a message is retried

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| License       | MIT

Hello,

i'm working on a bundle which helps to monitor messenger queues (add some stats for queues/transports + ability to manage failed messages from the browser)
https://github.com/SymfonyCasts/messenger-monitor-bundle/

and we're missing some hooks in the messaging system:
1. a way to know when a message has been retried (fixed by dispatching a new `WorkerMessageRetriedEvent` in `SendFailedMessageForRetryListener::onMessageFailed()`)
2. a way to update the enveloppe in worker message events (fixed by adding `AbstractWorkerMessageEvent::setEnvelope()`)

if needed i can provide some precise use cases.

thanks.

Commits
-------

55bddcb721 [Messenger] dispatch event when a message is retried
2020-10-02 07:48:00 +02:00
Nicolas PHILIPPE
55bddcb721 [Messenger] dispatch event when a message is retried 2020-10-02 07:47:55 +02:00
Olivier Dolbeau
09c9bde479 Can define ChatMessage transport to null 2020-10-02 07:42:01 +02:00
Fabien Potencier
b35bbdbde5 feature #38289 [HttpClient] provide response body to the RetryDecider (jderusse)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[HttpClient] provide response body to the RetryDecider

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | yes but for not-yet released 5.2 feature
| Tickets       | /
| License       | MIT
| Doc PR        | TODO

Some servers, like AWS, does not always return standard HTTP code. The strategy needs to parse the body to take a decision.
example:
```
400
x-amzn-requestid: XXXXX
content-type: application/x-amz-json-1.1
content-length: 58
date: Thu, 24 Sep 2020 11:17:35 GMT
connection: close

{"__type":"ThrottlingException","message":"Rate exceeded"}
````

This PR update the `RetryDeciderInterface` interface to let the decider notifying the Client when it need the body to take a decision. in that case, the Client, fetch te client, and call again the decider with the full body.

usage
```php
class Decider implements RetryDeciderInterface {
    public function shouldRetry(string $requestMethod, string $requestUrl, array $requestOptions, int $responseCode, array $responseHeaders, ?string $responseContent, \Throwable $throwable = null): ?bool
    {
        if (null !== $throwable) {
            return true;
        }
        if (in_array($responseCode, [423, 425, 429, 500, 502, 503, 504, 507, 510])) {
            return true;
        }
        if (
            $responseCode !== 400
            || $headers['content-type'][0] ?? null !== 'application/x-amz-json-1.1'
            || (int) $headers['content-length'][0] ?? '0' > 1024
        ) {
            return false;
        }
        if (null === $responseContent) {
            return null; // null mean no decision taken and need to be called again with the body
        }

        $data = json_decode($responseContent, true);

        return $data['__type'] ?? '' === 'ThrottlingException';
    }
}
```

Commits
-------

321be5884d [HttpClient] provide response body to the RetryDecider
2020-10-02 07:36:08 +02:00
Kevin Bond
a7ecd0ed08
[RateLimiter] add Limit::ensureAccepted() and RateLimitExceededException 2020-10-01 20:04:22 -04:00
Nicolas Grekas
826db225b7 [Routing] fix using !important and defaults/reqs in inline route definitions 2020-10-01 18:25:17 +02:00
Thomas Calvet
bbd12fe27f [ErrorHandler][DebugClassLoader] Do not check Mockery mocks classes 2020-10-01 18:21:20 +02:00
Bohan Yang
7e0cd4e621 [HttpClient] Fix using https with proxies 2020-10-01 18:05:21 +02:00
Jérémy Derussé
321be5884d
[HttpClient] provide response body to the RetryDecider 2020-10-01 17:55:44 +02:00
Timo Bakx
cd27b863f9 [Messenger] Added FailedMessageErrorDetailsStamp 2020-10-01 16:25:39 +02:00
Nicolas Grekas
dadce4bec7 bug #38350 [TwigBundle] Only remove kernel exception listener if twig is used (dmolineus)
This PR was squashed before being merged into the 4.4 branch.

Discussion
----------

[TwigBundle] Only remove kernel exception listener if twig is used

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | https://github.com/contao/contao/issues/1527
| License       | MIT
| Doc PR        |

In a setup using the template engine but not twig as the template engine no exceptions are logged. This is caused by the twig-bundle which removes the `exception_listener` service. For my understanding this should only happen if twig is used as template engine. This PR fixes the logic that only for the case where twig is enabled as template engine the http kernel exception listener is removed. Otherwise the twig exception listener got removed now.

Disclaimer: I'm not too deep into the details, so maybe I oversee something why it's implemented the way it is.

Commits
-------

7c34f6e866 [TwigBundle] Only remove kernel exception listener if twig is used
2020-10-01 15:17:56 +02:00
David Molineus
7c34f6e866 [TwigBundle] Only remove kernel exception listener if twig is used 2020-10-01 15:17:48 +02:00
Wouter de Jong
251c202874 Use a dedicated cache.rate_limiter cache pool
Fixes #38365
2020-10-01 14:20:45 +02:00
Wouter de Jong
5dc562a318 Use __sleep/__wakeup instead of Serializable
Fixes #38338
2020-10-01 14:20:33 +02:00
Roland Franssen
d784b50da3
[DI] Fix changelog 2020-10-01 14:14:45 +02:00
Fabien Potencier
1b6894781c bug #38360 [BrowserKit] Cookie expiration at current timestamp (iquito)
This PR was merged into the 3.4 branch.

Discussion
----------

[BrowserKit] Cookie expiration at current timestamp

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| License       | MIT

In `Symfony\Component\BrowserKit\Cookie` a cookie is expired if the `expires` timestamp is in the past. I would like to change it to also be expired if the `expires` timestamp equals the current exact timestamp. This would still be in line with [RFC 6265](https://tools.ietf.org/html/rfc6265#section-4.1.2.1), as it states `The Expires attribute indicates the maximum lifetime of the cookie, represented as the date and time at which the cookie expires`.

Reason for this change: Cookies usually both have `expires` and `Max-Age` set, and Symfony sets `Max-Age` to zero if a cookie is expired (in `Symfony\Component\HttpFoundation\Cookie`). When converting cookies between string and object representations, `Max-Age` is the preferred source of truth for the expiration, but `Max-Age` set to zero is converted to an `expires` timestamp at this exact second, currently making the cookie not expired in `Symfony\Component\BrowserKit\Cookie`, even though it should be.

I noticed this discrepancy in my tests when checking if a cookie no longer existed after deleting it, yet it was still there, because `Cookie` thought it would only expire after the `expires` timestamp had passed. I am also thinking of raising an issue for `Symfony\Component\HttpFoundation\Cookie`, as importing and exporting an expired cookie (via strings) changes the `expired` value. I thought this change was a simpler one for now, and should have no negative/unexpected impact.

Commits
-------

9d187c0d1a Adjust expired range check
2020-10-01 12:44:36 +02:00
Andreas
9d187c0d1a Adjust expired range check
Include current second when deciding if cooke has expired.
2020-10-01 12:06:12 +02:00
Fabien Potencier
e36a36ae27 bug #38357 [DI] fix dumping non-shared lazy services (nicolas-grekas)
This PR was merged into the 5.1 branch.

Discussion
----------

[DI] fix dumping non-shared lazy services

| Q             | A
| ------------- | ---
| Branch?       | 5.1
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #38327
| License       | MIT
| Doc PR        | -

It took me a while to get this correct, but here we are.

Commits
-------

e33a0b0f94 [DI] fix dumping non-shared lazy services
2020-10-01 11:49:19 +02:00
Fabien Potencier
127724d519 feature #38308 [Security][RateLimiter] Added request rate limiter to prevent breadth-first attacks (wouterj)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Security][RateLimiter] Added request rate limiter to prevent breadth-first attacks

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | yes
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

This allows limiting on different elements of a request. The normal `CompoundLimiter` requires the same key for all its limiters.

This request limiter is useful to e.g. prevent breadth-first attacks, by allowing to enforce a limit on both IP and IP+username. It can also be useful for applications using some sort of API request limiting (or e.g. file upload limiting).

The default login throttling limiter will allow `max_attempts` (default: 5) attempts per minute for `username + IP` and `5 * max_attempts` for `IP`. Customizing this will require creating a new service that extends `AbstractRequestRateLimiter` and implementing `getLimiters(Request $request): LimiterInterface[]`.

Commits
-------

5d03afea99 Added request rate limiters and improved login throttling
2020-10-01 08:42:40 +02:00
Robin Chalas
e8dd14ac9e bug #38351 [Console] clone stream on multiline questions so EOT doesn't close input (ramsey)
This PR was squashed before being merged into the 5.2-dev branch (closes #38351).

Discussion
----------

[Console] clone stream on multiline questions so EOT doesn't close input

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | N/A
| License       | MIT
| Doc PR        | N/A

This fixes a bug in the multiline question feature that was introduced in #37683.

Today, @epitre commented on https://github.com/symfony/symfony/pull/37683#issuecomment-700666826:

> If I ask a question AFTER using the multiline option in a previous question, then it seems that the ctrl+d is kind of saved, and the command gets aborted.

I'm honestly not sure how I missed this while working on #37683, since I was testing it with multiple questions, but I think it might have resulted from some of the back-and-forth and the lack of ability to effectively test the EOT character from a unit test.

The solution was to _clone_ the input stream resource and use the clone to read the multiline input and capture the EOT byte. In this way, the primary input stream is not closed by the EOT.

This is similar to @epitre's solution in https://github.com/symfony/symfony/pull/38345, but I'm using the `uri` and `mode` from `stream_get_meta_data()` to create the new stream, and if the existing stream has any data and is seekable and writable (like the streams used in the tests), I add the data to the clone and seek to the same offset.

I've ensured that this solution works on a question that is in the middle of a series of other questions, and I've tested in on *nix and Windows. I've also improved the tests for multiline questions. While I'm unable to test (with a unit test) that an EOT character effectively stops reading from STDIN while continuing to the next question and prompt, I feel confident that the tests here provide sufficient coverage.

Commits
-------

ec688a361e [Console] clone stream on multiline questions so EOT doesn't close input
2020-09-30 21:48:20 +02:00
Ben Ramsey
ec688a361e [Console] clone stream on multiline questions so EOT doesn't close input 2020-09-30 21:34:12 +02:00
Wouter de Jong
5d03afea99 Added request rate limiters and improved login throttling
This allows limiting on different elements of a request. This is usefull to
e.g. prevent breadth-first attacks, by allowing to enforce a limit on both IP
and IP+username.
2020-09-30 21:18:40 +02:00
Alexander Schranz
f4e42ad3d4 Fix redis connection error message
Use correct instance of redis to getLastError
2020-09-30 18:06:18 +02:00
Nicolas Grekas
e33a0b0f94 [DI] fix dumping non-shared lazy services 2020-09-30 17:55:21 +02:00
Fabien Potencier
186ecc108b [Security] Improve exceptionwhen rate-limiter is not installed and throttling enabled 2020-09-30 16:14:02 +02:00
Wouter de Jong
0279f88e6c Call all compound limiters on failure and added IO blocking 2020-09-30 12:14:20 +02:00
Titouan Galopin
3941d70928 [Form] Implement Twig helpers to get field variables 2020-09-30 12:00:15 +02:00
Fabien Potencier
aa661492d2 feature #38257 [RateLimiter] Add limit object on RateLimiter consume method (Valentin, vasilvestre)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[RateLimiter] Add limit object on RateLimiter consume method

| Q             | A
| ------------- | ---
| Branch?       | master (should be merged in 5.2 before 31 September if possible)
| Bug fix?      | no
| New feature?  | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets       | Fix #38241
| License       | MIT
| Doc PR        | Not yet :/ <!-- https://github.com/symfony/symfony-docs/pull/X -->

Commits
-------

8f62afc5f9 [RateLimiter] Return Limit object on Consume method
2020-09-30 07:47:32 +02:00
Valentin
8f62afc5f9 [RateLimiter] Return Limit object on Consume method 2020-09-30 07:47:20 +02:00
Fabien Potencier
5eb442ec18 feature #38309 [Validator] Constraints as php 8 Attributes (derrabus)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Validator] Constraints as php 8 Attributes

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | #38096
| License       | MIT
| Doc PR        | TODO

This is my attempt to teach the validator to load constraints from PHP attributes. Like we've done it for the `Route` attribute, I've hooked into the existing `AnnotationLoader`, so we can again mix and match annotations and attributes.

### Named Arguments

An attribute declaration is basically a constructor call. This is why, in order to effectively use a constraint as attribute, we need to equip it with a constructor that works nicely with named arguments. This way, IDEs like PhpStorm can provide auto-completion and guide a developer when declaring a constraint without the need for additional plugins. Right now, PhpStorm supports neither attributes nor named arguments, but I expect those features to be implemented relatively soon.

To showcase this, I have migrated the `Range` and `Choice` constraints. The example presented in #38096 works with this PR.

```php
#[Assert\Choice(
    choices: ['fiction', 'non-fiction'],
    message: 'Choose a valid genre.',
)]
private $genre;
```

A nice side effect is that we get a more decent constructor call in php 8 in situations where we directly instantiate constraints, for instance when attaching constraints to a form field via the form builder.

```php
$builder->add('genre, TextType::class, [
    'constraints' => [new Assert\Choice(
        choices: ['fiction', 'non-fiction'],
        message: 'Choose a valid genre.',
    )],
]);
```

The downside is that all those constructors generate the need for some boilerplate code that was previously abstracted away by the `Constraint` class.

The alternative to named arguments would be leaving the constructors as they are. That would basically mean that when declaring a constraint we would have to emulate the array that Doctrine annotations would crate. We would lose IDE support and the declarations would be uglier, but it would work.

```php
#[Assert\Choice([
    'choices' => ['fiction', 'non-fiction'],
    'message' => 'Choose a valid genre.',
])]
private $genre;
```

### Nested Attributes

PHP does not support nesting attributes (yet?). This is why I could not recreate composite annotations like `All` and `Collection`. I think it's okay if they're not included in the first iteration of attribute constraints and we can work on a solution in a later PR. Possible options:
* A later PHP 8.x release might give us nested attributes.
* We could find a way to flatten those constraints so we can recreate them without nesting.
* We could come up with a convention for a structure that lets us emulate nested attributes in userland.

### Repeatable attributes

In order to attach two instances of the same attribute class to an element, we explicitly have to allow repetition via the flag `Attribute::IS_REPEATABLE`. While we could argue if it really makes sense to do this for certain constraints (like `NotNull` for instance), there are others (like `Callback`) where having two instances with different configurations could make sense. On the other hand, the validator certainly won't break if we repeat any of the constraints and all other ways to configure constraints allow repetition. This is why I decided to allow repetition for all constraints I've marked as attributes in this PR and propose to continue with that practice for all other constraints.

### Migration Path

This PR only migrates a handful of constraints. My plan is to discuss the general idea with this PR first and use it as a blueprint to migrate the individual constraints afterwards. Right now, the migration path would look like this:

* Attach the `#[Attribute]` attribute.
* Recreate all options of the constraint as constructor arguments.
* Add test cases for constructor calls with named arguments to the test class of the constraint's validator.

Commits
-------

d1cb2d6354 [Validator] Constraints as php 8 Attributes.
2020-09-30 07:35:13 +02:00
Fabien Potencier
dbedd284f4 minor #38315 [Notifier] Add Dsn test case (jschaedl)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Notifier] Add Dsn test case

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets       | - <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License       | MIT
| Doc PR        | - <!-- required for new features -->
<!--
Replace this notice by a short README for your feature/bugfix. This will help people
understand your PR and can be used as a start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - Never break backward compatibility (see https://symfony.com/bc).
 - Bug fixes must be submitted against the lowest maintained branch where they apply
   (lowest branches are regularly merged to upper ones so they get the fixes too.)
 - Features and deprecations must be submitted against branch master.
-->

Commits
-------

6a0510d859 Add Dsn test case
2020-09-30 07:33:36 +02:00
Fabien Potencier
3f51de3ee8 Merge branch '5.1'
* 5.1:
  [FrameworkBundle] Add Mailjet definition
  Revert "bug #38063 [FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable (nicolas-grekas)"
  [PhpUnitBridge] Fix class_alias() for PHPUnit\Framework\Error\Error
2020-09-30 07:29:43 +02:00
Fabien Potencier
65ee6c9f88 Merge branch '4.4' into 5.1
* 4.4:
  Revert "bug #38063 [FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable (nicolas-grekas)"
  [PhpUnitBridge] Fix class_alias() for PHPUnit\Framework\Error\Error
2020-09-30 07:27:28 +02:00
Rodrigo Aguilera
c451c48258 [Console] Improve description for the help flag. 2020-09-30 07:13:00 +02:00
Alexander M. Turek
d1cb2d6354 [Validator] Constraints as php 8 Attributes. 2020-09-30 00:43:35 +02:00
Michael Käfer
132bd2ad24 [FrameworkBundle] Add Mailjet definition 2020-09-29 22:17:22 +02:00
Nicolas Grekas
662fcff40f Revert "bug #38063 [FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable (nicolas-grekas)"
This reverts commit d441d867cd, reversing
changes made to 043e7c34de.
2020-09-29 11:51:46 +02:00
Nicolas Grekas
55c17e1af7 [Validator] Add support for UUIDv6 in Uuid constraint 2020-09-29 08:56:19 +02:00
Fabien Potencier
72ff4012a5 bug #38336 [PhpUnitBridge] Fixed class_alias() for PHPUnit\Framework\Error\Error (stevegrunwell)
This PR was merged into the 4.4 branch.

Discussion
----------

[PhpUnitBridge] Fixed class_alias() for PHPUnit\Framework\Error\Error

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | n/a
| License       | MIT
| Doc PR        | n/a

PHPUnit 6.x removed the PHPUnit_Framework_* classes in favor of PHP namespaces, but one error class did not map the same as the others: `PHPUnit_Framework_Error`.

Instead of mapping to `PHPUnit\Framework\Error` in the same way that `PHPUnit_Framework_Error_Warning` mapped to `PHPUnit\Framework\Error\Warning`, this base class was replaced with `PHPUnit\Framework\Error\Error`, so we cannot map it using simple string replacement like its descendants.

Commits
-------

8e607b58df [PhpUnitBridge] Fix class_alias() for PHPUnit\Framework\Error\Error
2020-09-29 08:53:53 +02:00
Fabien Potencier
d5ce0e3bc9 feature #38330 [Contracts] add TranslatableInterface (nicolas-grekas)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Contracts] add TranslatableInterface

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | #38319
| License       | MIT
| Doc PR        | -

An alternative to #38328:

- `TranslatableInterface` is added to symfony/contracts;
- `Translatable`, still in the component, implements it (and is not final as it makes no sense for a value-object)
- the `t()` function is kept in the component - it doesn't fit in the contracts IMHO;
- `Translatable::trans()` is not static anymore;
- the domain is nullable instead of defaulting to "messages";
- the `t()` function moved in the `Symfony\Component\Translation` namespace (for reference, the `s()` function from String is also namespaced.);
- the Twig extension is made strictly polymorphic: if you pass a Translatable, you cannot pass arguments/domain/count.

Commits
-------

9224f7ac5b [Contracts] add TranslatableInterface
2020-09-29 08:51:20 +02:00
Fabien Potencier
e159dff938 feature #38322 [Validator] Add Ulid constraint and validator (Laurent Clouet)
This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

[Validator] Add Ulid constraint and validator

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | Fix #38152
| License       | MIT

ULID constraint and validator as mentioned in ticket #38103
I checked for it ulid specifications https://github.com/ulid/spec

Commits
-------

e36fd559da [Validator] Add Ulid constraint and validator
2020-09-29 08:36:34 +02:00
Laurent Clouet
e36fd559da [Validator] Add Ulid constraint and validator 2020-09-29 08:36:29 +02:00
Fabien Potencier
3113fce1df feature #38333 [Uid] make UUIDv6 always return truly random nodes to prevent leaking the MAC of the host (nicolas-grekas)
This PR was merged into the 5.2-dev branch.

Discussion
----------

[Uid] make UUIDv6 always return truly random nodes to prevent leaking the MAC of the host

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

As explained in http://gh.peabody.io/uuidv6/, the wording of the UUIDv1 spec suggests that using the MAC of the host is preferred to compute the "node" field of UUIDs. This is what the uuid extension does, and the reason why the 12 last chars of the UUIDv1 it generates are stable. But this is a privacy leak. There are stories in the wild about how knowing the MAC has been abused in the past.

UUIDv6 prefers putting a secure random number there.

So here is the PR to do so.

Commits
-------

b9c61ca86c [Uid] make UUIDv6 always return truly random nodes to prevent leaking the MAC of the host
2020-09-29 08:35:35 +02:00
Nicolas Grekas
b9c61ca86c [Uid] make UUIDv6 always return truly random nodes to prevent leaking the MAC of the host 2020-09-29 08:01:16 +02:00
Steve Grunwell
8e607b58df [PhpUnitBridge] Fix class_alias() for PHPUnit\Framework\Error\Error
PHPUnit 6.x removed the PHPUnit_Framework_* classes in favor of PHP namespaces, but one error class did not map the same as the others: `PHPUnit_Framework_Error`.

Instead of mapping to `PHPUnit\Framework\Error` in the same way that `PHPUnit_Framework_Error_Warning` mapped to `PHPUnit\Framework\Error\Warning`, this base class was replaced with `PHPUnit\Framework\Error\Error`.
2020-09-28 16:03:26 -04:00
Nicolas Grekas
9224f7ac5b [Contracts] add TranslatableInterface 2020-09-28 15:05:58 +02:00
Jérémy Derussé
7a80e41cd8
Fix non-blocking store fallback 2020-09-28 12:11:42 +02:00
Nicolas Grekas
6349a1b2fc Merge branch '5.1'
* 5.1:
  [HttpFoundation] skip tests when the IANA server is throttling the list of status codes
  [DoctrineBridge] fix DBAL v3 compat
2020-09-27 16:15:50 +02:00
Nicolas Grekas
66758ad5dc Merge branch '4.4' into 5.1
* 4.4:
  [HttpFoundation] skip tests when the IANA server is throttling the list of status codes
  [DoctrineBridge] fix DBAL v3 compat
2020-09-27 16:14:57 +02:00
Nicolas Grekas
cbb0b1d54b Merge branch '3.4' into 4.4
* 3.4:
  [HttpFoundation] skip tests when the IANA server is throttling the list of status codes
  [DoctrineBridge] fix DBAL v3 compat
2020-09-27 16:14:06 +02:00
Nicolas Grekas
feaa9a6b2a [HttpFoundation] skip tests when the IANA server is throttling the list of status codes 2020-09-27 16:13:16 +02:00
Nicolas Grekas
4b1612b8dd [DoctrineBridge] fix DBAL v3 compat 2020-09-27 16:06:58 +02:00
Nicolas Grekas
cde8ffecce Merge branch '5.1'
* 5.1:
  [Filesystem] fix for PHP 8
  [Cache] fix DBAL v3 compat
  Bump Symfony version to 5.1.7
  Update VERSION for 5.1.6
  Update CHANGELOG for 5.1.6
  Bump Symfony version to 4.4.15
  Update VERSION for 4.4.14
  Update CHANGELOG for 4.4.14
  Bump Symfony version to 3.4.46
  Update VERSION for 3.4.45
  Update CONTRIBUTORS for 3.4.45
  Update CHANGELOG for 3.4.45
2020-09-27 16:05:32 +02:00
Nicolas Grekas
b93dea7244 Merge branch '4.4' into 5.1
* 4.4:
  [Filesystem] fix for PHP 8
  [Cache] fix DBAL v3 compat
  Bump Symfony version to 4.4.15
  Update VERSION for 4.4.14
  Update CHANGELOG for 4.4.14
  Bump Symfony version to 3.4.46
  Update VERSION for 3.4.45
  Update CONTRIBUTORS for 3.4.45
  Update CHANGELOG for 3.4.45
2020-09-27 16:02:37 +02:00
Nicolas Grekas
7529d131cc Merge branch '3.4' into 4.4
* 3.4:
  [Filesystem] fix for PHP 8
2020-09-27 15:54:16 +02:00
Nicolas Grekas
a4324447f1 [Filesystem] fix for PHP 8 2020-09-27 15:07:29 +02:00
Jan Schädlich
6a0510d859 Add Dsn test case 2020-09-27 14:45:53 +02:00
Nicolas Grekas
911e120fa4 Merge branch '3.4' into 4.4
* 3.4:
  [Cache] fix DBAL v3 compat
  Bump Symfony version to 3.4.46
  Update VERSION for 3.4.45
  Update CONTRIBUTORS for 3.4.45
  Update CHANGELOG for 3.4.45
2020-09-27 14:40:39 +02:00
Nicolas Grekas
3d1ed2e90d [Cache] fix DBAL v3 compat 2020-09-27 14:33:10 +02:00
Jonas Hünig
91a44524ff [HttpFoundation][Cache][Messenger] Replace redis "DEL" commands with "UNLINK" 2020-09-27 12:41:29 +02:00
Fabien Potencier
176262b3b9 Bump Symfony version to 5.1.7 2020-09-27 06:36:47 +02:00
Fabien Potencier
81bcd90f08 Update VERSION for 5.1.6 2020-09-27 06:33:19 +02:00
Fabien Potencier
08e27e9f03 Bump Symfony version to 4.4.15 2020-09-27 06:29:46 +02:00
Fabien Potencier
9e8f2e7db6 Update VERSION for 4.4.14 2020-09-27 06:25:44 +02:00
Fabien Potencier
2abc465335 Merge branch '5.1'
* 5.1:
  Fix wrong merge
2020-09-27 06:23:47 +02:00
Fabien Potencier
46e609b262 Fix wrong merge 2020-09-27 06:23:37 +02:00
Fabien Potencier
9a774ede48 Bump Symfony version to 3.4.46 2020-09-27 06:03:03 +02:00
Fabien Potencier
bc38373380 Update VERSION for 3.4.45 2020-09-27 05:46:58 +02:00
Fabien Potencier
6ca92258d7 Merge branch '5.1'
* 5.1:
  [ErrorHandler] Return false directly and remove unused variable
  [OptionsResolver] Assert that the error type is valid in deprecations test
  [OptionsResolver] Fix deprecation message access
  [HttpClient] Allow bearer token with colon
  [Form] Fix custom formats deprecation with HTML5 widgets
  [Translator] Optional Intl dependency
  [Contracts][Translation] Optional Intl dependency
  [ErrorHandler] Escape JSON encoded log context
  update missing translations arabic
  [Yaml] simplify the test
  fix test by letting mock throw the actual expected exception
2020-09-27 05:44:38 +02:00
Fabien Potencier
5685496974 Merge branch '4.4' into 5.1
* 4.4:
  [ErrorHandler] Return false directly and remove unused variable
  [OptionsResolver] Assert that the error type is valid in deprecations test
  [HttpClient] Allow bearer token with colon
  [Form] Fix custom formats deprecation with HTML5 widgets
  [Translator] Optional Intl dependency
  [Contracts][Translation] Optional Intl dependency
  [ErrorHandler] Escape JSON encoded log context
  update missing translations arabic
  [Yaml] simplify the test
  fix test by letting mock throw the actual expected exception
2020-09-27 05:44:28 +02:00