diff options
author | metamuffin <metamuffin@disroot.org> | 2023-10-29 16:12:36 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-10-29 16:12:36 +0100 |
commit | 1ac7e4b6485a1d0e62c940caa687ddd2198963b0 (patch) | |
tree | 46da6e1b9aa1d6ac921b796c29df613088dc7f0c | |
parent | a372bb828f0bd3ff00bc52351bb0209bcde42b2d (diff) | |
download | keks-meet-1ac7e4b6485a1d0e62c940caa687ddd2198963b0.tar keks-meet-1ac7e4b6485a1d0e62c940caa687ddd2198963b0.tar.bz2 keks-meet-1ac7e4b6485a1d0e62c940caa687ddd2198963b0.tar.zst |
update native client to new version
-rw-r--r-- | client-native-export-track/src/main.rs | 2 | ||||
-rw-r--r-- | client-native-gui/src/main.rs | 15 | ||||
-rw-r--r-- | client-native-lib/src/instance.rs | 66 | ||||
-rw-r--r-- | client-native-lib/src/lib.rs | 24 | ||||
-rw-r--r-- | client-native-rift/src/main.rs | 3 |
5 files changed, 79 insertions, 31 deletions
diff --git a/client-native-export-track/src/main.rs b/client-native-export-track/src/main.rs index ea0e692..617d46a 100644 --- a/client-native-export-track/src/main.rs +++ b/client-native-export-track/src/main.rs @@ -62,7 +62,6 @@ async fn run() { let inst = Instance::new( Config { - secret: args.secret.clone(), signaling_uri: args.signaling_uri.clone(), username: args.username.clone(), }, @@ -73,6 +72,7 @@ async fn run() { ) .await; + inst.join(Some(&args.secret)).await; inst.spawn_ping().await; inst.receive_loop().await; diff --git a/client-native-gui/src/main.rs b/client-native-gui/src/main.rs index b799a1b..17a300b 100644 --- a/client-native-gui/src/main.rs +++ b/client-native-gui/src/main.rs @@ -130,11 +130,13 @@ impl eframe::App for App { let secret = secret.clone(); let username = username.clone(); *self = Self::Joining(Some(tokio::spawn(async move { - Inroom::new(Config { - secret, - username, - signaling_uri: "wss://meet.metamuffin.org".to_string(), - }) + Inroom::new( + Config { + username, + signaling_uri: "wss://meet.metamuffin.org".to_string(), + }, + &secret, + ) .await }))) } @@ -151,7 +153,7 @@ impl eframe::App for App { } impl Inroom { - pub async fn new(config: Config) -> Self { + pub async fn new(config: Config, secret: &str) -> Self { let handler = Arc::new(Handler::new()); let instance = Instance::new(config, handler.clone()).await; instance.spawn_ping().await; @@ -159,6 +161,7 @@ impl Inroom { let instance = instance.clone(); tokio::spawn(instance.receive_loop()); } + instance.join(Some(secret)).await; let k = Self { chat: Arc::new(RwLock::new(Chat::new(instance.clone()))), instance, diff --git a/client-native-lib/src/instance.rs b/client-native-lib/src/instance.rs index 56c9efa..be8ffb8 100644 --- a/client-native-lib/src/instance.rs +++ b/client-native-lib/src/instance.rs @@ -5,7 +5,7 @@ */ use crate::{ build_api, - crypto::{self, Key}, + crypto::{self, hash, Key}, peer::Peer, protocol::{self, ClientboundPacket, RelayMessage, RelayMessageWrapper, ServerboundPacket}, signaling::{self, SignalingConnection}, @@ -22,7 +22,7 @@ pub struct Instance { pub conn: SignalingConnection, pub config: Config, pub api: API, - key: Key, + key: RwLock<Option<Key>>, pub local_resources: RwLock<HashMap<String, Box<dyn LocalResource>>>, my_id: RwLock<Option<usize>>, pub peers: RwLock<HashMap<usize, Arc<Peer>>>, @@ -31,7 +31,6 @@ pub struct Instance { impl Instance { pub async fn new(config: Config, event_handler: Arc<dyn EventHandler>) -> Arc<Self> { let conn = signaling::SignalingConnection::new(&config.signaling_uri).await; - let key = crypto::Key::derive(&config.secret); Arc::new(Self { event_handler, @@ -41,10 +40,19 @@ impl Instance { local_resources: Default::default(), config, conn, - key, + key: None.into(), }) } + pub async fn join(&self, secret: Option<&str>) { + info!("join room {secret:?}"); + *self.key.write().await = secret.map(|secret| crypto::Key::derive(&secret)); + self.send_packet(ServerboundPacket::Join { + hash: secret.map(|secret| hash(secret)), + }) + .await; + } + pub async fn spawn_ping(self: &Arc<Self>) { let blub = self.clone(); tokio::spawn(async move { @@ -94,12 +102,22 @@ impl Instance { } } protocol::ClientboundPacket::ClientLeave { id } => { - let peer = self.peers.write().await.remove(&id).unwrap(); - peer.on_leave().await; - self.event_handler.peer_leave(peer).await; + if id == self.my_id().await { + // we left + } else { + let peer = self.peers.write().await.remove(&id).unwrap(); + peer.on_leave().await; + self.event_handler.peer_leave(peer).await; + } } protocol::ClientboundPacket::Message { sender, message } => { - let message = self.key.decrypt(&message); + let message = self + .key + .read() + .await + .as_ref() + .expect("not in a room") + .decrypt(&message); let p = serde_json::from_str::<RelayMessageWrapper>(&message).unwrap(); if p.sender == sender { self.on_relay(sender, p.inner).await; @@ -107,7 +125,9 @@ impl Instance { warn!("dropping packet with inconsistent sender") } } - protocol::ClientboundPacket::RoomInfo { .. } => {} + protocol::ClientboundPacket::RoomInfo { hash, user_count } => { + self.event_handler.room_info(hash, user_count).await; + } } } @@ -121,24 +141,36 @@ impl Instance { } } - pub async fn send_relay(&self, recipient: Option<usize>, inner: RelayMessage) { - debug!("(relay) -> ({recipient:?}) {inner:?}"); + pub async fn send_packet(&self, packet: ServerboundPacket) { self.conn .send .write() .await - .send(ServerboundPacket::Relay { - recipient, - message: self.key.encrypt( + .send(packet) + .await + .expect("why?"); + } + + pub async fn send_relay(&self, recipient: Option<usize>, inner: RelayMessage) { + debug!("(relay) -> ({recipient:?}) {inner:?}"); + self.send_packet(ServerboundPacket::Relay { + recipient, + // TODO handle this error + message: self + .key + .read() + .await + .as_ref() + .expect("not in a room") + .encrypt( &serde_json::to_string(&RelayMessageWrapper { sender: self.my_id.read().await.expect("not ready to relay yet.."), inner, }) .unwrap(), ), - }) - .await - .unwrap() + }) + .await } pub async fn add_local_resource(&self, res: Box<dyn LocalResource>) { diff --git a/client-native-lib/src/lib.rs b/client-native-lib/src/lib.rs index dce21af..4fdf80f 100644 --- a/client-native-lib/src/lib.rs +++ b/client-native-lib/src/lib.rs @@ -27,7 +27,6 @@ pub use webrtc; pub struct Config { pub signaling_uri: String, - pub secret: String, pub username: String, } @@ -47,18 +46,31 @@ pub trait LocalResource: Send + Sync + 'static { fn info(&self) -> ProvideInfo; fn on_request(&self, peer: Arc<Peer>) -> DynFut<()>; } + +#[allow(unused_variables)] pub trait EventHandler: Send + Sync + 'static { - fn peer_join(&self, peer: Arc<Peer>) -> DynFut<()>; - fn peer_leave(&self, peer: Arc<Peer>) -> DynFut<()>; - fn resource_added(&self, peer: Arc<Peer>, info: ProvideInfo) -> DynFut<()>; - fn resource_removed(&self, peer: Arc<Peer>, id: String) -> DynFut<()>; + fn peer_join(&self, peer: Arc<Peer>) -> DynFut<()> { + Box::pin(async move {}) + } + fn peer_leave(&self, peer: Arc<Peer>) -> DynFut<()> { + Box::pin(async move {}) + } + fn resource_added(&self, peer: Arc<Peer>, info: ProvideInfo) -> DynFut<()> { + Box::pin(async move {}) + } + fn resource_removed(&self, peer: Arc<Peer>, id: String) -> DynFut<()> { + Box::pin(async move {}) + } fn resource_connected( &self, peer: Arc<Peer>, resource: &ProvideInfo, channel: TransportChannel, ) -> DynFut<()>; - fn on_relay(&self, _peer: Arc<Peer>, _message: &RelayMessage) -> DynFut<()> { + fn on_relay(&self, peer: Arc<Peer>, message: &RelayMessage) -> DynFut<()> { + Box::pin(async move {}) + } + fn room_info(&self, hash: String, user_count: usize) -> DynFut<()> { Box::pin(async move {}) } } diff --git a/client-native-rift/src/main.rs b/client-native-rift/src/main.rs index 89f09f8..9ba171f 100644 --- a/client-native-rift/src/main.rs +++ b/client-native-rift/src/main.rs @@ -65,7 +65,6 @@ async fn run() { let inst = Instance::new( Config { - secret: args.secret.clone(), signaling_uri: args.signaling_uri.clone(), username: args.username.clone(), }, @@ -75,6 +74,8 @@ async fn run() { ) .await; + inst.join(Some(&args.secret)).await; + match &args.action { Action::Send { filename } => { inst.add_local_resource(Box::new(FileSender { |