diff options
-rw-r--r-- | docs/capabilities.md | 2 | ||||
-rw-r--r-- | lib/Capabilities.php | 46 | ||||
-rw-r--r-- | tests/php/CapabilitiesTest.php | 46 |
3 files changed, 91 insertions, 3 deletions
diff --git a/docs/capabilities.md b/docs/capabilities.md index a75ea8b30..ef269c1c2 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -116,3 +116,5 @@ ## 17 * `avatar` - Avatar of conversation * `config => chat => translations` - List of translations tuples, JSON encoded sample `{"from":"de","fromLabel":"German","to":"en","toLabel":"English"}`. Those tuples should be provided as options when translating chat messages. +* `config => call => predefined-backgrounds` - List of predefined virtual backgrounds. The files are in Talks img/ folder, accessible via the normal image path methods. The list is cached for 5 minutes. +* `config => call => can-upload-background` - Boolean flag whether the user can upload a custom virtual background (requires an account and non-zero quota). Uploads should be done to Talk/Backgrounds/ (respecting the user's attachment directory setting). diff --git a/lib/Capabilities.php b/lib/Capabilities.php index 0afde7987..a7a270d12 100644 --- a/lib/Capabilities.php +++ b/lib/Capabilities.php @@ -29,12 +29,16 @@ use OCA\Talk\Chat\ChatManager; use OCP\App\IAppManager; use OCP\Capabilities\IPublicCapability; use OCP\Comments\ICommentsManager; +use OCP\ICache; +use OCP\ICacheFactory; use OCP\IConfig; use OCP\IUser; use OCP\IUserSession; use OCP\Translation\ITranslationManager; +use OCP\Util; class Capabilities implements IPublicCapability { + protected ICache $talkCache; public function __construct( protected IConfig $serverConfig, @@ -43,7 +47,9 @@ class Capabilities implements IPublicCapability { protected IUserSession $userSession, protected IAppManager $appManager, protected ITranslationManager $translationManager, + ICacheFactory $cacheFactory, ) { + $this->talkCache = $cacheFactory->createLocal('talk::'); } public function getCapabilities(): array { @@ -163,6 +169,46 @@ class Capabilities implements IPublicCapability { $capabilities['features'][] = 'chat-reference-id'; } + $predefinedBackgrounds = $this->talkCache->get('predefined_backgrounds'); + if ($predefinedBackgrounds !== null) { + // Try using cached value + $predefinedBackgrounds = json_decode($predefinedBackgrounds, true); + } + + if (!is_array($predefinedBackgrounds)) { + // Cache was empty or invalid, regenerate + $predefinedBackgrounds = []; + if (file_exists(__DIR__ . '/../img/backgrounds')) { + $directoryIterator = new \DirectoryIterator(__DIR__ . '/../img/backgrounds'); + foreach ($directoryIterator as $file) { + if (!$file->isFile()) { + continue; + } + if ($file->isDot()) { + continue; + } + if ($file->getFilename() === 'COPYING') { + continue; + } + $predefinedBackgrounds[] = $file->getFilename(); + } + sort($predefinedBackgrounds); + } + + $this->talkCache->set('predefined_backgrounds', json_encode($predefinedBackgrounds), 300); + } + + $capabilities['config']['call']['predefined-backgrounds'] = $predefinedBackgrounds; + if ($user instanceof IUser) { + $quota = $user->getQuota(); + if ($quota !== 'none') { + $quota = Util::computerFileSize($quota); + } + $capabilities['config']['call']['can-upload-background'] = $quota === 'none' || $quota > 0; + } else { + $capabilities['config']['call']['can-upload-background'] = false; + } + return [ 'spreed' => $capabilities, ]; diff --git a/tests/php/CapabilitiesTest.php b/tests/php/CapabilitiesTest.php index e264d3452..ebff099bb 100644 --- a/tests/php/CapabilitiesTest.php +++ b/tests/php/CapabilitiesTest.php @@ -32,6 +32,8 @@ use OCA\Talk\Participant; use OCA\Talk\Room; use OCP\App\IAppManager; use OCP\Capabilities\IPublicCapability; +use OCP\ICache; +use OCP\ICacheFactory; use OCP\IConfig; use OCP\IUser; use OCP\IUserSession; @@ -47,6 +49,8 @@ class CapabilitiesTest extends TestCase { protected IUserSession|MockObject $userSession; protected IAppManager|MockObject $appManager; protected ITranslationManager|MockObject $translationManager; + protected ICacheFactory|MockObject $cacheFactory; + protected ICache|MockObject $talkCache; protected ?array $baseFeatures = null; public function setUp(): void { @@ -57,6 +61,12 @@ class CapabilitiesTest extends TestCase { $this->userSession = $this->createMock(IUserSession::class); $this->appManager = $this->createMock(IAppManager::class); $this->translationManager = $this->createMock(ITranslationManager::class); + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->talkCache = $this->createMock(ICache::class); + + $this->cacheFactory->method('createLocal') + ->with('talk::') + ->willReturn($this->talkCache); $this->commentsManager->expects($this->any()) ->method('supportReactions') @@ -139,6 +149,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $this->userSession->expects($this->once()) @@ -174,6 +185,15 @@ class CapabilitiesTest extends TestCase { 'enabled' => true, 'breakout-rooms' => false, 'recording' => false, + 'predefined-backgrounds' => [ + '1.jpg', + '2.jpg', + '3.jpg', + '4.jpg', + '5.jpg', + '6.jpg', + ], + 'can-upload-background' => false, ], 'chat' => [ 'max-length' => 32000, @@ -197,8 +217,9 @@ class CapabilitiesTest extends TestCase { public function dataGetCapabilitiesUserAllowed(): array { return [ - [true, false, Participant::PRIVACY_PRIVATE], - [false, true, Participant::PRIVACY_PUBLIC], + [true, false, 'none', true, Participant::PRIVACY_PRIVATE], + [false, true, '1 MB', true, Participant::PRIVACY_PUBLIC], + [false, true, '0 B', false, Participant::PRIVACY_PUBLIC], ]; } @@ -206,9 +227,11 @@ class CapabilitiesTest extends TestCase { * @dataProvider dataGetCapabilitiesUserAllowed * @param bool $isNotAllowed * @param bool $canCreate + * @param string $quota + * @param bool $canUpload * @param int $readPrivacy */ - public function testGetCapabilitiesUserAllowed(bool $isNotAllowed, bool $canCreate, int $readPrivacy): void { + public function testGetCapabilitiesUserAllowed(bool $isNotAllowed, bool $canCreate, string $quota, bool $canUpload, int $readPrivacy): void { $capabilities = new Capabilities( $this->serverConfig, $this->talkConfig, @@ -216,6 +239,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $user = $this->createMock(IUser::class); @@ -250,6 +274,9 @@ class CapabilitiesTest extends TestCase { ->with('uid') ->willReturn($readPrivacy); + $user->method('getQuota') + ->willReturn($quota); + $this->serverConfig->expects($this->any()) ->method('getAppValue') ->willReturnMap([ @@ -278,6 +305,15 @@ class CapabilitiesTest extends TestCase { 'enabled' => false, 'breakout-rooms' => true, 'recording' => false, + 'predefined-backgrounds' => [ + '1.jpg', + '2.jpg', + '3.jpg', + '4.jpg', + '5.jpg', + '6.jpg', + ], + 'can-upload-background' => $canUpload, ], 'chat' => [ 'max-length' => 32000, @@ -322,6 +358,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $user = $this->createMock(IUser::class); @@ -346,6 +383,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $this->talkConfig->expects($this->once()) @@ -367,6 +405,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $this->talkConfig->expects($this->once()) @@ -392,6 +431,7 @@ class CapabilitiesTest extends TestCase { $this->userSession, $this->appManager, $this->translationManager, + $this->cacheFactory, ); $translations = []; |