diff --git a/crates/core/database/src/voice/voice_client.rs b/crates/core/database/src/voice/voice_client.rs index 4f540870..261f68a7 100644 --- a/crates/core/database/src/voice/voice_client.rs +++ b/crates/core/database/src/voice/voice_client.rs @@ -106,8 +106,8 @@ impl VoiceClient { .to_internal_error() } - pub async fn remove_user(&self, user: &User, channel_id: &str) -> Result<()> { - self.rooms.remove_participant(channel_id, &user.id) + pub async fn remove_user(&self, user_id: &str, channel_id: &str) -> Result<()> { + self.rooms.remove_participant(channel_id, user_id) .await .to_internal_error() } diff --git a/crates/daemons/voice-ingress/Dockerfile b/crates/daemons/voice-ingress/Dockerfile index 77306986..4749d5cc 100644 --- a/crates/daemons/voice-ingress/Dockerfile +++ b/crates/daemons/voice-ingress/Dockerfile @@ -1,11 +1,11 @@ # Build Stage FROM ghcr.io/revoltchat/base:latest AS builder +FROM debian:12 AS debian # Bundle Stage -FROM debian:bullseye-slim -RUN apt-get update && \ - apt-get install -y ca-certificates && \ - apt-get clean +FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-voice-ingress ./ -EXPOSE 9000 -CMD ["./revolt-voice-ingress"] +COPY --from=debian /usr/bin/uname /usr/bin/uname + +USER nonroot +CMD ["./revolt-voice-ingress"] \ No newline at end of file diff --git a/crates/daemons/voice-ingress/src/main.rs b/crates/daemons/voice-ingress/src/main.rs index 91abe321..55fdf755 100644 --- a/crates/daemons/voice-ingress/src/main.rs +++ b/crates/daemons/voice-ingress/src/main.rs @@ -1,7 +1,7 @@ use std::env; -use livekit_protocol::WebhookEvent; +use livekit_protocol::{TrackType, WebhookEvent}; use revolt_database::{ events::client::EventV1, util::reference::Reference, Database, DatabaseInfo, voice::{create_voice_state, delete_voice_state, update_voice_state_tracks, VoiceClient} @@ -85,6 +85,17 @@ async fn ingress(db: &State, voice_client: &State, body: .as_channel(db) .await?; + // remove the user if they try publish a video larger than 1080x720 or they publish data + if body.event == "track_published" + && ( + (track.r#type == TrackType::Video as i32 && (track.width > 1080 || track.height > 720)) + | (track.r#type == TrackType::Data as i32) + ) + { + voice_client.remove_user(user_id, channel_id).await?; + delete_voice_state(channel_id, channel.server().as_deref(), user_id).await?; + } + let partial = update_voice_state_tracks( channel_id, channel.server().as_deref(), diff --git a/crates/delta/src/routes/channels/channel_delete.rs b/crates/delta/src/routes/channels/channel_delete.rs index 8c8dd5db..5cefe755 100644 --- a/crates/delta/src/routes/channels/channel_delete.rs +++ b/crates/delta/src/routes/channels/channel_delete.rs @@ -54,9 +54,7 @@ pub async fn delete( }; for user_id in get_voice_channel_members(channel.id()).await? { - let user = Reference::from_unchecked(user_id).as_user(db).await?; - - voice_client.remove_user(&user, channel.id()).await?; + voice_client.remove_user(&user_id, channel.id()).await?; delete_voice_state(channel.id(), channel.server().as_deref(), &user.id).await?; }; diff --git a/crates/delta/src/routes/channels/group_remove_member.rs b/crates/delta/src/routes/channels/group_remove_member.rs index 6bc0feb2..9836a7c3 100644 --- a/crates/delta/src/routes/channels/group_remove_member.rs +++ b/crates/delta/src/routes/channels/group_remove_member.rs @@ -48,7 +48,7 @@ pub async fn remove_member( }; if is_in_voice_channel(&user.id, channel.id()).await? { - voice_client.remove_user(&user, channel.id()).await?; + voice_client.remove_user(&user.id, channel.id()).await?; delete_voice_state(channel.id(), None, &user.id).await?; }; diff --git a/crates/delta/src/routes/servers/ban_create.rs b/crates/delta/src/routes/servers/ban_create.rs index cd1c8cf3..96a8d4c9 100644 --- a/crates/delta/src/routes/servers/ban_create.rs +++ b/crates/delta/src/routes/servers/ban_create.rs @@ -61,7 +61,7 @@ pub async fn ban( // If the member is in a voice channel while banned kick them from the voice channel if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? { - voice_client.remove_user(&user, &channel_id).await?; + voice_client.remove_user(&user.id, &channel_id).await?; delete_voice_state(&channel_id, Some(&server.id), &user.id).await? } } diff --git a/crates/delta/src/routes/servers/member_remove.rs b/crates/delta/src/routes/servers/member_remove.rs index a06e4be4..3276add7 100644 --- a/crates/delta/src/routes/servers/member_remove.rs +++ b/crates/delta/src/routes/servers/member_remove.rs @@ -43,7 +43,7 @@ pub async fn kick( } if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? { - voice_client.remove_user(&user, &channel_id).await?; + voice_client.remove_user(&user.id, &channel_id).await?; delete_voice_state(&channel_id, Some(&server.id), &user.id).await?; } diff --git a/crates/delta/src/routes/servers/server_delete.rs b/crates/delta/src/routes/servers/server_delete.rs index 9c909659..1cae301c 100644 --- a/crates/delta/src/routes/servers/server_delete.rs +++ b/crates/delta/src/routes/servers/server_delete.rs @@ -26,7 +26,7 @@ pub async fn delete( if server.owner == user.id { for channel_id in &server.channels { - voice_client.remove_user(&user, channel_id).await?; + voice_client.remove_user(&user.id, channel_id).await?; delete_voice_state(channel_id, Some(&server.id), &user.id).await?; } @@ -34,7 +34,7 @@ pub async fn delete( } else { if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? { if server.channels.iter().any(|c| c == &channel_id) { - voice_client.remove_user(&user, &channel_id).await?; + voice_client.remove_user(&user.id, &channel_id).await?; delete_voice_state(&channel_id, Some(&server.id), &user.id).await?; } };