mirror of
https://github.com/nextcloud/server.git
synced 2026-03-03 14:01:34 -05:00
Merge pull request #29926 from nextcloud/fix/noid/short-accounts-data-value
This commit is contained in:
commit
7d67de24a5
3 changed files with 39 additions and 1 deletions
|
|
@ -343,6 +343,10 @@ class AccountManager implements IAccountManager {
|
|||
}
|
||||
|
||||
public function searchUsers(string $property, array $values): array {
|
||||
// the value col is limited to 255 bytes. It is used for searches only.
|
||||
$values = array_map(function (string $value) {
|
||||
return Util::shortenMultibyteString($value, 255);
|
||||
}, $values);
|
||||
$chunks = array_chunk($values, 500);
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$query->select('*')
|
||||
|
|
@ -625,8 +629,11 @@ class AccountManager implements IAccountManager {
|
|||
continue;
|
||||
}
|
||||
|
||||
// the value col is limited to 255 bytes. It is used for searches only.
|
||||
$value = $property['value'] ? Util::shortenMultibyteString($property['value'], 255) : '';
|
||||
|
||||
$query->setParameter('name', $property['name'])
|
||||
->setParameter('value', $property['value'] ?? '');
|
||||
->setParameter('value', $value);
|
||||
$query->executeStatement();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -513,4 +513,28 @@ class Util {
|
|||
}
|
||||
return self::$needUpgradeCache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sometimes a string has to be shortened to fit within a certain maximum
|
||||
* data length in bytes. substr() you may break multibyte characters,
|
||||
* because it operates on single byte level. mb_substr() operates on
|
||||
* characters, so does not ensure that the shortend string satisfies the
|
||||
* max length in bytes.
|
||||
*
|
||||
* For example, json_encode is messing with multibyte characters a lot,
|
||||
* replacing them with something along "\u1234".
|
||||
*
|
||||
* This function shortens the string with by $accurancy (-5) from
|
||||
* $dataLength characters, until it fits within $dataLength bytes.
|
||||
*
|
||||
* @since 23.0.0
|
||||
*/
|
||||
public static function shortenMultibyteString(string $subject, int $dataLength, int $accuracy = 5): string {
|
||||
$temp = mb_substr($subject, 0, $dataLength);
|
||||
// json encodes encapsulates the string in double quotes, they need to be substracted
|
||||
while ((strlen(json_encode($temp)) - 2) > $dataLength) {
|
||||
$temp = mb_substr($temp, 0, -$accuracy);
|
||||
}
|
||||
return $temp;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -310,4 +310,11 @@ class UtilTest extends \Test\TestCase {
|
|||
'myApp/vendor/myFancyCSSFile2',
|
||||
], \OC_Util::$styles);
|
||||
}
|
||||
|
||||
public function testShortenMultibyteString() {
|
||||
$this->assertEquals('Short nuff', \OCP\Util::shortenMultibyteString('Short nuff', 255));
|
||||
$this->assertEquals('ABC', \OCP\Util::shortenMultibyteString('ABCDEF', 3));
|
||||
// each of the characters is 12 bytes
|
||||
$this->assertEquals('🙈', \OCP\Util::shortenMultibyteString('🙈🙊🙉', 16, 2));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue