Skip to content
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

Invalid Utf chars #339

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
stopOnFailure="true">
abnegate marked this conversation as resolved.
Show resolved Hide resolved
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Adapter/Postgres.php
Original file line number Diff line number Diff line change
Expand Up @@ -739,9 +739,9 @@ public function createDocument(string $collection, Document $document): Document
$stmtPermissions->execute();
}
} catch (Throwable $e) {
$this->getPDO()->rollBack();
switch ($e->getCode()) {
case 23505:
$this->getPDO()->rollBack();
throw new Duplicate('Duplicated document: ' . $e->getMessage());

default:
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Adapter/SQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -880,7 +880,7 @@ protected function getSQLTable(string $name): string
* Returns the current PDO object
* @return mixed
*/
protected function getPDO(): mixed
protected function getPDO(): PDO
{
return $this->pdo;
}
Expand Down
38 changes: 37 additions & 1 deletion tests/Database/Base.php
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,6 @@ public function testQueryTimeoutUsingStaticTimeout(): void
$this->expectNotToPerformAssertions();
}


/**
* @depends testCreateExistsDelete
*/
Expand Down Expand Up @@ -1082,6 +1081,43 @@ public function testCreateDocumentDefaults(): void
static::getDatabase()->deleteCollection('defaults');
}

public function testInvalidUtfCharacters(): void
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add some comments about what's being tested through the function?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done 👍
I did not make any global changes in Utopia for this fix, but we should know there is a problem we should be aware when trying to insert non-utf chars , for next time this issue pops up we can suggest a fix.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the exception in this case?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just wanted them to pass, to be aware of this issue, to alert it, and maybe later on add it in Utopia and not in the test

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep I just mean what's the exception message when it does throw?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh :)
The exception message varies between adapters I update the message in the tests, but with mariadb I can not since it includes namespaces which change, so I added the status code.
Good catch, did not realize Sqlite was passing, not sure what to do about it.

{
$collection = 'null_character';

static::getDatabase()->createCollection($collection);
static::getDatabase()->createAttribute($collection, 'str', Database::VAR_STRING, 128, true);

$str = "\x00";
$this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createDocument($collection, new Document([
'str' => $str,
])));

$str = "\u0000";
$this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createDocument($collection, new Document([
'str' => $str,
])));

$str = "\000";
$this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createDocument($collection, new Document([
'str' => $str,
])));

$str = "\xE2\x94";
try {
$this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createDocument($collection, new Document([
'str' => $str,
])));
$this->fail('Failed to throw Exception');
} catch (Exception $e) {
$this->assertTrue(true);
}

$this->assertInstanceOf('Utopia\Database\Document', static::getDatabase()->createDocument($collection, new Document([
'str' => mb_convert_encoding($str, 'UTF-8', 'UTF-8'),
])));
}

/**
* @throws AuthorizationException|LimitException|DuplicateException|StructureException|Exception|Throwable
*/
Expand Down
Loading