Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/Http/Controllers/api/v1/RoomController.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,11 @@ public function store(CreateRoom $request)
$room->access_code = random_int(111111111, 999999999);
}

// Create dialin pin if activated for this room type
if ($room->roomType->dialin_pin_default) {
$room->dialin_pin = random_int(11111, 99999);
}

// Apply non-expert settings of the room type
foreach (Room::ROOM_SETTINGS_DEFINITION as $setting => $config) {
if (! $config['expert']) {
Expand Down Expand Up @@ -273,6 +278,7 @@ public function update(UpdateRoomSettings $request, Room $room)
$room->expert_mode = $request->expert_mode;
$room->short_description = $request->short_description;
$room->access_code = $request->access_code;
$room->dialin_pin = $request->dialin_pin;

foreach (Room::ROOM_SETTINGS_DEFINITION as $setting => $config) {
// Expert mode for room is deactivated and setting is an expert setting: do not update setting
Expand Down
4 changes: 4 additions & 0 deletions app/Http/Controllers/api/v1/RoomTypeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ public function update(RoomTypeRequest $request, RoomType $roomType)

$roomType->has_access_code_default = $request->has_access_code_default;
$roomType->has_access_code_enforced = $request->has_access_code_enforced;
$roomType->has_dialin_pin_default = $request->has_dialin_pin_default;
$roomType->has_dialin_pin_enforced = $request->has_dialin_pin_enforced;

$roomType->save();

Expand Down Expand Up @@ -143,6 +145,8 @@ public function store(RoomTypeRequest $request)

$roomType->has_access_code_default = $request->has_access_code_default;
$roomType->has_access_code_enforced = $request->has_access_code_enforced;
$roomType->has_dialin_pin_default = $request->has_dialin_pin_default;
$roomType->has_dialin_pin_enforced = $request->has_dialin_pin_enforced;

$roomType->save();

Expand Down
4 changes: 4 additions & 0 deletions app/Http/Requests/RoomTypeRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public function rules()
// Default room settings
'has_access_code_default' => ['required', 'boolean'],
'has_access_code_enforced' => ['required', 'boolean'],
'has_dialin_pin_default' => ['required', 'boolean'],
'has_dialin_pin_enforced' => ['required', 'boolean'],
];

// Default room settings
Expand All @@ -50,6 +52,8 @@ public function attributes(): array
$locales = [
'has_access_code_default' => __('validation.room_type_attribute_default', ['attribute' => __('validation.attributes.has_access_code')]),
'has_access_code_enforced' => __('validation.room_type_attribute_enforced', ['attribute' => __('validation.attributes.has_access_code')]),
'has_dialin_pin_default' => __('validation.room_type_attribute_default', ['attribute' => __('validation.attributes.has_dialin_pin')]),
'has_dialin_pin_enforced' => __('validation.room_type_attribute_enforced', ['attribute' => __('validation.attributes.has_dialin_pin')]),
];

foreach (Room::ROOM_SETTINGS_DEFINITION as $setting => $config) {
Expand Down
33 changes: 33 additions & 0 deletions app/Http/Requests/UpdateRoomSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public function rules()
'name' => ['required', 'string', 'min:2', 'max:'.config('bigbluebutton.room_name_limit')],
'short_description' => ['nullable', 'string', 'max:300'],
'expert_mode' => ['required', 'boolean'],
'dialin_pin' => $this->getDialinPinValidationRule(),
];

// Generate validation rules for all visible room settings
Expand Down Expand Up @@ -66,4 +67,36 @@ private function getAccessCodeValidationRule(): array

return $rules;
}

/**
* Set dialin_pin validation rule based on the settings in the room type
*
* @return string[] dialin_pin validation rules
*/
private function getDialinPinValidationRule(): array
{
$rules = ['integer', 'digits:5', 'bail', 'min:10000', 'max:99999', 'unique:rooms,dialin_pin,' . $this->room->id];

// Make sure that the given room type id is a number
if (is_numeric($this->input('room_type'))) {
// Check if a room type exists with the given number
$newRoomType = RoomType::find($this->input('room_type'));
if ($newRoomType) {
// Set dialin_pin to required if enforced in room type
if ($newRoomType->has_dialin_pin_enforced && $newRoomType->has_dialin_pin_default) {
array_unshift($rules, 'required');
}
// Set dialin_pin to prohibited if enforced in room type
elseif ($newRoomType->has_adialin_pin_enforced && ! $newRoomType->has_dialin_pin_default) {
array_unshift($rules, 'prohibited', 'nullable');
}
// Set dialin_pin to nullable (room can have an dialin_pin but dialin_pin is not enforced)
else {
array_unshift($rules, 'nullable');
}
}
}

return $rules;
}
}
1 change: 1 addition & 0 deletions app/Http/Resources/RoomSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public function toArray($request)
'welcome' => $this->expert_mode ? $this->welcome : '',
'short_description' => $this->short_description,
'access_code' => $this->access_code,
'dialin_pin' => $this->dialin_pin,
'room_type' => (new RoomType($this->roomType))->withDefaultRoomSettings()->withFeatures(),
$this->merge($this->getRoomSettings()),
];
Expand Down
3 changes: 3 additions & 0 deletions app/Http/Resources/RoomType.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ public function getDefaultRoomSettings()
$settings['has_access_code_default'] = $this->has_access_code_default;
$settings['has_access_code_enforced'] = $this->has_access_code_enforced;

