aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2021-01-08 10:44:32 +0100
committerGitHub <noreply@github.com>2021-01-08 10:44:32 +0100
commitdc89447f13e3c4d00f24607c785e4056d2459642 (patch)
tree4b21b93ec1807cc748a675aebec1009eca6bcfb3
parentd6d8fc4226e6bb4094f8865d611352c5a38d5abc (diff)
downloadnextcloud-server-dc89447f13e3c4d00f24607c785e4056d2459642.tar.gz
nextcloud-server-dc89447f13e3c4d00f24607c785e4056d2459642.zip
Revert "(LDAP) respect DB limits of arguments in an IN statement"
-rw-r--r--apps/user_ldap/lib/Mapping/AbstractMapping.php22
-rw-r--r--apps/user_ldap/tests/Mapping/AbstractMappingTest.php19
2 files changed, 5 insertions, 36 deletions
diff --git a/apps/user_ldap/lib/Mapping/AbstractMapping.php b/apps/user_ldap/lib/Mapping/AbstractMapping.php
index 64973d7d7cc..15f95744cd0 100644
--- a/apps/user_ldap/lib/Mapping/AbstractMapping.php
+++ b/apps/user_ldap/lib/Mapping/AbstractMapping.php
@@ -190,30 +190,18 @@ abstract class AbstractMapping {
}
public function getListOfIdsByDn(array $fdns): array {
- $fdnsSlice = count($fdns) > 1000 ? array_slice($fdns, 0, 1000) : $fdns;
$qb = $this->dbc->getQueryBuilder();
$qb->select('owncloud_name', 'ldap_dn')
->from($this->getTableName(false))
- ->where($qb->expr()->in('ldap_dn', $qb->createNamedParameter($fdnsSlice, QueryBuilder::PARAM_STR_ARRAY)));
-
- $slice = 1;
- while (isset($fdnsSlice[999])) {
- // Oracle does not allow more than 1000 values in the IN list,
- // but allows slicing
- $fdnsSlice = array_slice($fdns, 1000 * $slice, 1000);
- if (!empty($fdnsSlice)) {
- $qb->orWhere($qb->expr()->in('ldap_dn', $qb->createNamedParameter($fdnsSlice, QueryBuilder::PARAM_STR_ARRAY)));
- }
- $slice++;
- }
-
+ ->where($qb->expr()->in('ldap_dn', $qb->createNamedParameter($fdns, QueryBuilder::PARAM_STR_ARRAY)));
$stmt = $qb->execute();
- $results = [];
- while ($entry = $stmt->fetch(\Doctrine\DBAL\FetchMode::ASSOCIATIVE)) {
+
+ $results = $stmt->fetchAll(\Doctrine\DBAL\FetchMode::ASSOCIATIVE);
+ foreach ($results as $key => $entry) {
+ unset($results[$key]);
$results[$entry['ldap_dn']] = $entry['owncloud_name'];
$this->cache[$entry['ldap_dn']] = $entry['owncloud_name'];
}
- $stmt->closeCursor();
return $results;
}
diff --git a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php b/apps/user_ldap/tests/Mapping/AbstractMappingTest.php
index dd322d58a8e..079c2e21b10 100644
--- a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php
+++ b/apps/user_ldap/tests/Mapping/AbstractMappingTest.php
@@ -281,23 +281,4 @@ abstract class AbstractMappingTest extends \Test\TestCase {
$results = $mapper->getList(1, 1);
$this->assertSame(1, count($results));
}
-
- public function testGetListOfIdsByDn() {
- /** @var AbstractMapping $mapper */
- list($mapper,) = $this->initTest();
-
- $listOfDNs = [];
- for ($i = 0; $i < 65640; $i++) {
- // Postgres has a limit of 65535 values in a single IN list
- $name = 'as_' . $i;
- $dn = 'uid=' . $name . ',dc=example,dc=org';
- $listOfDNs[] = $dn;
- if ($i % 20 === 0) {
- $mapper->map($dn, $name, 'fake-uuid-' . $i);
- }
- }
-
- $result = $mapper->getListOfIdsByDn($listOfDNs);
- $this->assertSame(65640 / 20, count($result));
- }
}