-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[LDAP] fix pagination for PHP 7.4 & 8.0 #38875
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
ec99d01
to
2e8f4ff
Compare
2e8f4ff
to
02f4ffd
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can't this be tested?
*/ | ||
private function controlPagedResultResponse($con, $result, string $cookie = ''): string | ||
{ | ||
$this->serverctrls = []; | ||
|
||
if (\PHP_VERSION_ID < 70300) { | ||
ldap_control_paged_result_response($con, $result, $cookie); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the point of calling this function when $result === null? Is that legal for its API?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hum. Not sure. It will probably return an empty string. I have to admit that I never paginated LDAP result so IDK. At least I should send 0 to keep compatibility.
@@ -174,8 +174,7 @@ public function getResources(): array | |||
private function resetPagination() | |||
{ | |||
$con = $this->connection->getResource(); | |||
$this->controlPagedResultResponse($con, 0, ''); | |||
$this->serverctrls = []; | |||
$this->controlPagedResultResponse($con, null, ''); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shouldn't we skip calling this method instead here (and keep $this->serverctrls = [];
?)
see my other comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think so. I just wanted to not break anything since I can't test it. It was actually used here in the same context before the refactoring of #38392
After PR symfony#38392 there is a little issue in the Symfony code base that occurs only for PHP 7.4 and PHP 8.0. This is related to issue symfony#38874
02f4ffd
to
65c1166
Compare
if (\PHP_VERSION_ID < 70300) { | ||
ldap_control_paged_result_response($con, $result, $cookie); | ||
|
||
return $cookie; | ||
} | ||
|
||
if (0 === $result) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
to really be compatible and seamless, this should be an elseif
- otherwise, we're affecting the behavior on php <=7.3.
a test case would really help if you can have a look
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a return in the previous if content, how can this impact the previous statements? 🤔
I was not able to run the test entire test suite on my computer :( . I'll give another try, but if you have any insights about running slapd that'd be great ^^' .
@@ -175,7 +175,6 @@ private function resetPagination() | |||
{ | |||
$con = $this->connection->getResource(); | |||
$this->controlPagedResultResponse($con, 0, ''); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking at the original PR : https://github.com/symfony/symfony/pull/38392/files#diff-24b79f3ac1a99938f5acb158a450e38d30c1984a5d333b5b20f2c38a73d10e31L183-R177
I think the fix, should be to change this line to:
$this->controlPagedResultResponse($con, 0, ''); | |
$this->controlPagedResult($con, 0, ''); |
and keep the rest of the code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/cc @lucasaba
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure. The original error is on #38874 is Warning: ldap_parse_result() expects parameter 2 to be resource, int given
.
The only place where ldap_parse_result
receive an in is when it is called from
$this->controlPagedResultResponse($con, 0, '');
I think the correct solutions is to call it with $this->controlPagedResultResponse($con, null, '');
But your proposal should work as well... I need to test it. I'll check with a working LDAP env.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
my point is, when. you replaced ldap_parse_result()
by controlPagedResult
in #38392, in that line you replaced it by controlPagedResultResponse
.
This explain why the second argument is 0
and not a ressources.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've created a new repository with a test openldap server with the configuration needed by symony's tests.
You can find it here: https://github.com/lucasaba/symfony-ldap-test-server
Just docker-compose up
it and launch test suite.
@jderusse suggestion fixes the problem. But I need some more time to make other checks. I'm unable to delete entries and I'm not sure if the problem is the LDAP server or the code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By the way: I had to modify AdapterTest and remove
const PAGINATION_REQUIRED_CONFIG = [
'options' => [
'protocol_version' => 3,
],
];
And I had to add, in LdapTestCase, after ldap_connect
, the following:
ldap_set_option($h, LDAP_OPT_PROTOCOL_VERSION, 3);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jderusse You're completly right! Its all my bad.
@Nek- I could launch locally the tests and they all pass. I should've done it earlier. I'm not able to add the ldap server on github actions because I still don't have enough knowledge.
To launch the tests, just clone https://github.com/lucasaba/symfony-ldap-test-server, build it and launch it. Then you can run phpunit against the LDAP tests.
Just some more notes (since you're working on it):
- remove definition of the
PAGINATION_REQUIRED_CONFIG
constant fromsrc/Symfony/Component/Ldap/Tests/Adapter/ExtLdap.php
and all its reference from the same file (it doesn't work) - add
ldap_set_option($h, LDAP_OPT_PROTOCOL_VERSION, 3);
onsrc/Symfony/Component/Ldap/Tests/LdapTestCase.php
just after the connection - at row 85, in
src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php
, modify the test. The exception is aLdapException
.AlreadyExistsException
is used for an already existing connection. - after the
testLdapAddDouble
there is a new entry ('cn=Elsa Amrouche,dc=symfony,dc=com'). This will break all successive tests.... you should find a way to remove the entry just after the test.... - at row 213, in
src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php
substitute the line with:
// $newEntry->getAttribute('cn') returns an array not a string
$this->assertContains($originalCN, $newEntry->getAttribute('cn'));
$this->assertContains('Kevin', $newEntry->getAttribute('cn'));
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idk if it's related to be being under WSL ^^' but even with the docker it's not working (even with rebinding ports).
Since I can't run the whole test suite I think cleaning the test suite is not a super good idea since it's out of the scope of this PR.
Closing in favor of #39031 |
This PR was merged into the 4.4 branch. Discussion ---------- [Ldap] Fix pagination | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | #38874 | License | MIT | Doc PR | N/A This replaces #38875 to fix a bug introduced by #38392 Commits ------- 4fe0a6f Fix LDAP pagination
This PR was merged into the 4.4 branch. Discussion ---------- [LDAP] Add ldap tests to github CI | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #39028 | License | MIT | Doc PR | Adds LDAP test on github actions pipeline and corrects sum bugs in the LDAP Component test It also adds a bug resolution from @Nek- made in #38875 Commits ------- ea78f72 Use GithubAction to run ldap tests af9562b Adds LDAP Adapter test in integration group
After PR #38392 there is a little issue in the Symfony code base that
occurs only for PHP 7.4 and PHP 8.0.
This is related to issue #38874