$settings['has_dialin_pin_default'] = $this->has_dialin_pin_default;
$settings['has_dialin_pin_enforced'] = $this->has_dialin_pin_enforced;

return $settings;
}

Expand Down
1 change: 1 addition & 0 deletions app/Models/Room.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ protected function casts()
'expert_mode' => 'boolean',
'delete_inactive' => 'datetime',
'access_code' => 'integer',
'dialin_pin' => 'integer',
];

// Generate casts for settings that are also present in the room type
Expand Down
2 changes: 2 additions & 0 deletions app/Models/RoomType.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ protected function casts()
// Default room settings
'has_access_code_default' => 'boolean',
'has_access_code_enforced' => 'boolean',
'has_dialin_pin_default' => 'boolean',
'has_dialin_pin_enforced' => 'boolean',
];

// Generate casts for default room settings (that are also present in the room)
Expand Down
3 changes: 2 additions & 1 deletion app/Services/MeetingService.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ public function start(): ?\BigBlueButton\Responses\CreateMeetingResponse
->setLockSettingsDisableNotes($this->meeting->room->getRoomSetting('lock_settings_disable_note'))
->setLockSettingsHideUserList($this->meeting->room->getRoomSetting('lock_settings_hide_user_list'))
->setLockSettingsLockOnJoin(true)
->setMuteOnStart($this->meeting->room->getRoomSetting('mute_on_start'));
->setMuteOnStart($this->meeting->room->getRoomSetting('mute_on_start'))
->setVoiceBridge($this->meeting->room->getRoomSetting('dialin_pin'));

