Page MenuHomePhorge

D2257.1775181632.diff
No OneTemporary

Authored By
Unknown
Size
17 KB
Referenced Files
None
Subscribers
None

D2257.1775181632.diff

diff --git a/src/app/Http/Controllers/API/V4/OpenViduController.php b/src/app/Http/Controllers/API/V4/OpenViduController.php
--- a/src/app/Http/Controllers/API/V4/OpenViduController.php
+++ b/src/app/Http/Controllers/API/V4/OpenViduController.php
@@ -250,6 +250,7 @@
$config = [
'locked' => $room->getSetting('locked') === 'true',
+ 'nomedia' => $room->getSetting('nomedia') === 'true',
'password' => $isOwner ? $password : '',
'requires_password' => !$isOwner && strlen($password),
];
@@ -308,7 +309,7 @@
// Initialize connection tokens
if ($init) {
// Choose the connection role
- $canPublish = !empty(request()->input('canPublish'));
+ $canPublish = empty($config['nomedia']) && !empty(request()->input('canPublish'));
$role = $canPublish ? Room::ROLE_PUBLISHER : Room::ROLE_SUBSCRIBER;
if ($isOwner) {
$role |= Room::ROLE_MODERATOR;
@@ -376,6 +377,10 @@
$input[$key] = $value ? 'true' : null;
break;
+ case 'nomedia':
+ $input[$key] = $value ? 'true' : null;
+ break;
+
default:
$errors[$key] = \trans('meet.room-unsupported-option-error');
}
diff --git a/src/resources/vue/Meet/Room.vue b/src/resources/vue/Meet/Room.vue
--- a/src/resources/vue/Meet/Room.vue
+++ b/src/resources/vue/Meet/Room.vue
@@ -35,8 +35,8 @@
<button class="btn btn-link link-fullscreen open hidden" @click="switchFullscreen" title="Full screen">
<svg-icon icon="compress"></svg-icon>
</button>
- <button class="btn btn-link link-security" v-if="isRoomOwner()" @click="securityOptions" title="Security options">
- <svg-icon icon="shield-alt"></svg-icon>
+ <button class="btn btn-link link-options" v-if="isRoomOwner()" @click="roomOptions" title="Room options">
+ <svg-icon icon="cog"></svg-icon>
</button>
<button class="btn btn-link link-logout" @click="logout" title="Leave session">
<svg-icon icon="power-off"></svg-icon>
@@ -175,7 +175,7 @@
</div>
</div>
- <session-security-options v-if="session.config" :config="session.config" :room="room" @config-update="configUpdate"></session-security-options>
+ <room-options v-if="session.config" :config="session.config" :room="room" @config-update="configUpdate"></room-options>
</div>
</template>
@@ -183,7 +183,7 @@
import { Meet, Roles } from '../../js/meet/app.js'
import StatusMessage from '../Widgets/StatusMessage'
import LogonForm from '../Login'
- import SessionSecurityOptions from './SessionSecurityOptions'
+ import RoomOptions from './RoomOptions'
// Register additional icons
import { library } from '@fortawesome/fontawesome-svg-core'
@@ -201,7 +201,6 @@
faMicrophoneAlt,
faPowerOff,
faUser,
- faShieldAlt,
faVideo,
faVolumeMute
} from '@fortawesome/free-solid-svg-icons'
@@ -220,7 +219,6 @@
faMicrophoneAlt,
faPowerOff,
faUser,
- faShieldAlt,
faVideo,
faVolumeMute
)
@@ -231,7 +229,7 @@
export default {
components: {
LogonForm,
- SessionSecurityOptions,
+ RoomOptions,
StatusMessage
},
data() {
@@ -601,8 +599,8 @@
return this.reqId
},
- securityOptions() {
- $('#security-options-dialog').modal()
+ roomOptions() {
+ $('#room-options-dialog').modal()
},
setMenuItem(type, state, disabled) {
let button = $('#meet-session-menu').find('.link-' + type)
diff --git a/src/resources/vue/Meet/SessionSecurityOptions.vue b/src/resources/vue/Meet/RoomOptions.vue
rename from src/resources/vue/Meet/SessionSecurityOptions.vue
rename to src/resources/vue/Meet/RoomOptions.vue
--- a/src/resources/vue/Meet/SessionSecurityOptions.vue
+++ b/src/resources/vue/Meet/RoomOptions.vue
@@ -1,16 +1,16 @@
<template>
<div v-if="config">
- <div id="security-options-dialog" class="modal" tabindex="-1" role="dialog">
+ <div id="room-options-dialog" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
- <h5 class="modal-title">Security options</h5>
+ <h5 class="modal-title">Room options</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
- <form id="security-options-password">
+ <form id="room-options-password">
<div id="password-input" class="input-group input-group-activable">
<span class="input-group-text label">Password:</span>
<span v-if="config.password" id="password-input-text" class="input-group-text">{{ config.password }}</span>
@@ -28,16 +28,27 @@
</small>
</form>
<hr>
- <form id="security-options-lock">
+ <form id="room-options-lock">
<div id="room-lock">
<label for="room-lock-input">Locked room:</label>
<input type="checkbox" id="room-lock-input" name="lock" value="1" :checked="config.locked" @click="lockSave">
</div>
<small class="form-text text-muted">
- When the room is locked participants have to be approved by you
+ When the room is locked participants have to be approved by a moderator
before they could join the meeting.
</small>
</form>
+ <hr>
+ <form id="room-options-nomedia">
+ <div id="room-nomedia">
+ <label for="room-lock-input">Subscribers only:</label>
+ <input type="checkbox" id="room-nomedia-input" name="lock" value="1" :checked="config.nomedia" @click="nomediaSave">
+ </div>
+ <small class="form-text text-muted">
+ Forces all participants to join as subscribers (with camera and microphone turned off).
+ Moderators will be able to promote them to publishers throughout the session.
+ </small>
+ </form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary modal-action" data-dismiss="modal">Close</button>
@@ -59,7 +70,7 @@
}
},
mounted() {
- $('#security-options-dialog').on('show.bs.modal', e => {
+ $('#room-options-dialog').on('show.bs.modal', e => {
$(e.target).find('.input-group-activable.active').removeClass('active')
})
},
@@ -81,6 +92,9 @@
lockSave(e) {
this.configSave('locked', $(e.target).prop('checked') ? 1 : 0)
},
+ nomediaSave(e) {
+ this.configSave('nomedia', $(e.target).prop('checked') ? 1 : 0)
+ },
passwordClear() {
this.configSave('password', '')
},
diff --git a/src/tests/Browser/Meet/RoomControlsTest.php b/src/tests/Browser/Meet/RoomControlsTest.php
--- a/src/tests/Browser/Meet/RoomControlsTest.php
+++ b/src/tests/Browser/Meet/RoomControlsTest.php
@@ -110,7 +110,7 @@
'screen' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
'chat' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
'fullscreen' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
- 'security' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
+ 'options' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
'logout' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
])
->whenAvailable('div.meet-video.self', function (Browser $browser) {
diff --git a/src/tests/Browser/Meet/RoomSecurityTest.php b/src/tests/Browser/Meet/RoomOptionsTest.php
rename from src/tests/Browser/Meet/RoomSecurityTest.php
rename to src/tests/Browser/Meet/RoomOptionsTest.php
--- a/src/tests/Browser/Meet/RoomSecurityTest.php
+++ b/src/tests/Browser/Meet/RoomOptionsTest.php
@@ -9,7 +9,7 @@
use Tests\Browser\Pages\Meet\Room as RoomPage;
use Tests\TestCaseDusk;
-class RoomSecurityTest extends TestCaseDusk
+class RoomOptionsTest extends TestCaseDusk
{
/**
* {@inheritDoc}
@@ -45,10 +45,10 @@
->assertMissing('@setup-password-input')
->clickWhenEnabled('@setup-button')
->waitFor('@session')
- // Enter Security option dialog
- ->click('@menu button.link-security')
- ->with(new Dialog('#security-options-dialog'), function (Browser $browser) use ($room) {
- $browser->assertSeeIn('@title', 'Security options')
+ // Enter room option dialog
+ ->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertSeeIn('@title', 'Room options')
->assertSeeIn('@button-action', 'Close')
->assertElementsCount('.modal-footer button', 1)
->assertSeeIn('#password-input .label', 'Password:')
@@ -95,9 +95,9 @@
->waitFor('@session');
// Test removing the password
- $owner->click('@menu button.link-security')
- ->with(new Dialog('#security-options-dialog'), function (Browser $browser) use ($room) {
- $browser->assertSeeIn('@title', 'Security options')
+ $owner->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertSeeIn('@title', 'Room options')
->assertSeeIn('#password-input-text:not(.text-muted)', 'pass')
->assertSeeIn('#password-clear-btn.btn-outline-danger', 'Clear password')
->assertElementsCount('#password-input button', 1)
@@ -122,7 +122,6 @@
public function testLockedRoomDeny(): void
{
$this->browse(function (Browser $owner, Browser $guest) {
- // Make sure there's no session yet
$room = Room::where('name', 'john')->first();
// Join the room as an owner (authenticate)
@@ -134,10 +133,10 @@
->type('@setup-nickname-input', 'John')
->clickWhenEnabled('@setup-button')
->waitFor('@session')
- // Enter Security option dialog
- ->click('@menu button.link-security')
- ->with(new Dialog('#security-options-dialog'), function (Browser $browser) use ($room) {
- $browser->assertSeeIn('@title', 'Security options')
+ // Enter room option dialog
+ ->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertSeeIn('@title', 'Room options')
->assertSeeIn('#room-lock label', 'Locked room:')
->assertVisible('#room-lock input[type=checkbox]:not(:checked)')
->assertVisible('#room-lock + small')
@@ -197,7 +196,6 @@
public function testLockedRoomAcceptAndDismiss(): void
{
$this->browse(function (Browser $owner, Browser $guest) {
- // Make sure there's no session yet
$room = Room::where('name', 'john')->first();
// Join the room as an owner (authenticate)
@@ -209,10 +207,10 @@
->type('@setup-nickname-input', 'John')
->clickWhenEnabled('@setup-button')
->waitFor('@session')
- // Enter Security option dialog
- ->click('@menu button.link-security')
- ->with(new Dialog('#security-options-dialog'), function (Browser $browser) use ($room) {
- $browser->assertSeeIn('@title', 'Security options')
+ // Enter room option dialog
+ ->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertSeeIn('@title', 'Room options')
->assertSeeIn('#room-lock label', 'Locked room:')
->assertVisible('#room-lock input[type=checkbox]:not(:checked)')
->assertVisible('#room-lock + small')
@@ -267,4 +265,62 @@
});
});
}
+
+ /**
+ * Test nomedia (subscribers only) feature
+ *
+ * @group openvidu
+ */
+ public function testSubscribersOnly(): void
+ {
+ $this->browse(function (Browser $owner, Browser $guest) {
+ $room = Room::where('name', 'john')->first();
+
+ // Join the room as an owner (authenticate)
+ $owner->visit(new RoomPage('john'))
+ // ->click('@setup-button')
+ // ->submitLogon('john@kolab.org', 'simple123')
+ ->waitFor('@setup-form')
+ ->waitUntilMissing('@setup-status-message.loading')
+ ->type('@setup-nickname-input', 'John')
+ ->clickWhenEnabled('@setup-button')
+ ->waitFor('@session')
+ // Enter room option dialog
+ ->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertSeeIn('@title', 'Room options')
+ ->assertSeeIn('#room-nomedia label', 'Subscribers only:')
+ ->assertVisible('#room-nomedia input[type=checkbox]:not(:checked)')
+ ->assertVisible('#room-nomedia + small')
+ // Test enabling the option
+ ->click('#room-nomedia input')
+ ->assertToast(Toast::TYPE_SUCCESS, "Room configuration updated successfully.")
+ ->click('@button-action');
+
+ $this->assertSame('true', $room->fresh()->getSetting('nomedia'));
+ });
+
+ // In another browser act as a guest
+ $guest->visit(new RoomPage('john'))
+ ->waitFor('@setup-form')
+ ->waitUntilMissing('@setup-status-message.loading')
+ ->type('@setup-nickname-input', 'John')
+ ->clickWhenEnabled('@setup-button')
+ // expect the owner to have a video, but the guest to have none
+ ->waitFor('@session .meet-video')
+ ->waitFor('@session .meet-subscriber.self');
+
+ // Unset the option back
+ $owner->click('@menu button.link-options')
+ ->with(new Dialog('#room-options-dialog'), function (Browser $browser) use ($room) {
+ $browser->assertVisible('#room-nomedia input[type=checkbox]:checked')
+ // Test enabling the option
+ ->click('#room-nomedia input')
+ ->assertToast(Toast::TYPE_SUCCESS, "Room configuration updated successfully.")
+ ->click('@button-action');
+
+ $this->assertSame(null, $room->fresh()->getSetting('nomedia'));
+ });
+ });
+ }
}
diff --git a/src/tests/Browser/Meet/RoomSetupTest.php b/src/tests/Browser/Meet/RoomSetupTest.php
--- a/src/tests/Browser/Meet/RoomSetupTest.php
+++ b/src/tests/Browser/Meet/RoomSetupTest.php
@@ -307,7 +307,7 @@
'hand' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
'chat' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
'fullscreen' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
- 'security' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
+ 'options' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
'logout' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
]);
diff --git a/src/tests/TestCaseMeetTrait.php b/src/tests/TestCaseMeetTrait.php
--- a/src/tests/TestCaseMeetTrait.php
+++ b/src/tests/TestCaseMeetTrait.php
@@ -37,7 +37,7 @@
$this->clearMeetEntitlements();
$room = Room::where('name', $room_name)->first();
- $room->setSettings(['password' => null, 'locked' => null]);
+ $room->setSettings(['password' => null, 'locked' => null, 'nomedia' => null]);
if ($room->session_id) {
$room->session_id = null;

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 3, 2:00 AM (12 h, 56 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18822064
Default Alt Text
D2257.1775181632.diff (17 KB)

Event Timeline