authorizeAbility($request, 'meetings.manage'); $organization = $this->organization($request); return view('meet.settings.security', [ 'organization' => $organization, 'policy' => array_merge(config('meet.security_defaults'), $organization->security_policy ?? []), ]); } public function updateSecurity(Request $request, SecurityPolicyService $security): RedirectResponse { $this->authorizeAbility($request, 'meetings.manage'); $organization = $this->organization($request); $validated = $request->validate([ 'org_only' => ['sometimes', 'boolean'], 'authenticated_only' => ['sometimes', 'boolean'], 'allowed_domains' => ['nullable', 'string'], 'recording_host_only' => ['sometimes', 'boolean'], 'watermark_enabled' => ['sometimes', 'boolean'], 'session_idle_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], ]); $domains = collect(explode(',', (string) ($validated['allowed_domains'] ?? ''))) ->map(fn ($d) => trim($d)) ->filter() ->values() ->all(); $security->updateOrganizationPolicy($organization, [ 'org_only' => $request->boolean('org_only'), 'authenticated_only' => $request->boolean('authenticated_only'), 'allowed_domains' => $domains, 'recording_host_only' => $request->boolean('recording_host_only', true), 'watermark_enabled' => $request->boolean('watermark_enabled'), 'session_idle_minutes' => $validated['session_idle_minutes'] ?? 120, ]); return redirect()->route('meet.settings.security')->with('success', 'Security policy updated.'); } }