$meetingParams->addMeta('bbb-origin', 'PILOS');
$meetingParams->addMeta('pilos-sub-spool-dir', config('recording.spool-sub-directory'));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up(): void
{

Schema::table('room_types', function (Blueprint $table) {
$table->boolean('has_dialin_pin_enforced')->after('has_access_code_default')->default(false);
$table->boolean('has_dialin_pin_default')->after('has_dialin_pin_enforced')->default(false);
});
Schema::table('rooms', function (Blueprint $table) {
$table->integer('dialin_pin')->nullable()->unique()->after('meeting_id');
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('room_types', function (Blueprint $table) {
$table->dropColumn('has_dialin_pin_enforced');
$table->dropColumn('has_dialin_pin_default');
});
Schema::table('rooms', function (Blueprint $table) {
$table->dropColumn('dialin_pin');
});
}
};
7 changes: 7 additions & 0 deletions lang/de/rooms.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

return [
'access_code' => 'Zugangscode',
'dialin_pin' => 'Einwahl-PIN',
'auth_throttled' => 'Zu viele Versuche. Bitte versuchen Sie es in :try_again Sekunden erneut.',
'become_member' => 'Mitglied werden',
'change_type' => [
Expand Down Expand Up @@ -358,6 +359,12 @@
'public' => 'Öffentlich',
'title' => 'Sichtbarkeit',
],
'has_dialin_pin' => 'Einwahl PIN',
'dialin_pin_none_placeholder' => '-- Zufällig --',
'dialin_pin_enforced' => 'Die Raumart erzwingt, dass ein Einwahl Pin existiert',
'dialin_pin_prohibited' => 'Die Raumart erzwingt, dass kein Einwahl Pin existiert',
'generate_dialin_pin' => 'Neuen Einwahl Pin erstellen',
'delete_dialin_pin' => 'Einwahl Pin entfernen',
],
'expert_mode' => [
'activate' => 'Expertenmodus aktivieren',
Expand Down
2 changes: 2 additions & 0 deletions lang/de/validation.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
'general_toast_lifetime' => 'Anzeigedauer von Pop-up-Nachrichten',
'generate_password' => 'Passwort generieren lassen',
'has_access_code' => 'Zugangscode',
'has_dialin_pin' => 'Einwahl PIN',
'hour' => 'Stunde',
'image' => 'Bild',
'last_name' => 'Nachname',
Expand Down Expand Up @@ -164,6 +165,7 @@
'username' => 'Benutzerkennung',
'users' => 'Benutzer',
'visibility' => 'Sichtbarkeit',
'dialin_pin' => 'Einwahl PIN',
'webcams_only_for_moderator' => 'Webcam nur für Moderatoren sichtbar',
'welcome' => 'Begrüßungsnachricht',
'year' => 'Jahr',
Expand Down
7 changes: 7 additions & 0 deletions lang/en/rooms.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

return [
'access_code' => 'Access code',
'dialin_pin' => 'Dialin PIN',
'auth_throttled' => 'Too many attempts. Please try again in :try_again seconds.',
'become_member' => 'Become member',
'change_type' => [
Expand Down Expand Up @@ -358,6 +359,12 @@
'public' => 'Public',
'title' => 'Visibility',
],
'has_dialin_pin' => 'Dialin PIN',
'dialin_pin_none_placeholder' => '-- Random --',
'dialin_pin_enforced' => 'The room type enforces the existence of an dialin pin',
'dialin_pin_prohibited' => 'The room type enforces the absence of an dialin pin',
'generate_dialin_pin' => 'Generate new dialin pin',
'delete_dialin_pin' => 'Delete dialin pin',
],
'expert_mode' => [
'activate' => 'Activate expert mode',
Expand Down
2 changes: 2 additions & 0 deletions lang/en/validation.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
'general_toast_lifetime' => 'Display duration of pop-up messages',
'generate_password' => 'Generate password',
'has_access_code' => 'Access code',
'has_dialin_pin' => 'Dialin PIN',
'hour' => 'Hour',
'image' => 'Image',
'last_name' => 'Last name',
Expand Down Expand Up @@ -164,6 +165,7 @@
'username' => 'Username',
'users' => 'Users',
'visibility' => 'Visibility',
'dialin_pin' => 'Dialin PIN',
'webcams_only_for_moderator' => 'Only moderators can see the webcam',
'welcome' => 'Welcome message',
'year' => 'Year',
Expand Down
7 changes: 7 additions & 0 deletions resources/js/components/RoomTabSettings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ import RoomTabSettingsRadioGroup from "./RoomTabSettingsRadioGroup.vue";
import RoomTabSettingsSelectButton from "./RoomTabSettingsSelectButton.vue";
import RoomTabSettingsRoomTypeSelect from "./RoomTabSettingsRoomTypeSelect.vue";
import RoomTabSettingsAccessCodeInput from "./RoomTabSettingsAccessCodeInput.vue";
import RoomTabSettingsDialinPinInput from "./RoomTabSettingsDialinPinInput.vue";

const props = defineProps({
room: {
Expand Down Expand Up @@ -334,6 +335,12 @@ const form = computed(() => {
{ value: 1, label: t("rooms.settings.advanced.visibility.public") },
],
},
{
setting: "dialin_pin",
label: t("rooms.settings.advanced.has_dialin_pin"),
placeholder: t("rooms.settings.advanced.dialin_pin_none_placeholder"),
component: RoomTabSettingsDialinPinInput,
}
],
},
];
Expand Down
113 changes: 113 additions & 0 deletions resources/js/components/RoomTabSettingsDialinPinInput.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<template>
<div
:data-test="'room-setting-' + setting"
:class="
fullWidth
? 'col-span-12 row-span-2 grid grid-rows-subgrid gap-0'
: 'col-span-12 row-span-2 grid grid-rows-subgrid gap-0 md:col-span-6 xl:col-span-3'
"
>
<div class="mb-2 flex flex-col justify-end">
<label :for="'room-setting-' + setting">
<RoomSettingEnforcedIcon
v-if="model.room_type.dialin_pin_enforced"
/>
{{ label }}</label
>
</div>
<div class="flex flex-col gap-2">
<InputGroup>
<!-- Generate random dialin pin -->
<Button
v-if="!disabled"
v-tooltip="$t('rooms.settings.advanced.generate_dialin_pin')"
data-test="generate-dialin-pin-button"
:aria-label="$t('rooms.settings.advanced.generate_dialin_pin')"
icon="fa-solid fa-dice"
@click="createDialinPin"
/>
<!-- Dialin PIN -->
<InputText
:id="'room-setting-' + setting"
v-model="model[setting]"
:disabled="disabled"
:invalid="invalid"
:placeholder="placeholder"
/>
<!-- Clear dialin pin -->
<Button
v-if="model[setting] && !disabled"
v-tooltip="$t('rooms.settings.advanced.delete_dialin_pin')"
:aria-label="$t('rooms.settings.advanced.delete_dialin_pin')"
icon="fa-solid fa-trash"
data-test="clear-dialin-pin-button"
@click="model[setting] = null"
/>
</InputGroup>
<small v-if="model.room_type.dialin_pin_enforced">
{{
model.room_type.dialin_pin_default
? $t("rooms.settings.advanced.dialin_pin_enforced")
: $t("rooms.settings.advanced.dialin_pin_prohibited")
}}
</small>
<FormError :errors="errors" />
<InlineNote v-if="warningMessage" severity="warn">
{{ warningMessage }}
</InlineNote>
</div>
</div>
</template>

<script setup>
import FormError from "./FormError.vue";
import RoomSettingEnforcedIcon from "./RoomSettingEnforcedIcon.vue";

const model = defineModel({ type: Object });

const props = defineProps({
disabled: {
type: Boolean,
required: true,
},
invalid: {
type: Boolean,
required: false,
},
errors: {
type: Object,
required: true,
},
setting: {
type: String,
required: true,
},
fullWidth: {
type: Boolean,
required: false,
default: false,
},
placeholder: {
type: [String, null],
required: false,
default: null,
},
label: {
type: String,
required: true,
},
warningMessage: {
type: [String, null],
required: false,
default: null,
},
});

/**
* Create a new dialin pin for the room
*/
function createDialinPin() {
model.value[props.setting] =
Math.floor(Math.random() * (99999 - 11112)) + 11111;
}
</script>
Loading
Loading