fix(SystemTagManager): Truncate overlong tag names

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
This commit is contained in:
Marcel Klehr 2023-02-23 17:34:53 +01:00
parent a85639f1cc
commit db9c322b0c
2 changed files with 14 additions and 7 deletions

View file

@ -193,10 +193,12 @@ class SystemTagManager implements ISystemTagManager {
* {@inheritdoc}
*/
public function createTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag {
// Length of name column is 64
$truncatedTagName = substr($tagName, 0, 64);
$query = $this->connection->getQueryBuilder();
$query->insert(self::TAG_TABLE)
->values([
'name' => $query->createNamedParameter($tagName),
'name' => $query->createNamedParameter($truncatedTagName),
'visibility' => $query->createNamedParameter($userVisible ? 1 : 0),
'editable' => $query->createNamedParameter($userAssignable ? 1 : 0),
]);
@ -205,7 +207,7 @@ class SystemTagManager implements ISystemTagManager {
$query->execute();
} catch (UniqueConstraintViolationException $e) {
throw new TagAlreadyExistsException(
'Tag ("' . $tagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists',
'Tag ("' . $truncatedTagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists',
0,
$e
);
@ -215,7 +217,7 @@ class SystemTagManager implements ISystemTagManager {
$tag = new SystemTag(
(string)$tagId,
$tagName,
$truncatedTagName,
$userVisible,
$userAssignable
);

View file

@ -260,6 +260,11 @@ class SystemTagManagerTest extends TestCase {
$this->tagManager->createTag($name, $userVisible, $userAssignable);
}
public function testCreateOverlongName() {
$tag = $this->tagManager->createTag('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas, Salão de Física, Torre Sineira, Paço Velho e Jardim Botânico)', true, true);
$this->assertSame('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas', $tag->getName()); // 63 characters but 64 bytes due to "á"
}
/**
* @dataProvider oneTagMultipleFlagsProvider
*/
@ -282,14 +287,14 @@ class SystemTagManagerTest extends TestCase {
$this->assertSameTag($tag2, $tagList[$tag2->getId()]);
}
public function testGetNonExistingTag() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);
$this->tagManager->getTag('nonexist', false, false);
}
public function testGetNonExistingTagsById() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);
@ -297,7 +302,7 @@ class SystemTagManagerTest extends TestCase {
$this->tagManager->getTagsByIds([$tag1->getId(), 100, 101]);
}
public function testGetInvalidTagIdFormat() {
$this->expectException(\InvalidArgumentException::class);
@ -392,7 +397,7 @@ class SystemTagManagerTest extends TestCase {
$this->assertEmpty($this->tagManager->getAllTags());
}
public function testDeleteNonExistingTag() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);