Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117750041
D2257.1775181632.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
17 KB
Referenced Files
None
Subscribers
None
D2257.1775181632.diff
View Options
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">×</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
Details
Attached
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)
Attached To
Mode
D2257: Meet: A room config option to force all to join as subscribers
Attached
Detach File
Event Timeline