diff --git a/composer.lock b/composer.lock index 245f8df196..44743e4fd1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3c1c6b1b397973a275146054a3221610", + "content-hash": "029dcab43ed83efdf56d471a8cc26f50", "packages": [ { "name": "adhocore/jwt", diff --git a/src/Appwrite/Messaging/Adapter/Realtime.php b/src/Appwrite/Messaging/Adapter/Realtime.php index c6bbe2054b..5617e76143 100644 --- a/src/Appwrite/Messaging/Adapter/Realtime.php +++ b/src/Appwrite/Messaging/Adapter/Realtime.php @@ -287,7 +287,6 @@ class Realtime extends Adapter $channels[] = 'documents'; $channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getCollection() . '.documents'; $channels[] = 'databases.' . $database->getId() . '.collections.' . $payload->getCollection() . '.documents.' . $payload->getId(); - $roles = ($collection->getAttribute('documentSecurity', false)) ? \array_merge($collection->getRead(), $payload->getRead()) : $collection->getRead(); @@ -301,7 +300,9 @@ class Realtime extends Adapter $channels[] = 'files'; $channels[] = 'buckets.' . $payload->getAttribute('bucketId') . '.files'; $channels[] = 'buckets.' . $payload->getAttribute('bucketId') . '.files.' . $payload->getId(); - $roles = ($bucket->getAttribute('permission') === 'bucket') ? $bucket->getRead() : $payload->getRead(); + $roles = $bucket->getAttribute('fileSecurity', false) + ? \array_merge($bucket->getRead(), $payload->getRead()) + : $bucket->getRead(); } break; diff --git a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php index b33dc906eb..667bc33789 100644 --- a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php +++ b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php @@ -60,10 +60,10 @@ class DatabasesPermissionsGuestTest extends Scope return [ [['read(any)']], [['read(users)']], - [['create(any)', 'update(any)', 'delete(any)']], - [['read(any)', 'create(any)', 'update(any)', 'delete(any)']], - [['read(users)', 'create(users)', 'update(users)', 'delete(users)']], - [['read(any)', 'create(users)', 'update(users)', 'delete(users)']], + [['update(any)', 'delete(any)']], + [['read(any)', 'update(any)', 'delete(any)']], + [['read(users)', 'update(users)', 'delete(users)']], + [['read(any)', 'update(users)', 'delete(users)']], ]; } diff --git a/tests/e2e/Services/Databases/DatabasesPermissionsMemberTest.php b/tests/e2e/Services/Databases/DatabasesPermissionsMemberTest.php index 64ffb04cc5..b17df37ac2 100644 --- a/tests/e2e/Services/Databases/DatabasesPermissionsMemberTest.php +++ b/tests/e2e/Services/Databases/DatabasesPermissionsMemberTest.php @@ -29,13 +29,13 @@ class DatabasesPermissionsMemberTest extends Scope [['read(any)']], [['read(users)']], [['read(user:random)']], - [['read(user:lorem)', 'create(user:lorem)', 'update(user:lorem)', 'delete(user:lorem)',]], - [['read(user:dolor)', 'create(user:dolor)', 'update(user:dolor)', 'delete(user:dolor)',]], - [['read(user:dolor)', 'read(user:lorem)', 'create(user:dolor)', 'update(user:dolor)', 'delete(user:dolor)',]], - [['create(any)', 'update(any)', 'delete(any)']], - [['read(any)', 'create(any)', 'update(any)', 'delete(any)']], - [['read(users)', 'create(users)', 'update(users)', 'delete(users)']], - [['read(any)', 'create(users)', 'update(users)', 'delete(users)']], + [['read(user:lorem)', 'update(user:lorem)', 'delete(user:lorem)',]], + [['read(user:dolor)', 'update(user:dolor)', 'delete(user:dolor)',]], + [['read(user:dolor)', 'read(user:lorem)', 'update(user:dolor)', 'delete(user:dolor)',]], + [['update(any)', 'delete(any)']], + [['read(any)', 'update(any)', 'delete(any)']], + [['read(users)', 'update(users)', 'delete(users)']], + [['read(any)', 'update(users)', 'delete(users)']], ]; } diff --git a/tests/unit/Messaging/MessagingTest.php b/tests/unit/Messaging/MessagingTest.php index 4beac912f4..217c9e5aab 100644 --- a/tests/unit/Messaging/MessagingTest.php +++ b/tests/unit/Messaging/MessagingTest.php @@ -208,11 +208,13 @@ class MessagingTest extends TestCase '$collection' => 'collection', '$permissions' => [ 'read(admin)', - 'update(admin)', 'delete(admin)', ], ]), + database: new Document([ + '$id' => 'database', + ]), collection: new Document([ '$id' => 'collection', '$permissions' => [ @@ -220,9 +222,6 @@ class MessagingTest extends TestCase 'update(any)', 'delete(any)', ], - ]), - database: new Document([ - '$id' => 'database', ]) ); @@ -243,29 +242,28 @@ class MessagingTest extends TestCase 'delete(any)', ], ]), + database: new Document([ + '$id' => 'database', + ]), collection: new Document([ '$id' => 'collection', '$permissions' => [ 'read(admin)', - 'update(admin)', 'delete(admin)', ], 'documentSecurity' => true, - ]), - database: new Document([ - '$id' => 'database', ]) ); $this->assertContains('any', $result['roles']); - $this->assertNotContains('role:admin', $result['roles']); + $this->assertContains('admin', $result['roles']); } public function testFromPayloadBucketLevelPermissions(): void { /** - * Test Collection Level Permissions + * Test Bucket Level Permissions */ $result = Realtime::fromPayload( event: 'buckets.bucket_id.files.file_id.create', @@ -274,7 +272,6 @@ class MessagingTest extends TestCase '$collection' => 'bucket', '$permissions' => [ 'read(admin)', - 'update(admin)', 'delete(admin)', ], @@ -290,10 +287,10 @@ class MessagingTest extends TestCase ); $this->assertContains('any', $result['roles']); - $this->assertNotContains('role:admin', $result['roles']); + $this->assertNotContains('admin', $result['roles']); /** - * Test Document Level Permissions + * Test File Level Permissions */ $result = Realtime::fromPayload( event: 'buckets.bucket_id.files.file_id.create', @@ -310,15 +307,14 @@ class MessagingTest extends TestCase '$id' => 'bucket', '$permissions' => [ 'read(admin)', - 'update(admin)', 'delete(admin)', ], - 'documentSecurity' => true + 'fileSecurity' => true ]) ); $this->assertContains('any', $result['roles']); - $this->assertNotContains('role:admin', $result['roles']); + $this->assertContains('admin', $result['roles']); } }