diff --git a/composer.json b/composer.json index fbe7fdc..0666deb 100644 --- a/composer.json +++ b/composer.json @@ -12,8 +12,7 @@ }, "require-dev": { "phpunit/phpunit": "^9.0", - "orchestra/testbench": ">=5.0", - "escolalms/courses": "^0" + "orchestra/testbench": ">=5.0" }, "license": "MIT", "authors": [ diff --git a/config/jaas.php b/config/jaas.php new file mode 100644 index 0000000..e4dfb15 --- /dev/null +++ b/config/jaas.php @@ -0,0 +1,10 @@ + env('JAAS_HOST', 'https://8x8.vc/'), + 'aud' => env('JAAS_AUD', 'jitsi'), + 'iss' => env('JAAS_ISS', 'chat'), + 'sub' => env('JAAS_SUB', ''), + 'kid' => env('JAAS_KEY_ID', ''), + 'private_key' => env('JAAS_PRIVATE_KEY', '') +]; diff --git a/config/jitsi.php b/config/jitsi.php index b5c42b8..8e7da4d 100644 --- a/config/jitsi.php +++ b/config/jitsi.php @@ -4,9 +4,9 @@ return [ - 'host' => env('JITSI_HOST', 'meet-stage.escolalms.com'), + 'jitsi_host' => env('JITSI_HOST', 'meet-stage.escolalms.com'), 'app_id' => env('JITSI_APP_ID', 'meet-id'), - 'secret' => env('JITSI_APP_SECRET', 'ZKGfn5kYsv47avM4'), + 'secret' => env('JITSI_APP_SECRET', 'Test'), 'package_status' => PackageStatusEnum::ENABLED, diff --git a/env/mysql/testbench.yaml b/env/mysql/testbench.yaml index 946a48e..d796637 100644 --- a/env/mysql/testbench.yaml +++ b/env/mysql/testbench.yaml @@ -14,4 +14,5 @@ providers: - EscolaLms\Settings\EscolaLmsSettingsServiceProvider - EscolaLms\Core\EscolaLmsServiceProvider - EscolaLms\Auth\EscolaLmsAuthServiceProvider - - EscolaLms\Categories\EscolaLmsCategoriesServiceProvider \ No newline at end of file + - EscolaLms\Categories\EscolaLmsCategoriesServiceProvider + - EscolaLms\ModelFields\ModelFieldsServiceProvider diff --git a/env/postgres/testbench.yaml b/env/postgres/testbench.yaml index f01997b..9120301 100644 --- a/env/postgres/testbench.yaml +++ b/env/postgres/testbench.yaml @@ -13,4 +13,5 @@ providers: - EscolaLms\Settings\EscolaLmsSettingsServiceProvider - EscolaLms\Core\EscolaLmsServiceProvider - EscolaLms\Auth\EscolaLmsAuthServiceProvider - - EscolaLms\Categories\EscolaLmsCategoriesServiceProvider \ No newline at end of file + - EscolaLms\Categories\EscolaLmsCategoriesServiceProvider + - EscolaLms\ModelFields\ModelFieldsServiceProvider diff --git a/src/Enum/JitsiEnum.php b/src/Enum/JitsiEnum.php index 8d085c5..b9305ce 100644 --- a/src/Enum/JitsiEnum.php +++ b/src/Enum/JitsiEnum.php @@ -72,4 +72,6 @@ class JitsiEnum extends Enum 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n', 'š' => 's', 'ū' => 'u', 'ž' => 'z', ]; + + public const DEFAULT_CONFIG = 'jitsi'; } diff --git a/src/EscolaLmsJitsiServiceProvider.php b/src/EscolaLmsJitsiServiceProvider.php index 9af2794..f3ca10e 100644 --- a/src/EscolaLmsJitsiServiceProvider.php +++ b/src/EscolaLmsJitsiServiceProvider.php @@ -3,6 +3,8 @@ namespace EscolaLms\Jitsi; use EscolaLms\Jitsi\Providers\SettingsServiceProvider; +use EscolaLms\Jitsi\Services\Contracts\JaasServiceContract; +use EscolaLms\Jitsi\Services\JaasService; use Illuminate\Support\ServiceProvider; use EscolaLms\Jitsi\Services\Contracts\JitsiServiceContract; use EscolaLms\Jitsi\Services\JitsiService; @@ -15,6 +17,7 @@ class EscolaLmsJitsiServiceProvider extends ServiceProvider { public $singletons = [ JitsiServiceContract::class => JitsiService::class, + JaasServiceContract::class => JaasService::class, ]; /** @@ -32,6 +35,10 @@ public function register() __DIR__ . '/../config/jitsi.php', 'jitsi' ); + $this->mergeConfigFrom( + __DIR__ . '/../config/jaas.php', + 'jaas' + ); $this->app->register(SettingsServiceProvider::class); } diff --git a/src/Helpers/StrategyHelper.php b/src/Helpers/StrategyHelper.php new file mode 100644 index 0000000..d00dc34 --- /dev/null +++ b/src/Helpers/StrategyHelper.php @@ -0,0 +1,51 @@ +setNamespace($baseStrategyName); + } + + /** + * This method used strategy pattern and execute method given in the parameters + * Strategy dir it must contain minimum to file: BaseStrategy contain in pattern {{parentDir}}Strategy + * in localization ?/Strategies/{{parentDir}} and strategy class in the same localization + * + * @param string $className + * @param string $baseStrategyName + * @param string $method + * @param ...$params + * @return mixed|null + */ + public static function useStrategyPattern( + string $className, + string $baseStrategyName, + string $method, + ...$params + ) { + $strategyHelper = new StrategyHelper($baseStrategyName); + $class = $strategyHelper->namespace . '\\' . $className; + $baseStrategyClass = $strategyHelper->namespace . '\\' . $baseStrategyName; + if ( + class_exists($class) && + class_exists($baseStrategyClass) && + method_exists($baseStrategyClass, $method) + ) { + return (new $baseStrategyClass( + new $class() + ))->$method($params); + } + return null; + } + + private function setNamespace(string $baseStrategyName): void + { + $this->namespace = 'EscolaLms\Jitsi\Strategies\\' . + preg_replace('/^(.*)Strategy$/', '$1', $baseStrategyName); + } +} diff --git a/src/Providers/SettingsServiceProvider.php b/src/Providers/SettingsServiceProvider.php index 1762edb..459ff2c 100644 --- a/src/Providers/SettingsServiceProvider.php +++ b/src/Providers/SettingsServiceProvider.php @@ -18,10 +18,16 @@ public function register() $this->app->register(EscolaLmsSettingsServiceProvider::class); } - AdministrableConfig::registerConfig(self::CONFIG_KEY . '.package_status', ['required', 'string', 'in:' . implode(',', PackageStatusEnum::getValues())], false); - AdministrableConfig::registerConfig(self::CONFIG_KEY . '.host', ['required', 'string']); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.package_status', ['nullable', 'string', 'in:' . implode(',', PackageStatusEnum::getValues())], false); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.jitsi_host', ['nullable', 'string']); AdministrableConfig::registerConfig(self::CONFIG_KEY . '.app_id', ['nullable', 'string'], false); AdministrableConfig::registerConfig(self::CONFIG_KEY . '.secret', ['nullable', 'string'], false); + + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.jaas_host', ['nullable', 'string']); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.aud', ['nullable', 'string'], false); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.iss', ['nullable', 'string'], false); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.kid', ['nullable', 'string'], false); + AdministrableConfig::registerConfig(self::CONFIG_KEY . '.private_key', ['nullable', 'string'], false); } } -} \ No newline at end of file +} diff --git a/src/Services/Contracts/JaasServiceContract.php b/src/Services/Contracts/JaasServiceContract.php new file mode 100644 index 0000000..f32b621 --- /dev/null +++ b/src/Services/Contracts/JaasServiceContract.php @@ -0,0 +1,19 @@ +getUserData($user, $isModerator); + $payload = [ + 'aud' => $this->config['aud'], + 'iss' => $this->config['iss'], + 'exp' => now()->addMinutes($expireInMinutes)->timestamp, + 'sub' => $this->config['sub'], + 'room' => $room, + 'context' => [ + 'user' => $userData, + ], + ]; + return JWT::encode($payload, $this->config['private_key'], 'RS256', $this->config['kid']); + } + + public function setConfig(array $config): void + { + $this->config = $config; + } +} diff --git a/src/Services/JitsiService.php b/src/Services/JitsiService.php index c695b1e..3f07665 100644 --- a/src/Services/JitsiService.php +++ b/src/Services/JitsiService.php @@ -3,57 +3,47 @@ namespace EscolaLms\Jitsi\Services; use EscolaLms\Auth\Models\User; +use EscolaLms\Jitsi\Enum\JitsiEnum; use EscolaLms\Jitsi\Enum\PackageStatusEnum; +use EscolaLms\Jitsi\Helpers\StrategyHelper; use EscolaLms\Jitsi\Services\Contracts\JitsiServiceContract; use Gnello\Mattermost\Driver; -use Illuminate\Support\Str; use Firebase\JWT\JWT; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; class JitsiService implements JitsiServiceContract { public Driver $driver; private array $config; + private string $mode; public function __construct() { - $this->config = config("jitsi"); + $this->mode = $this->getMode(); + $this->config = $this->mode ? config($this->mode) : config(JitsiEnum::DEFAULT_CONFIG); } - private function shouldGenerateJWT(): bool - { - return !(!$this->config["app_id"] && !$this->config["secret"]); - } - - private function getUserData($user, $isModerator = false): array - { - $user_data = [ - 'id' => $user->id, - 'name' => "{$user->first_name} {$user->last_name}", - 'displayName' => "{$user->first_name} {$user->last_name}", - 'email' => $user->email, - "moderator" => $isModerator - ]; + public function generateJwt( + User $user, + string $room = '*', + bool $isModerator = false, + int $expireInMinutes = 60 + ): string { + if (!$this->mode) { - if (!empty($user->avatar_path)) { - $user_data['avatar'] = Storage::url($user->avatar_path); + return ''; } - - return $user_data; - } - - private function generateJwt($user, $room = '*', $isModerator = false, $expireInMinutes = 60): string - { - $user_data = $this->getUserData($user, $isModerator); $payload = [ 'iss' => $this->config['app_id'], 'aud' => $this->config['app_id'], - 'sub' => $this->config['host'], + 'sub' => $this->config[$this->mode . '_host'], 'exp' => now()->addMinutes($expireInMinutes)->timestamp, 'room' => $room, 'user' => $user_data, ]; + return JWT::encode($payload, $this->config['secret'], 'HS256'); } @@ -71,48 +61,103 @@ private function generateJwt($user, $room = '*', $isModerator = false, $expireIn * 'url' that you can run in open in new window mode, (not recommended) * */ - public function getChannelData(User $user, string $channelDisplayName, bool $isModerator = false, array $configOverwrite = [], $interfaceConfigOverwrite = []): array - { + public function getChannelData( + User $user, + string $channelDisplayName, + bool $isModerator = false, + array $configOverwrite = [], + $interfaceConfigOverwrite = [] + ): array { + if ( + isset($this->config['package_status']) && + (string)$this->config['package_status'] !== PackageStatusEnum::ENABLED + ) { - if ($this->config['package_status'] != PackageStatusEnum::ENABLED) { return ['error' => 'Package is disabled']; } - $channelName = $this->getChannelSlug($channelDisplayName); - - $jwt = $this->shouldGenerateJWT() ? $this->generateJwt($user, $channelName, $isModerator) : null; - $data = [ - "domain" => $this->config['host'], + "domain" => $this->config[$this->mode . '_host'], "roomName" => $channelName, - "configOverwrite" => array_merge([ - /* - "startWithAudioMuted" => true, - "disableModeratorIndicator" => true, - "startScreenSharing" => true, - "enableEmailInStats" => false, - */], $configOverwrite), - "interfaceConfigOverwrite" => array_merge([ - //"DISABLE_JOIN_LEAVE_NOTIFICATIONS" => true, - ], $interfaceConfigOverwrite), + "configOverwrite" => $configOverwrite, + "interfaceConfigOverwrite" => $interfaceConfigOverwrite, "userInfo" => [ 'displayName' => "{$user->first_name} {$user->last_name}", 'email' => $user->email, ] ]; - + $jwt = ''; + if ($this->mode) { + $className = ucfirst($this->mode) . + 'VideoConferenceModeStrategy'; + $jwt = StrategyHelper::useStrategyPattern( + $className, + 'VideoConferenceModeStrategy', + 'generateJwt', + $user, + $channelName, + $isModerator + ); + } if (!empty($jwt)) { $data['jwt'] = $jwt; } - return [ 'data' => $data, - 'domain' => $this->config['host'], - 'url' => "https://" . $this->config['host'] . "/" . $channelName . (!empty($jwt) ? "?jwt=" . $jwt : ""), + 'domain' => $this->config[$this->mode . '_host'], + 'url' => "https://" . $this->config[$this->mode . '_host'] . "/" . $channelName . (!empty($jwt) ? "?jwt=" . $jwt : ""), ]; } + public function setConfig(array $config): void + { + $this->config = $config; + } + + protected function getUserData($user, $isModerator = false): array + { + $user_data = [ + 'id' => $user->id, + 'name' => "{$user->first_name} {$user->last_name}", + 'displayName' => "{$user->first_name} {$user->last_name}", + 'email' => $user->email, + "moderator" => $isModerator + ]; + + if (!empty($user->avatar_path)) { + $user_data['avatar'] = Storage::url($user->avatar_path); + } + + return $user_data; + } + + /** + * Mode priorities Jaas -> self hosted(jitsi) -> meet.jitsy -> disabled + * @return string + */ + private function getMode(): string + { + $jaasKeys = collect(['jaas_host', 'aud', 'iss', 'kid', 'private_key']); + $jaasConfigUse = true; + $jaasKeys->each(function (string $key) use (&$jaasConfigUse) { + if (!config('jaas.' . $key)) $jaasConfigUse = false; + }); + if ($jaasConfigUse) { + + return 'jaas'; + } + $jitsiKeys = collect(['jitsi_host', 'app_id', 'secret']); + $jitsiConfigUse = true; + $jitsiKeys->each(function (string $key) use (&$jitsiConfigUse) { + if (!config('jitsi.' . $key)) $jitsiConfigUse = false; + }); + if ($jitsiConfigUse) { + + return 'jitsi'; + } + return ''; + } private function getChannelSlug(string $channelName): string { diff --git a/src/Strategies/Contracts/VideoConferenceModeStrategyContract.php b/src/Strategies/Contracts/VideoConferenceModeStrategyContract.php new file mode 100644 index 0000000..cc1825c --- /dev/null +++ b/src/Strategies/Contracts/VideoConferenceModeStrategyContract.php @@ -0,0 +1,8 @@ +config = config('jaas'); + $this->jaasService = app(JaasServiceContract::class); + } + + public function generateJwt(array $data): ?string + { + if (isset($data[0]) && $this->shouldGenerateJWT()) { + $this->jaasService->setConfig($this->config); + return $this->jaasService->generateJwt( + $data[0], + $data[1] ?? '*', + $data[2] ?? false, + $data[3] ?? 60 + ); + } + return null; + } + + private function shouldGenerateJWT(): bool + { + return !( + !$this->config['jaas_host'] && + !$this->config['private_key'] && + !$this->config['kid'] && + !$this->config['iss'] && + !$this->config['aud'] && + !$this->config['sub'] + ); + } +} diff --git a/src/Strategies/VideoConferenceMode/JitsiVideoConferenceModeStrategy.php b/src/Strategies/VideoConferenceMode/JitsiVideoConferenceModeStrategy.php new file mode 100644 index 0000000..71b89eb --- /dev/null +++ b/src/Strategies/VideoConferenceMode/JitsiVideoConferenceModeStrategy.php @@ -0,0 +1,37 @@ +config = config('jitsi'); + $this->jitsiService = app(JitsiServiceContract::class); + } + + public function generateJwt(array $data): ?string + { + if (isset($data[0]) && $this->shouldGenerateJWT()) { + $this->jitsiService->setConfig($this->config); + return $this->jitsiService->generateJwt( + $data[0], + $data[1] ?? '*', + $data[2] ?? false, + $data[3] ?? 60 + ); + } + return null; + } + + private function shouldGenerateJWT(): bool + { + return !(!$this->config["app_id"] && !$this->config["secret"]); + } +} diff --git a/src/Strategies/VideoConferenceMode/VideoConferenceModeStrategy.php b/src/Strategies/VideoConferenceMode/VideoConferenceModeStrategy.php new file mode 100644 index 0000000..7a330cf --- /dev/null +++ b/src/Strategies/VideoConferenceMode/VideoConferenceModeStrategy.php @@ -0,0 +1,22 @@ +videoConferenceModeStrategy = $videoConferenceModeStrategy; + } + + public function generateJwt(array $data): ?string + { + return $this->videoConferenceModeStrategy->generateJwt($data); + } +} diff --git a/tests/Api/SettingsApiTest.php b/tests/Api/SettingsApiTest.php index 24b5c55..e8ebdfb 100644 --- a/tests/Api/SettingsApiTest.php +++ b/tests/Api/SettingsApiTest.php @@ -40,6 +40,10 @@ public function testAdministrableConfigApi(): void $host = $this->faker->domainWord; $appId = $this->faker->uuid; $secret = $this->faker->uuid; + $aud = $this->faker->word; + $iss = $this->faker->word; + $kid = $this->faker->word; + $privateKey = $this->faker->word; $this->response = $this->actingAs($this->user, 'api')->json( 'POST', @@ -51,7 +55,7 @@ public function testAdministrableConfigApi(): void 'value' => $packageStatus, ], [ - 'key' => "$configKey.host", + 'key' => "$configKey.jitsi_host", 'value' => $host, ], [ @@ -62,6 +66,26 @@ public function testAdministrableConfigApi(): void 'key' => "$configKey.secret", 'value' => $secret, ], + [ + 'key' => "$configKey.jaas_host", + 'value' => $host, + ], + [ + 'key' => "$configKey.aud", + 'value' => $aud, + ], + [ + 'key' => "$configKey.iss", + 'value' => $iss, + ], + [ + 'key' => "$configKey.kid", + 'value' => $kid, + ], + [ + 'key' => "$configKey.private_key", + 'value' => $privateKey, + ], ] ] ); @@ -80,7 +104,7 @@ public function testAdministrableConfigApi(): void 'full_key' => "$configKey.package_status", 'key' => 'package_status', 'rules' => [ - 'required', + 'nullable', 'string', 'in:' . implode(',', PackageStatusEnum::getValues()), ], @@ -88,17 +112,61 @@ public function testAdministrableConfigApi(): void 'readonly' => false, 'value' => $packageStatus, ], - 'host' => [ - 'full_key' => "$configKey.host", - 'key' => 'host', + 'jitsi_host' => [ + 'full_key' => "$configKey.jitsi_host", + 'key' => 'jitsi_host', 'rules' => [ - 'required', + 'nullable', 'string' ], 'public' => true, 'readonly' => false, 'value' => $host, ], + 'jaas_host' => [ + 'full_key' => "$configKey.jaas_host", + 'key' => 'jaas_host', + 'rules' => [ + 'nullable', + 'string' + ], + 'public' => true, + 'readonly' => false, + 'value' => $host, + ], + 'aud' => [ + 'full_key' => "$configKey.aud", + 'key' => 'aud', + 'rules' => [ + 'nullable', + 'string' + ], + 'public' => false, + 'readonly' => false, + 'value' => $aud, + ], + 'kid' => [ + 'full_key' => "$configKey.kid", + 'key' => 'kid', + 'rules' => [ + 'nullable', + 'string' + ], + 'public' => false, + 'readonly' => false, + 'value' => $kid, + ], + 'iss' => [ + 'full_key' => "$configKey.iss", + 'key' => 'iss', + 'rules' => [ + 'nullable', + 'string' + ], + 'public' => false, + 'readonly' => false, + 'value' => $iss, + ], 'app_id' => [ 'full_key' => "$configKey.app_id", 'key' => 'app_id', @@ -121,6 +189,17 @@ public function testAdministrableConfigApi(): void 'readonly' => false, 'value' => $secret, ], + 'private_key' => [ + 'full_key' => "$configKey.private_key", + 'key' => 'private_key', + 'rules' => [ + 'nullable', + 'string' + ], + 'public' => false, + 'readonly' => false, + 'value' => $privateKey, + ], ], ]); @@ -133,8 +212,9 @@ public function testAdministrableConfigApi(): void $this->response->assertJsonFragment([ $configKey => [ - 'host' => $host, + 'jitsi_host' => $host, + 'jaas_host' => $host, ], ]); } -} \ No newline at end of file +} diff --git a/tests/Services/ServiceTest.php b/tests/Services/ServiceTest.php index 3132bd4..c558d1d 100644 --- a/tests/Services/ServiceTest.php +++ b/tests/Services/ServiceTest.php @@ -3,11 +3,13 @@ namespace EscolaLms\Jitsi\Tests\Services; use EscolaLms\Core\Tests\CreatesUsers; +use EscolaLms\Jitsi\Enum\JitsiEnum; use EscolaLms\Jitsi\Helpers\StringHelper; use EscolaLms\Jitsi\Tests\TestCase; use EscolaLms\Jitsi\Facades\Jitsi; use EscolaLms\Jitsi\Enum\PackageStatusEnum; use Illuminate\Foundation\Testing\WithFaker; +use Illuminate\Support\Str; class ServiceTest extends TestCase { @@ -27,30 +29,72 @@ private function decodeJWT($token) return (json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $token)[1]))))); } - public function testServiceWithJwt() + public function testServiceWithJwtJitsi() { // public function getChannelData(User $user, string $channelDisplayName, bool $isModerator = false, array $configOverwrite = [], $interfaceConfigOverwrite = []): array - - $config = config("jitsi"); + $config = config('jitsi'); $data = Jitsi::getChannelData($this->user, $this->faker->text(15)); $jwt = $this->decodeJWT($data['data']['jwt']); - $this->assertEquals($data['data']['domain'], $config['host']); + $this->assertEquals($data['data']['domain'], $config['jitsi_host']); $this->assertEquals($data['data']['userInfo']['email'], $this->user->email); $this->assertEquals($jwt->user->email, $this->user->email); $this->assertEquals($jwt->user->moderator, false); } - public function testServiceWithJwtAndSettings() + public function testServiceWithJwtJaas() + { + // public function getChannelData(User $user, string $channelDisplayName, bool $isModerator = false, array $configOverwrite = [], $interfaceConfigOverwrite = []): array + + $private_key = openssl_pkey_new([ + 'digest_alg' => 'RS256', + 'private_key_bits' => 1024, + 'private_key_type' => OPENSSL_KEYTYPE_RSA + ]); + \Config::set('jaas.private_key', $private_key); + \Config::set('jaas.sub', Str::random(40)); + \Config::set('jaas.kid', Str::random(40)); + $config = config('jaas'); + $data = Jitsi::getChannelData($this->user, $this->faker->text(15)); + $jwt = $this->decodeJWT($data['data']['jwt']); + $this->assertEquals($data['data']['domain'], $config['jaas_host']); + $this->assertEquals($data['data']['userInfo']['email'], $this->user->email); + $this->assertEquals($jwt->context->user->email, $this->user->email); + $this->assertEquals($jwt->context->user->moderator, false); + } + + public function testServiceWithJwtAndSettingsJaas() + { + // public function getChannelData(User $user, string $channelDisplayName, bool $isModerator = false, array $configOverwrite = [], $interfaceConfigOverwrite = []): array + $private_key = openssl_pkey_new([ + 'digest_alg' => 'RS256', + 'private_key_bits' => 1024, + 'private_key_type' => OPENSSL_KEYTYPE_RSA + ]); + \Config::set('jaas.private_key', $private_key); + \Config::set('jaas.sub', Str::random(40)); + \Config::set('jaas.kid', Str::random(40)); + $config = config('jaas'); + $data = Jitsi::getChannelData($this->user, "Test Channel Name", true, ['foo' => 'bar'], ['bar' => 'foo']); + $jwt = $this->decodeJWT($data['data']['jwt']); + $this->assertEquals($data['data']['domain'], $config['jaas_host']); + $this->assertEquals($data['data']['userInfo']['email'], $this->user->email); + $this->assertEquals($jwt->context->user->email, $this->user->email); + $this->assertEquals($jwt->context->user->moderator, true); + $this->assertEquals($data['data']['configOverwrite'], ["foo" => "bar"]); + $this->assertEquals($data['data']['interfaceConfigOverwrite'], ["bar" => "foo"]); + } + + public function testServiceWithJwtAndSettingsJitsi() { // public function getChannelData(User $user, string $channelDisplayName, bool $isModerator = false, array $configOverwrite = [], $interfaceConfigOverwrite = []): array - $config = config("jitsi"); + $config = config('jitsi'); $data = Jitsi::getChannelData($this->user, "Test Channel Name", true, ['foo' => 'bar'], ['bar' => 'foo']); $jwt = $this->decodeJWT($data['data']['jwt']); - $this->assertEquals($data['data']['domain'], $config['host']); + $this->assertEquals($data['data']['domain'], $config['jitsi_host']); $this->assertEquals($data['data']['userInfo']['email'], $this->user->email); $this->assertEquals($jwt->user->email, $this->user->email); $this->assertEquals($jwt->user->moderator, true); diff --git a/tests/TestCase.php b/tests/TestCase.php index a34acce..59a4c25 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,6 +4,10 @@ +use EscolaLms\Auth\EscolaLmsAuthServiceProvider; +use EscolaLms\Jitsi\Enum\PackageStatusEnum; +use EscolaLms\ModelFields\ModelFieldsServiceProvider; +use EscolaLms\Core\EscolaLmsServiceProvider; use Illuminate\Foundation\Testing\DatabaseTransactions; use EscolaLms\Jitsi\EscolaLmsJitsiServiceProvider; @@ -14,6 +18,7 @@ use EscolaLms\Auth\Models\User; use EscolaLms\Core\Tests\TestCase as CoreTestCase; + // use GuzzleHttp\Client; @@ -35,6 +40,9 @@ protected function getPackageProviders($app): array ...parent::getPackageProviders($app), EscolaLmsJitsiServiceProvider::class, EscolaLmsSettingsServiceProvider::class, + EscolaLmsAuthServiceProvider::class, + ModelFieldsServiceProvider::class, + EscolaLmsServiceProvider::class, ]; } @@ -45,6 +53,13 @@ protected function getEnvironmentSetUp($app) $app['config']->set('jitsi.app_id', 'app_id'); $app['config']->set('jitsi.secret', 'secret'); - $app['config']->set('jitsi.host', 'localhost'); + $app['config']->set('jitsi.jitsi_host', 'localhost'); + $app['config']->set('jitsi.package_status', PackageStatusEnum::ENABLED); + + $app['config']->set('jaas.jaas_host', 'localhost'); + $app['config']->set('jaas.aud', 'jitsi'); + $app['config']->set('jaas.iss', 'chat'); + $app['config']->set('jaas.sub', ''); + $app['config']->set('jaas.kid', ''); } }