diff --git a/app/Http/Controllers/api/v1/UserController.php b/app/Http/Controllers/api/v1/UserController.php
index e5fe639d1..27c970d9e 100644
--- a/app/Http/Controllers/api/v1/UserController.php
+++ b/app/Http/Controllers/api/v1/UserController.php
@@ -207,6 +207,15 @@ public function update(UserRequest $request, User $user)
if ($request->has('bbb_skip_check_audio')) {
$user->bbb_skip_check_audio = $request->bbb_skip_check_audio;
}
+ if ($request->has('record_agreement')) {
+ $user->record_agreement = $request->record_agreement;
+ }
+ if ($request->has('record_video_agreement')) {
+ $user->record_video_agreement = $request->record_video_agreement;
+ }
+ if ($request->has('record_attendance_agreement')) {
+ $user->record_attendance_agreement = $request->record_attendance_agreement;
+ }
$user->save();
diff --git a/app/Http/Requests/UserRequest.php b/app/Http/Requests/UserRequest.php
index 03f8b818d..8d6e3f4ff 100644
--- a/app/Http/Requests/UserRequest.php
+++ b/app/Http/Requests/UserRequest.php
@@ -20,6 +20,9 @@ public function rules()
$rules = [
'user_locale' => ['sometimes', 'required', 'string', Rule::in(array_keys(config('app.enabled_locales')))],
'bbb_skip_check_audio' => ['sometimes', 'required', 'boolean'],
+ 'record_agreement' => ['sometimes', 'required', 'boolean'],
+ 'record_video_agreement' => ['sometimes', 'required', 'boolean'],
+ 'record_attendance_agreement' => ['sometimes', 'required', 'boolean'],
'timezone' => ['sometimes', 'required', 'string', Rule::in(timezone_identifiers_list())],
'roles' => ['sometimes', 'required', 'array'],
'roles.*' => ['sometimes', 'distinct', 'integer', 'exists:App\Models\Role,id', Rule::notIn($prohibitedRoles)],
diff --git a/app/Http/Resources/User.php b/app/Http/Resources/User.php
index 6e8f52900..a9f8e32bb 100644
--- a/app/Http/Resources/User.php
+++ b/app/Http/Resources/User.php
@@ -82,7 +82,9 @@ public function toArray($request)
return new RoleCollection($this->roles);
}),
'bbb_skip_check_audio' => $this->bbb_skip_check_audio,
- 'initial_password_set' => $this->initial_password_set,
+ 'record_agreement' => $this->record_agreement,
+ 'record_video_agreement' => $this->record_video_agreement,
+ 'record_attendance_agreement' => $this->record_attendance_agreement,
'timezone' => $this->timezone,
'superuser' => $this->superuser,
];
diff --git a/app/Models/User.php b/app/Models/User.php
index 7fe6ecb1f..d6fea0ee8 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -39,7 +39,9 @@ protected static function booted()
* @var array
*/
protected $fillable = [
- 'firstname', 'lastname', 'email', 'password', 'external_id', 'guid', 'domain', 'locale', 'bbb_skip_check_audio', 'authenticator',
+ 'firstname', 'lastname', 'email', 'password', 'external_id', 'guid', 'domain', 'locale', 'bbb_skip_check_audio',
+ 'record_agreement', 'record_video_agreement', 'record_attendance_agreement',
+ 'authenticator',
'initial_password_set', 'timezone',
];
@@ -60,6 +62,9 @@ protected static function booted()
protected $casts = [
'email_verified_at' => 'datetime',
'bbb_skip_check_audio' => 'boolean',
+ 'record_agreement' => 'boolean',
+ 'record_video_agreement' => 'boolean',
+ 'record_attendance_agreement' => 'boolean',
'initial_password_set' => 'boolean',
];
diff --git a/database/migrations/2025_03_30_213313_add_default-record-agreement.php b/database/migrations/2025_03_30_213313_add_default-record-agreement.php
new file mode 100644
index 000000000..e36ea34a0
--- /dev/null
+++ b/database/migrations/2025_03_30_213313_add_default-record-agreement.php
@@ -0,0 +1,32 @@
+boolean('record_agreement')->default(false)->after('bbb_skip_check_audio');
+ $table->boolean('record_video_agreement')->default(false)->after('bbb_skip_check_audio');
+ $table->boolean('record_attendance_agreement')->default(false)->after('bbb_skip_check_audio');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down()
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn('record_agreement');
+ $table->dropColumn('record_video_agreement');
+ $table->dropColumn('record_attendance_agreement');
+ });
+ }
+};
diff --git a/lang/de/admin.php b/lang/de/admin.php
index f0b71a266..ae416ea39 100644
--- a/lang/de/admin.php
+++ b/lang/de/admin.php
@@ -448,6 +448,9 @@
'roles_and_permissions' => 'Rollen and Berechtigungen',
'show_password' => 'Password anzeigen',
'skip_check_audio' => 'Echo-Test deaktivieren',
+ 'record_agreement' => 'Zustimmung zur Aufzeichnung',
+ 'record_video_agreement' => 'Zustimmung zur Videoaufzeichnung',
+ 'record_attendance_agreement' => 'Zustimmung zur Anwesenheitsaufzeichnung',
'tile_description' => 'Die Benutzer können sich an dem System anmelden und je nach Rolle unterschiedliche Funktionen nutzen.',
'timezone' => 'Zeitzone',
'user_locale' => 'Sprache',
diff --git a/lang/de/validation.php b/lang/de/validation.php
index 47f5bd4de..8f2b9a539 100644
--- a/lang/de/validation.php
+++ b/lang/de/validation.php
@@ -39,6 +39,9 @@
'bbb_logo_dark_file' => 'Logodatei der dunklen Version',
'bbb_logo_file' => 'Logodatei',
'bbb_skip_check_audio' => 'Echo-Test deaktivieren',
+ 'record_agreement' => 'Zustimmung zur Aufzeichnung',
+ 'record_video_agreement' => 'Zustimmung zur Videoaufzeichnung',
+ 'record_attendance_agreement' => 'Zustimmung zur Anwesenheitsaufzeichnung',
'bbb_style' => 'CSS Style Datei',
'city' => 'Stadt',
'color' => 'Farbe',
diff --git a/lang/en/admin.php b/lang/en/admin.php
index 141f6db1b..259320f4a 100644
--- a/lang/en/admin.php
+++ b/lang/en/admin.php
@@ -448,6 +448,9 @@
'roles_and_permissions' => 'Roles and permissions',
'show_password' => 'Show password',
'skip_check_audio' => 'Disable echo audio test',
+ 'record_agreement' => 'Record Agreement',
+ 'record_video_agreement' => 'Record Video Agreement',
+ 'record_attendance_agreement' => 'Record Attendance Agreement',
'tile_description' => 'Users can login to the system and use different features depending on their role.',
'timezone' => 'Timezone',
'user_locale' => 'Language',
diff --git a/lang/en/validation.php b/lang/en/validation.php
index bb8695ebf..fc96e6ee7 100644
--- a/lang/en/validation.php
+++ b/lang/en/validation.php
@@ -39,6 +39,9 @@
'bbb_logo_dark_file' => 'Dark version logo file',
'bbb_logo_file' => 'Logo file',
'bbb_skip_check_audio' => 'Disable echo audio test',
+ 'record_agreement' => 'Record Agreement',
+ 'record_video_agreement' => 'Record Video Agreement',
+ 'record_attendance_agreement' => 'Record Attendance Agreement',
'bbb_style' => 'CSS style file',
'city' => 'City',
'color' => 'Color',
diff --git a/resources/js/components/RoomJoinButton.vue b/resources/js/components/RoomJoinButton.vue
index 0f7932281..a18117597 100644
--- a/resources/js/components/RoomJoinButton.vue
+++ b/resources/js/components/RoomJoinButton.vue
@@ -81,6 +81,14 @@