From dd7e3a7c442b28715c704db636f517d3c571dfb0 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Sat, 4 Jan 2025 14:12:45 +0100 Subject: [PATCH] wip generate a random passphrase cached by slug --- src/backend/core/api/serializers.py | 5 ++--- src/backend/core/utils.py | 15 +++++++++++++++ src/frontend/src/features/rooms/api/ApiRoom.ts | 2 +- .../src/features/rooms/components/Conference.tsx | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index ff083858..dff9ee8a 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -139,12 +139,11 @@ class RoomSerializer(serializers.ModelSerializer): "token": utils.generate_token( room=slug, user=request.user, username=username ), + "passphrase": utils.get_cached_passphrase(slug) } - + output["is_administrable"] = is_admin - output['passphrase'] = "thisisapassphrase" - return output diff --git a/src/backend/core/utils.py b/src/backend/core/utils.py index 304b5de7..7ecfa44b 100644 --- a/src/backend/core/utils.py +++ b/src/backend/core/utils.py @@ -14,6 +14,21 @@ from django.conf import settings from livekit.api import AccessToken, VideoGrants +from functools import lru_cache +import secrets +import string + + +def generate_random_passphrase(length=26): + """Generate a random passphrase using letters and digits""" + alphabet = string.ascii_letters + string.digits + return ''.join(secrets.choice(alphabet) for _ in range(length)) + +@lru_cache() +def get_cached_passphrase(room_slug): + """Get or generate a cached passphrase for a room slug""" + return generate_random_passphrase() + def generate_color(identity: str) -> str: """Generates a consistent HSL color based on a given identity string. diff --git a/src/frontend/src/features/rooms/api/ApiRoom.ts b/src/frontend/src/features/rooms/api/ApiRoom.ts index 3c7e2536..4c2652e2 100644 --- a/src/frontend/src/features/rooms/api/ApiRoom.ts +++ b/src/frontend/src/features/rooms/api/ApiRoom.ts @@ -4,11 +4,11 @@ export type ApiRoom = { slug: string is_public: boolean is_administrable: boolean - passphrase: string livekit?: { url: string room: string token: string + passphrase: string } configuration?: { [key: string]: string | number | boolean diff --git a/src/frontend/src/features/rooms/components/Conference.tsx b/src/frontend/src/features/rooms/components/Conference.tsx index b5a2b43f..854b6bd5 100644 --- a/src/frontend/src/features/rooms/components/Conference.tsx +++ b/src/frontend/src/features/rooms/components/Conference.tsx @@ -110,7 +110,7 @@ export const Conference = ({ } if (e2eeEnabled) { keyProvider - .setKey(data.passphrase) + .setKey(data.livekit?.passphrase) .then(() => { room.setE2EEEnabled(true).catch((e) => { if (e instanceof DeviceUnsupportedError) {