]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(comments): Allow mentions of federated users, groups and teams in the future 43875/head
authorJoas Schilling <coding@schilljs.com>
Tue, 27 Feb 2024 16:11:23 +0000 (17:11 +0100)
committerJoas Schilling <coding@schilljs.com>
Tue, 27 Feb 2024 16:11:23 +0000 (17:11 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/Comments/Comment.php
tests/lib/Comments/CommentTest.php

index 183821e37b1ee65697ddeae394004d1893070112..58a3ac96b1d1b4132aa5295a2158b390aa4cfb31 100644 (file)
@@ -220,7 +220,7 @@ class Comment implements IComment {
         *
         */
        public function getMentions(): array {
-               $ok = preg_match_all("/\B(?<![^a-z0-9_\-@\.\'\s])@(\"guest\/[a-f0-9]+\"|\"group\/[a-z0-9_\-@\.\' ]+\"|\"[a-z0-9_\-@\.\' ]+\"|[a-z0-9_\-@\.\']+)/i", $this->getMessage(), $mentions);
+               $ok = preg_match_all("/\B(?<![^a-z0-9_\-@\.\'\s])@(\"guest\/[a-f0-9]+\"|\"(?:federated_)?(?:group|team|user){1}\/[a-z0-9_\-@\.\' \/:]+\"|\"[a-z0-9_\-@\.\' ]+\"|[a-z0-9_\-@\.\']+)/i", $this->getMessage(), $mentions);
                if (!$ok || !isset($mentions[0])) {
                        return [];
                }
@@ -230,11 +230,21 @@ class Comment implements IComment {
                });
                $result = [];
                foreach ($mentionIds as $mentionId) {
+                       // Cut-off the @ and remove wrapping double-quotes
                        $cleanId = trim(substr($mentionId, 1), '"');
+
                        if (str_starts_with($cleanId, 'guest/')) {
                                $result[] = ['type' => 'guest', 'id' => $cleanId];
+                       } elseif (str_starts_with($cleanId, 'federated_group/')) {
+                               $result[] = ['type' => 'federated_group', 'id' => substr($cleanId, 16)];
                        } elseif (str_starts_with($cleanId, 'group/')) {
                                $result[] = ['type' => 'group', 'id' => substr($cleanId, 6)];
+                       } elseif (str_starts_with($cleanId, 'federated_team/')) {
+                               $result[] = ['type' => 'federated_team', 'id' => substr($cleanId, 15)];
+                       } elseif (str_starts_with($cleanId, 'team/')) {
+                               $result[] = ['type' => 'team', 'id' => substr($cleanId, 5)];
+                       } elseif (str_starts_with($cleanId, 'federated_user/')) {
+                               $result[] = ['type' => 'federated_user', 'id' => substr($cleanId, 15)];
                        } else {
                                $result[] = ['type' => 'user', 'id' => $cleanId];
                        }
index a46df75897ca2fa137317971f61aee84e8cb6461..ad4c5ef883281ebb5ad1bffeab6a841f2d79e38d 100644 (file)
@@ -134,19 +134,24 @@ class CommentTest extends TestCase {
                $comment->setMessage($msg);
        }
 
-       public function mentionsProvider() {
+       public function mentionsProvider(): array {
                return [
                        [
-                               '@alice @bob look look, a cook!', ['alice', 'bob']
+                               '@alice @bob look look, a cook!',
+                               [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
                        ],
                        [
-                               'no mentions in this message', []
+                               'no mentions in this message',
+                               []
                        ],
                        [
-                               '@alice @bob look look, a duplication @alice test @bob!', ['alice', 'bob']
+                               '@alice @bob look look, a duplication @alice test @bob!',
+                               [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
                        ],
                        [
-                               '@alice is the author, notify @bob, nevertheless mention her!', ['alice', 'bob'], 'alice'
+                               '@alice is the author, notify @bob, nevertheless mention her!',
+                               [['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
+                               /* author: */ 'alice'
                        ],
                        [
                                '@foobar and @barfoo you should know, @foo@bar.com is valid' .
@@ -154,19 +159,38 @@ class CommentTest extends TestCase {
                                        ' cc @23452-4333-54353-2342 @yolo!' .
                                        ' however the most important thing to know is that www.croissant.com/@oil is not valid' .
                                        ' and won\'t match anything at all',
-                               ['bar@foo.org@foobar.io', '23452-4333-54353-2342', 'foo@bar.com', 'foobar', 'barfoo', 'yolo']
+                               [
+                                       ['type' => 'user', 'id' => 'bar@foo.org@foobar.io'],
+                                       ['type' => 'user', 'id' => '23452-4333-54353-2342'],
+                                       ['type' => 'user', 'id' => 'foo@bar.com'],
+                                       ['type' => 'user', 'id' => 'foobar'],
+                                       ['type' => 'user', 'id' => 'barfoo'],
+                                       ['type' => 'user', 'id' => 'yolo'],
+                               ],
                        ],
                        [
-                               '@@chef is also a valid mention, no matter how strange it looks', ['@chef']
+                               '@@chef is also a valid mention, no matter how strange it looks',
+                               [['type' => 'user', 'id' => '@chef']],
                        ],
                        [
-                               'Also @"user with spaces" are now supported', ['user with spaces']
+                               'Also @"user with spaces" are now supported',
+                               [['type' => 'user', 'id' => 'user with spaces']],
                        ],
                        [
-                               'Also @"guest/0123456789abcdef" are now supported', [], null, ['guest/0123456789abcdef']
+                               'Also @"guest/0123456789abcdef" are now supported',
+                               [['type' => 'guest', 'id' => 'guest/0123456789abcdef']],
                        ],
                        [
-                               'Also @"group/My Group ID 321" are now supported', [], null, [], ['My Group ID 321']
+                               'Also @"group/My Group ID 321" are now supported',
+                               [['type' => 'group', 'id' => 'My Group ID 321']],
+                       ],
+                       [
+                               'Welcome federation @"federated_group/My Group ID 321" @"federated_team/Former Cirle" @"federated_user/cloudId@http://example.tld:8080/nextcloud"! Now freshly supported',
+                               [
+                                       ['type' => 'federated_user', 'id' => 'cloudId@http://example.tld:8080/nextcloud'],
+                                       ['type' => 'federated_group', 'id' => 'My Group ID 321'],
+                                       ['type' => 'federated_team', 'id' => 'Former Cirle'],
+                               ],
                        ],
                ];
        }
@@ -175,31 +199,16 @@ class CommentTest extends TestCase {
         * @dataProvider mentionsProvider
         *
         * @param string $message
-        * @param array $expectedUids
-        * @param string|null $author
-        * @param array $expectedGuests
+        * @param array $expectedMentions
+        * @param ?string $author
         */
-       public function testMentions(string $message, array $expectedUids, ?string $author = null, array $expectedGuests = [], array $expectedGroups = []): void {
+       public function testMentions(string $message, array $expectedMentions, ?string $author = null): void {
                $comment = new Comment();
                $comment->setMessage($message);
                if (!is_null($author)) {
                        $comment->setActor('user', $author);
                }
                $mentions = $comment->getMentions();
-               while ($mention = array_shift($mentions)) {
-                       if ($mention['type'] === 'user') {
-                               $id = array_shift($expectedUids);
-                       } elseif ($mention['type'] === 'guest') {
-                               $id = array_shift($expectedGuests);
-                       } elseif ($mention['type'] === 'group') {
-                               $id = array_shift($expectedGroups);
-                       } else {
-                               $this->fail('Unexpected mention type');
-                               continue;
-                       }
-                       $this->assertSame($id, $mention['id']);
-               }
-               $this->assertEmpty($mentions);
-               $this->assertEmpty($expectedUids);
+               $this->assertSame($expectedMentions, $mentions);
        }
 }