Skip to content

Commit

Permalink
Add priority for mode video conference
Browse files Browse the repository at this point in the history
  • Loading branch information
Hubert Krzysztofiak committed Nov 4, 2022
1 parent f41e8e1 commit 4a6434e
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 86 deletions.
10 changes: 2 additions & 8 deletions config/jaas.php
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
<?php

use EscolaLms\Jitsi\Enum\PackageStatusEnum;

return [

'host' => env('JAAS_HOST', 'https://8x8.vc/'),
'jaas_host' => 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', ''),

'package_status' => PackageStatusEnum::ENABLED,

'private_key' => env('JAAS_PRIVATE_KEY', '')
];
2 changes: 1 addition & 1 deletion config/jitsi.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

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'),

Expand Down
2 changes: 1 addition & 1 deletion src/Enum/JitsiEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,5 @@ class JitsiEnum extends Enum
'š' => 's', 'ū' => 'u', 'ž' => 'z',
];

public const DEFAULT_MODE = 'jitsi';
public const DEFAULT_CONFIG = 'jitsi';
}
15 changes: 7 additions & 8 deletions src/Providers/SettingsServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +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_package_status', ['required', 'string', 'in:' . implode(',', PackageStatusEnum::getValues())], false);
AdministrableConfig::registerConfig(self::CONFIG_KEY . '.jaas_host', ['required', 'string']);
AdministrableConfig::registerConfig(self::CONFIG_KEY . '.aud', ['required', 'string'], false);
AdministrableConfig::registerConfig(self::CONFIG_KEY . '.iss', ['required', 'string'], false);
AdministrableConfig::registerConfig(self::CONFIG_KEY . '.kid', ['required', 'string'], false);
AdministrableConfig::registerConfig(self::CONFIG_KEY . '.private_key', ['required', '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);
}
}
}
73 changes: 56 additions & 17 deletions src/Services/JitsiService.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ class JitsiService implements JitsiServiceContract
{
public Driver $driver;
private array $config;
private string $mode;

public function __construct()
{
$this->config = config(env('VIDEO_CONFERENCE_MODE', JitsiEnum::DEFAULT_MODE));
$this->mode = $this->getMode();
$this->config = $this->mode ? config($this->mode) : config(JitsiEnum::DEFAULT_CONFIG);
}

public function generateJwt(
Expand All @@ -28,15 +30,20 @@ public function generateJwt(
bool $isModerator = false,
int $expireInMinutes = 60
): string {
if (!$this->mode) {

return '';
}
$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');
}

Expand All @@ -61,24 +68,16 @@ public function getChannelData(
array $configOverwrite = [],
$interfaceConfigOverwrite = []
): array {
if ($this->config['package_status'] != PackageStatusEnum::ENABLED) {
if (
isset($this->config['package_status']) &&
(string)$this->config['package_status'] !== PackageStatusEnum::ENABLED
) {

return ['error' => 'Package is disabled'];
}

$channelName = $this->getChannelSlug($channelDisplayName);
$className = ucfirst(mb_strtolower(env('VIDEO_CONFERENCE_MODE', JitsiEnum::DEFAULT_MODE))) .
'VideoConferenceModeStrategy';
$jwt = StrategyHelper::useStrategyPattern(
$className,
'VideoConferenceModeStrategy',
'generateJwt',
$user,
$channelName,
$isModerator
);
$data = [
"domain" => $this->config['host'],
"domain" => $this->config[$this->mode . '_host'],
"roomName" => $channelName,
"configOverwrite" => $configOverwrite,
"interfaceConfigOverwrite" => $interfaceConfigOverwrite,
Expand All @@ -87,14 +86,27 @@ public function getChannelData(
'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 : ""),
];
}

Expand All @@ -120,6 +132,33 @@ protected function getUserData($user, $isModerator = false): array
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
{
return iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', Str::camel($channelName));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public function generateJwt(array $data): ?string
private function shouldGenerateJWT(): bool
{
return !(
!$this->config['jaas_host'] &&
!$this->config['private_key'] &&
!$this->config['kid'] &&
!$this->config['iss'] &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,8 @@

namespace EscolaLms\Jitsi\Strategies\VideoConferenceMode;

use EscolaLms\Auth\Models\User;
use EscolaLms\Jitsi\Helpers\StrategyHelper;
use EscolaLms\Jitsi\Services\Contracts\JitsiServiceContract;
use EscolaLms\Jitsi\Strategies\Contracts\VideoConferenceModeStrategyContract;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;

class JitsiVideoConferenceModeStrategy implements VideoConferenceModeStrategyContract
{
Expand Down
40 changes: 12 additions & 28 deletions tests/Api/SettingsApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function testAdministrableConfigApi(): void
'value' => $packageStatus,
],
[
'key' => "$configKey.host",
'key' => "$configKey.jitsi_host",
'value' => $host,
],
[
Expand All @@ -66,10 +66,6 @@ public function testAdministrableConfigApi(): void
'key' => "$configKey.secret",
'value' => $secret,
],
[
'key' => "$configKey.jaas_package_status",
'value' => $packageStatus,
],
[
'key' => "$configKey.jaas_host",
'value' => $host,
Expand Down Expand Up @@ -108,31 +104,19 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.package_status",
'key' => 'package_status',
'rules' => [
'required',
'string',
'in:' . implode(',', PackageStatusEnum::getValues()),
],
'public' => false,
'readonly' => false,
'value' => $packageStatus,
],
'jaas_package_status' => [
'full_key' => "$configKey.jaas_package_status",
'key' => 'jaas_package_status',
'rules' => [
'required',
'nullable',
'string',
'in:' . implode(',', PackageStatusEnum::getValues()),
],
'public' => false,
'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,
Expand All @@ -143,7 +127,7 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.jaas_host",
'key' => 'jaas_host',
'rules' => [
'required',
'nullable',
'string'
],
'public' => true,
Expand All @@ -154,7 +138,7 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.aud",
'key' => 'aud',
'rules' => [
'required',
'nullable',
'string'
],
'public' => false,
Expand All @@ -165,7 +149,7 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.kid",
'key' => 'kid',
'rules' => [
'required',
'nullable',
'string'
],
'public' => false,
Expand All @@ -176,7 +160,7 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.iss",
'key' => 'iss',
'rules' => [
'required',
'nullable',
'string'
],
'public' => false,
Expand Down Expand Up @@ -209,7 +193,7 @@ public function testAdministrableConfigApi(): void
'full_key' => "$configKey.private_key",
'key' => 'private_key',
'rules' => [
'required',
'nullable',
'string'
],
'public' => false,
Expand All @@ -228,7 +212,7 @@ public function testAdministrableConfigApi(): void

$this->response->assertJsonFragment([
$configKey => [
'host' => $host,
'jitsi_host' => $host,
'jaas_host' => $host,
],
]);
Expand Down
Loading

0 comments on commit 4a6434e

Please sign in to comment.