Skip to content
Open
Show file tree
Hide file tree
Changes from all 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_dialin_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