use crate::unwrap_or_return_option; use crate::unwrap_or_return_result; use crate::State; use crate::{encryption, helpers}; use eyre::Result; use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; use std::collections::HashMap; use std::sync::mpsc::{self, Receiver, Sender}; fn forward( message: &str, listener_channel_tx: &Sender, server: &str, ) -> Result<(), mpsc::SendError> { listener_channel_tx.send(message.replace(server, "127.0.0.1")) } pub fn handle_message_from_server( recieved: &str, public_key: &Vec, secret_key: &SignedSecretKey, server: &str, passwd: &str, keys: &mut HashMap, writer_channel_tx: &Sender, writer_channel_rx: &Receiver, listener_channel_tx: &Sender, _listener_channel_rx: &Receiver, state: &State, ) -> Result<()> { let recieved_parsed = &unwrap_or_return_result!(ircparser::parse(recieved))[0]; let default_reciever = String::new(); let reciever = match recieved_parsed.params.get(0) { Some(val) => val, None => &default_reciever, }; if recieved_parsed.command != "PRIVMSG" || reciever.starts_with('#') || state.nicks_without_encryption.contains(reciever) { forward(recieved, listener_channel_tx, server)?; return Ok(()); } dbg!(&recieved_parsed); let source = unwrap_or_return_option!(&recieved_parsed.source); if recieved_parsed.params[1] == "START_MESSAGE" { let sender = unwrap_or_return_option!(helpers::get_nick(source)); let message = helpers::recieve_message_base64( writer_channel_rx, listener_channel_tx, server, "127.0.0.1", &sender, "END_MESSAGE", )?; // Get let message = encryption::decrypt(secret_key, &message, passwd)?; // Decrypt listener_channel_tx.send(recieved.replace("START_MESSAGE", &message))?; // Send } else if recieved_parsed.params[1] == "START_KEY" { let sender = unwrap_or_return_option!(helpers::get_nick(source)); let to_send = helpers::bytes_to_privmsg_base64(public_key, &sender); writer_channel_tx.send(to_send)?; writer_channel_tx.send(format!("PRIVMSG {sender} END_KEY\r\n"))?; let foreign_key = helpers::recieve_message_base64( writer_channel_rx, listener_channel_tx, server, "127.0.0.1", &sender, "END_KEY", )?; dbg!(&foreign_key); let key = SignedPublicKey::from_bytes(foreign_key.as_slice())?; println!("Got a key from {sender}"); keys.insert(sender.to_string(), key); } Ok(()) }