diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2021-01-08 10:44:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-08 10:44:32 +0100 |
commit | dc89447f13e3c4d00f24607c785e4056d2459642 (patch) | |
tree | 4b21b93ec1807cc748a675aebec1009eca6bcfb3 | |
parent | d6d8fc4226e6bb4094f8865d611352c5a38d5abc (diff) | |
download | nextcloud-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.php | 22 | ||||
-rw-r--r-- | apps/user_ldap/tests/Mapping/AbstractMappingTest.php | 19 |
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)); - } } |