From 08c276e4f493c7960158a44e77062af1b30c3352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Garc=C3=ADa?= Date: Tue, 7 Apr 2026 17:15:50 -0500 Subject: [PATCH] fix: allow anonymous recording start and add light theme email icon (#949) * fix: all anounimous can start recording * fix: give more schedule timeout to heavy processes * fix: add light mode support for daily icons --- .../hatchet/workflows/daily_multitrack_pipeline.py | 3 +++ server/reflector/views/meetings.py | 4 +--- server/tests/test_security_permissions.py | 7 +++++-- www/app/[roomName]/components/DailyRoom.tsx | 7 ++++++- www/public/email-icon-dark.svg | 4 ++++ 5 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 www/public/email-icon-dark.svg diff --git a/server/reflector/hatchet/workflows/daily_multitrack_pipeline.py b/server/reflector/hatchet/workflows/daily_multitrack_pipeline.py index 8fc912ed..563079c5 100644 --- a/server/reflector/hatchet/workflows/daily_multitrack_pipeline.py +++ b/server/reflector/hatchet/workflows/daily_multitrack_pipeline.py @@ -524,6 +524,7 @@ async def get_participants(input: PipelineInput, ctx: Context) -> ParticipantsRe @daily_multitrack_pipeline.task( parents=[get_participants], execution_timeout=timedelta(seconds=TIMEOUT_HEAVY), + schedule_timeout=timedelta(seconds=TIMEOUT_HEAVY), retries=3, backoff_factor=2.0, backoff_max_seconds=30, @@ -663,6 +664,7 @@ async def process_tracks(input: PipelineInput, ctx: Context) -> ProcessTracksRes @daily_multitrack_pipeline.task( parents=[process_tracks], execution_timeout=timedelta(seconds=TIMEOUT_AUDIO), + schedule_timeout=timedelta(seconds=TIMEOUT_HEAVY), retries=2, backoff_factor=2.0, backoff_max_seconds=15, @@ -860,6 +862,7 @@ async def generate_waveform(input: PipelineInput, ctx: Context) -> WaveformResul @daily_multitrack_pipeline.task( parents=[process_tracks], execution_timeout=timedelta(seconds=TIMEOUT_EXTRA_HEAVY), + schedule_timeout=timedelta(seconds=TIMEOUT_HEAVY), retries=3, backoff_factor=2.0, backoff_max_seconds=30, diff --git a/server/reflector/views/meetings.py b/server/reflector/views/meetings.py index 78137ca9..7e7659d4 100644 --- a/server/reflector/views/meetings.py +++ b/server/reflector/views/meetings.py @@ -91,9 +91,7 @@ class StartRecordingRequest(BaseModel): async def start_recording( meeting_id: NonEmptyString, body: StartRecordingRequest, - user: Annotated[ - Optional[auth.UserInfo], Depends(auth.current_user_optional_if_public_mode) - ], + user: Annotated[Optional[auth.UserInfo], Depends(auth.current_user_optional)], ) -> dict[str, Any]: """Start cloud or raw-tracks recording via Daily.co REST API. diff --git a/server/tests/test_security_permissions.py b/server/tests/test_security_permissions.py index bf8e048b..82d6cdbd 100644 --- a/server/tests/test_security_permissions.py +++ b/server/tests/test_security_permissions.py @@ -452,9 +452,11 @@ async def test_anonymous_cannot_webrtc_record_when_not_public(client, monkeypatc @pytest.mark.asyncio -async def test_anonymous_cannot_start_meeting_recording_when_not_public( +async def test_anonymous_can_start_meeting_recording_when_not_public( client, monkeypatch ): + """Anonymous users can start recording since it's triggered from the frontend + and recording is at room level via Daily REST API.""" monkeypatch.setattr(settings, "PUBLIC_MODE", False) room = await rooms_controller.add( @@ -486,7 +488,8 @@ async def test_anonymous_cannot_start_meeting_recording_when_not_public( f"/meetings/{meeting.id}/recordings/start", json={"type": "cloud", "instanceId": "00000000-0000-0000-0000-000000000001"}, ) - assert resp.status_code == 401, resp.text + # Should not be 401 (may fail for other reasons like no Daily API, but auth passes) + assert resp.status_code != 401, f"Should not get 401: {resp.text}" # ====================================================================== diff --git a/www/app/[roomName]/components/DailyRoom.tsx b/www/app/[roomName]/components/DailyRoom.tsx index c7072aa0..94add0e4 100644 --- a/www/app/[roomName]/components/DailyRoom.tsx +++ b/www/app/[roomName]/components/DailyRoom.tsx @@ -337,6 +337,10 @@ export default function DailyRoom({ meeting, room }: DailyRoomProps) { [], ); const emailIconUrl = useMemo( + () => new URL("/email-icon-dark.svg", window.location.origin), + [], + ); + const emailIconDarkModeUrl = useMemo( () => new URL("/email-icon.svg", window.location.origin), [], ); @@ -399,12 +403,13 @@ export default function DailyRoom({ meeting, room }: DailyRoomProps) { show ? { iconPath: emailIconUrl.href, + iconPathDarkMode: emailIconDarkModeUrl.href, label: "Email Transcript", tooltip: "Get transcript emailed to you", } : null, ); - }, [emailIconUrl, setCustomTrayButton]); + }, [emailIconUrl, emailIconDarkModeUrl, setCustomTrayButton]); if (authLastUserId === undefined) { return ( diff --git a/www/public/email-icon-dark.svg b/www/public/email-icon-dark.svg new file mode 100644 index 00000000..356c9274 --- /dev/null +++ b/www/public/email-icon-dark.svg @@ -0,0 +1,4 @@ + + + +