.env, docs, performance, project name #2
			
				
			
		
		
		
	
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -1,3 +1,4 @@ | ||||||
| /target | /target | ||||||
| secret.gpg | secret.gpg | ||||||
| public.gpg | public.gpg | ||||||
|  | .env | ||||||
|  |  | ||||||
							
								
								
									
										31
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										31
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							|  | @ -379,6 +379,25 @@ dependencies = [ | ||||||
|  "subtle", |  "subtle", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "dotenv" | ||||||
|  | version = "0.15.0" | ||||||
|  | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "e2e-irc" | ||||||
|  | version = "0.1.0" | ||||||
|  | dependencies = [ | ||||||
|  |  "base64", | ||||||
|  |  "dotenv", | ||||||
|  |  "eyre", | ||||||
|  |  "ircparser", | ||||||
|  |  "openssl", | ||||||
|  |  "pgp", | ||||||
|  |  "rand", | ||||||
|  | ] | ||||||
|  | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ecdsa" | name = "ecdsa" | ||||||
| version = "0.16.8" | version = "0.16.8" | ||||||
|  | @ -604,18 +623,6 @@ dependencies = [ | ||||||
|  "generic-array", |  "generic-array", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| [[package]] |  | ||||||
| name = "irc-e2e" |  | ||||||
| version = "0.1.0" |  | ||||||
| dependencies = [ |  | ||||||
|  "base64", |  | ||||||
|  "eyre", |  | ||||||
|  "ircparser", |  | ||||||
|  "openssl", |  | ||||||
|  "pgp", |  | ||||||
|  "rand", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "ircparser" | name = "ircparser" | ||||||
| version = "0.2.1" | version = "0.2.1" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| [package] | [package] | ||||||
| name = "irc-e2e" | name = "e2e-irc" | ||||||
| version = "0.1.0" | version = "0.1.0" | ||||||
| edition = "2021" | edition = "2021" | ||||||
| 
 | 
 | ||||||
|  | @ -7,6 +7,7 @@ edition = "2021" | ||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| base64 = "0.21.4" | base64 = "0.21.4" | ||||||
|  | dotenv = "0.15.0" | ||||||
| eyre = "0.6.8" | eyre = "0.6.8" | ||||||
| ircparser = "0.2.1" | ircparser = "0.2.1" | ||||||
| openssl = "0.10" | openssl = "0.10" | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | # e2e-irc | ||||||
|  | This is an IRC bouncer that supports end-to-end encryption and is horribly written. | ||||||
|  | 
 | ||||||
|  | # Setup CWD | ||||||
|  | To use this you need to build it and in your CWD you need to add two files. One called `secret.gpg` and one called `public.gpg` that are just pgp keys. | ||||||
|  | You also need a .env file in your CWD like this: | ||||||
|  | ```bash | ||||||
|  | SERVER={address of the server you want to connect to (has to support tls)} | ||||||
|  | PORT={the port you want the program to bind to and the port that the IRC client should connect to} | ||||||
|  | PASSWD={password of your pgp key} # Optional | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Run | ||||||
|  | Then you just run the binary with: | ||||||
|  | `cargo run --release` | ||||||
|  | or build the project to get a binary | ||||||
|  | ```bash | ||||||
|  | cargo build --release | ||||||
|  | cp target/release/e2e-irc ~/.local/bin/ | ||||||
|  | ``` | ||||||
|  | and after running that once you can run the program with | ||||||
|  | ```bash | ||||||
|  | e2e-irc | ||||||
|  | ``` | ||||||
|  | but you have to have the .env in the CWD | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| use crate::helpers::bytes_to_privmsg_base64; | use crate::helpers::bytes_to_privmsg_base64; | ||||||
| use crate::{encryption, helpers}; | use crate::{encryption, helpers}; | ||||||
|  | use eyre::Result; | ||||||
| use pgp::{Deserializable, SignedPublicKey}; | use pgp::{Deserializable, SignedPublicKey}; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
| use std::sync::mpsc::{Receiver, Sender}; | use std::sync::mpsc::{Receiver, Sender}; | ||||||
| use eyre::Result; |  | ||||||
| 
 | 
 | ||||||
| pub fn handle_message_from_client( | pub fn handle_message_from_client( | ||||||
|     recieved: &str, |     recieved: &str, | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
|  | use eyre::Result; | ||||||
| use pgp::crypto::sym::SymmetricKeyAlgorithm; | use pgp::crypto::sym::SymmetricKeyAlgorithm; | ||||||
| use pgp::ser::Serialize; | use pgp::ser::Serialize; | ||||||
| use pgp::{Deserializable, Message, SignedPublicKey, SignedSecretKey}; | use pgp::{Deserializable, Message, SignedPublicKey, SignedSecretKey}; | ||||||
| use rand::prelude::*; | use rand::prelude::*; | ||||||
| use eyre::Result; |  | ||||||
| 
 | 
 | ||||||
| pub fn encrypt(key: &SignedPublicKey, message: &str) -> Result<Vec<u8>, pgp::errors::Error> { | pub fn encrypt(key: &SignedPublicKey, message: &str) -> Result<Vec<u8>, pgp::errors::Error> { | ||||||
|     let message = Message::new_literal("none", message); |     let message = Message::new_literal("none", message); | ||||||
|  | @ -15,10 +15,10 @@ pub fn encrypt(key: &SignedPublicKey, message: &str) -> Result<Vec<u8>, pgp::err | ||||||
| 
 | 
 | ||||||
| pub fn decrypt<'a>( | pub fn decrypt<'a>( | ||||||
|     key: &'a SignedSecretKey, |     key: &'a SignedSecretKey, | ||||||
|     message: Vec<u8>, |     message: &[u8], | ||||||
|     password: &'a str, |     password: &'a str, | ||||||
| ) -> Result<String, pgp::errors::Error> { | ) -> Result<String, pgp::errors::Error> { | ||||||
|     let message = Message::from_bytes(message.as_slice())?; // Convert message bytes to message object
 |     let message = Message::from_bytes(message)?; // Convert message bytes to message object
 | ||||||
|     let message = message.decrypt(|| password.to_string(), &[key])?.0; // Decrypt
 |     let message = message.decrypt(|| password.to_string(), &[key])?.0; // Decrypt
 | ||||||
|     let message = message.map(|x| x.unwrap()).collect::<Vec<Message>>(); // Get all messages
 |     let message = message.map(|x| x.unwrap()).collect::<Vec<Message>>(); // Get all messages
 | ||||||
|     let message = &message[0]; // Get first message
 |     let message = &message[0]; // Get first message
 | ||||||
|  |  | ||||||
|  | @ -1,20 +1,54 @@ | ||||||
| use base64::{engine::general_purpose, Engine as _}; | use base64::{engine::general_purpose, Engine as _}; | ||||||
| use std::sync::mpsc::{self, Receiver, Sender}; |  | ||||||
| use eyre::Result; | use eyre::Result; | ||||||
| use ircparser; | use ircparser; | ||||||
|  | use std::sync::mpsc::{self, Receiver, Sender}; | ||||||
|  | 
 | ||||||
|  | #[derive(Debug)] | ||||||
|  | struct IrcParseError; | ||||||
|  | 
 | ||||||
|  | impl std::fmt::Display for IrcParseError { | ||||||
|  |     fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl std::error::Error for IrcParseError {} | ||||||
| 
 | 
 | ||||||
| static MAX_LENGTH: usize = 300; | static MAX_LENGTH: usize = 300; | ||||||
| 
 | 
 | ||||||
|  | #[macro_export] | ||||||
|  | macro_rules! unwrap_or_return_result { | ||||||
|  |     ($e:expr) => { | ||||||
|  |         match $e { | ||||||
|  |             Ok(val) => val, | ||||||
|  |             Err(_) => return Ok(()), | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[macro_export] | ||||||
|  | macro_rules! unwrap_or_return_option { | ||||||
|  |     ($e:expr) => { | ||||||
|  |         match $e { | ||||||
|  |             Some(val) => val, | ||||||
|  |             None => return Ok(()), | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn forward( | fn forward( | ||||||
|     message: &str, |     message: String, | ||||||
|     stream: &Sender<String>, |     stream: &Sender<String>, | ||||||
|     server_local: &str, |     server_local: &str, | ||||||
|     server_forward: &str, |     server_forward: &str, | ||||||
| ) -> Result<(), mpsc::SendError<String>> { | ) -> Result<(), mpsc::SendError<String>> { | ||||||
|     if ircparser::parse(message).unwrap()[0].command == "PRIVMSG" { |     match ircparser::parse(&message) { | ||||||
|         return Ok(()) |         Ok(val) => match val[0].command.as_str() { | ||||||
|  |             "PRIVMSG" => stream.send(message), | ||||||
|  |             _ => stream.send(message.replace(&server_local, server_forward)), | ||||||
|  |         }, | ||||||
|  |         Err(_) => stream.send(message.replace(server_local, server_forward)), | ||||||
|     } |     } | ||||||
|     stream.send(message.replace(&server_local, server_forward)) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn bytes_to_privmsg_base64(message: &Vec<u8>, reciever: &str) -> String { | pub fn bytes_to_privmsg_base64(message: &Vec<u8>, reciever: &str) -> String { | ||||||
|  | @ -37,11 +71,7 @@ pub fn bytes_to_privmsg_base64(message: &Vec<u8>, reciever: &str) -> String { | ||||||
|     command |     command | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn send_key( | pub fn send_key(sender: &Sender<String>, reciever: &str, key: &Vec<u8>) -> Result<()> { | ||||||
|     sender: &Sender<String>, |  | ||||||
|     reciever: &str, |  | ||||||
|     key: &Vec<u8>, |  | ||||||
| ) -> Result<()> { |  | ||||||
|     sender.send(format!("PRIVMSG {reciever} :START_KEY\r\n"))?; |     sender.send(format!("PRIVMSG {reciever} :START_KEY\r\n"))?; | ||||||
|     sender.send(bytes_to_privmsg_base64(key, reciever))?; |     sender.send(bytes_to_privmsg_base64(key, reciever))?; | ||||||
|     sender.send(format!("PRIVMSG {reciever} :END_KEY\r\n"))?; |     sender.send(format!("PRIVMSG {reciever} :END_KEY\r\n"))?; | ||||||
|  | @ -49,11 +79,11 @@ pub fn send_key( | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn get_nick(userstring: &str) -> String { | pub fn get_nick(userstring: &str) -> Option<String> { | ||||||
|     let userstring = userstring.chars().collect::<Vec<char>>(); |     let userstring = userstring.chars().collect::<Vec<char>>(); | ||||||
|     let start_pos = userstring.iter().position(|&x| x == ':').unwrap() + 1; |     let start_pos = userstring.iter().position(|&x| x == ':')? + 1; | ||||||
|     let end_pos = userstring.iter().position(|&x| x == '!').unwrap(); |     let end_pos = userstring.iter().position(|&x| x == '!')?; | ||||||
|     userstring[start_pos..end_pos].iter().collect::<String>() |     Some(userstring[start_pos..end_pos].iter().collect::<String>()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn recieve_message_base64( | pub fn recieve_message_base64( | ||||||
|  | @ -69,16 +99,23 @@ pub fn recieve_message_base64( | ||||||
|     while !message.contains(&end.to_string()) { |     while !message.contains(&end.to_string()) { | ||||||
|         let recieved_raw = writer_channel_rx.recv()?; |         let recieved_raw = writer_channel_rx.recv()?; | ||||||
| 
 | 
 | ||||||
|         let recieved = &ircparser::parse(&recieved_raw).unwrap()[0]; |         let parse_result = ircparser::parse(&recieved_raw); | ||||||
|  | 
 | ||||||
|  |         let recieved = match parse_result { | ||||||
|  |             Ok(mut val) => val.pop_back().unwrap(), | ||||||
|  |             Err(_) => return Err(IrcParseError.into()), | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|         let begin_source_reciever = format!(":{sender}!"); |         let begin_source_reciever = format!(":{sender}!"); | ||||||
|         if recieved.command != "PRIVMSG" |         if recieved.command != "PRIVMSG" | ||||||
|             || !recieved |             || !recieved | ||||||
|                 .source |                 .source | ||||||
|                 .clone() |                 .clone() | ||||||
|                 .unwrap_or("".to_string()) |                 .unwrap_or("".to_string()) | ||||||
|                 .starts_with(&begin_source_reciever) || recieved.params[0].starts_with("#") |                 .starts_with(&begin_source_reciever) | ||||||
|  |             || recieved.params[0].starts_with("#") | ||||||
|         { |         { | ||||||
|             forward(&recieved_raw, forward_stream, server_local, server_forward)?; |             forward(recieved_raw, forward_stream, server_local, server_forward)?; | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,17 +1,10 @@ | ||||||
| use std::io::{ErrorKind, Read, Write}; | use std::io::{ErrorKind, Read, Write}; | ||||||
| use std::net::TcpListener; | use std::net::{TcpListener, TcpStream}; | ||||||
| use std::sync::mpsc; | use std::sync::mpsc::{self, TryRecvError}; | ||||||
| use std::thread; | use std::thread; | ||||||
| use std::time::Duration; | use std::time::Duration; | ||||||
| 
 | 
 | ||||||
| pub fn listen_to_client(tx: mpsc::Sender<String>, rx: mpsc::Receiver<String>, port: &str) { | fn stream_handler(tx: &mpsc::Sender<String>, rx: &mpsc::Receiver<String>, mut stream: TcpStream) { | ||||||
|     let listener = TcpListener::bind("127.0.0.1:".to_string() + port).unwrap(); |  | ||||||
|     let mut stream = listener.accept().unwrap().0; |  | ||||||
| 
 |  | ||||||
|     stream |  | ||||||
|         .set_nonblocking(true) |  | ||||||
|         .expect("Couldn't set nonblocking"); |  | ||||||
| 
 |  | ||||||
|     loop { |     loop { | ||||||
|         let mut buffer: Vec<u8> = Vec::new(); |         let mut buffer: Vec<u8> = Vec::new(); | ||||||
|         let mut buf: [u8; 1] = [0]; |         let mut buf: [u8; 1] = [0]; | ||||||
|  | @ -24,6 +17,7 @@ pub fn listen_to_client(tx: mpsc::Sender<String>, rx: mpsc::Receiver<String>, po | ||||||
|                     ErrorKind::WouldBlock => {} |                     ErrorKind::WouldBlock => {} | ||||||
|                     _ => { |                     _ => { | ||||||
|                         dbg!(_error); |                         dbg!(_error); | ||||||
|  |                         return; | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|             } |             } | ||||||
|  | @ -31,14 +25,34 @@ pub fn listen_to_client(tx: mpsc::Sender<String>, rx: mpsc::Receiver<String>, po | ||||||
|                 Ok(value) => { |                 Ok(value) => { | ||||||
|                     match stream.write_all(value.as_bytes()) { |                     match stream.write_all(value.as_bytes()) { | ||||||
|                         Ok(_) => {} |                         Ok(_) => {} | ||||||
|                         Err(_e) => println!("Couldn't send {value}"), |                         Err(_e) => { | ||||||
|  |                             dbg!(_e); | ||||||
|  |                             return; | ||||||
|  |                         } | ||||||
|                     }; |                     }; | ||||||
|                 } |                 } | ||||||
|                 Err(_e) => {} |                 Err(TryRecvError::Empty) => {}, | ||||||
|  |                 Err(TryRecvError::Disconnected) => return, | ||||||
|             } |             } | ||||||
|  |             thread::sleep(Duration::from_micros(100)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let _ = tx.send(String::from_utf8_lossy(&buffer).to_string()); |         let _ = tx.send(String::from_utf8_lossy(&buffer).to_string()); | ||||||
|         thread::sleep(Duration::from_millis(100)); |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn listen_to_client(tx: mpsc::Sender<String>, rx: mpsc::Receiver<String>, port: String) { | ||||||
|  |     let listener = TcpListener::bind("127.0.0.1:".to_string() + &port) | ||||||
|  |         .expect(&("Couldn't start listener on 127.0.0.1 port ".to_string() + &port)); | ||||||
|  |     loop { | ||||||
|  |         let (stream, ip) = listener.accept().unwrap(); | ||||||
|  |         println!("Got connection from {ip}"); | ||||||
|  | 
 | ||||||
|  |         stream | ||||||
|  |             .set_nonblocking(true) | ||||||
|  |             .expect("Couldn't set nonblocking"); | ||||||
|  | 
 | ||||||
|  |         stream_handler(&tx, &rx, stream); | ||||||
|  |         println!("Closed connection with {ip}"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										78
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								src/main.rs
									
									
									
									
									
								
							|  | @ -1,11 +1,12 @@ | ||||||
|  | use dotenv::{dotenv, vars}; | ||||||
|  | use eyre::Result; | ||||||
| use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; | use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
|  | use std::fs; | ||||||
| use std::net::{Shutdown, TcpStream}; | use std::net::{Shutdown, TcpStream}; | ||||||
| use std::sync::mpsc; | use std::sync::mpsc; | ||||||
| use std::thread; | use std::thread; | ||||||
| use std::time::Duration; | use std::time::Duration; | ||||||
| use std::{env, fs}; |  | ||||||
| use eyre::Result; |  | ||||||
| 
 | 
 | ||||||
| mod client_handler; | mod client_handler; | ||||||
| mod encryption; | mod encryption; | ||||||
|  | @ -15,13 +16,24 @@ mod server_handler; | ||||||
| mod writer_client; | mod writer_client; | ||||||
| 
 | 
 | ||||||
| fn main() -> Result<()> { | fn main() -> Result<()> { | ||||||
|     let mut args = env::args().collect::<Vec<String>>(); |     dotenv().expect("Couldn't load .env. It probably doesn't exist"); | ||||||
|  |     let mut vars_hashmap = HashMap::new(); | ||||||
| 
 | 
 | ||||||
|     let server = args[1].clone(); |     for var in vars() { | ||||||
|     let port = args[2].clone(); |         vars_hashmap.insert(var.0, var.1); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     let default_password = String::new(); |     let server = &vars_hashmap["SERVER"]; | ||||||
|     let passwd = args.pop().unwrap_or(default_password); | 
 | ||||||
|  |     let default_passwd = String::new(); | ||||||
|  | 
 | ||||||
|  |     let port = match vars_hashmap.get("PORT") { | ||||||
|  |         Some(val) => val, | ||||||
|  |         None => "6666", | ||||||
|  |     } | ||||||
|  |     .to_string(); | ||||||
|  | 
 | ||||||
|  |     let passwd = vars_hashmap.get("PASSWD").unwrap_or(&default_passwd); | ||||||
| 
 | 
 | ||||||
|     let stream = TcpStream::connect(format!("{server}:6697"))?; |     let stream = TcpStream::connect(format!("{server}:6697"))?; | ||||||
| 
 | 
 | ||||||
|  | @ -52,7 +64,7 @@ fn main() -> Result<()> { | ||||||
|     let (writer_channel_recv_tx, writer_channel_rx) = mpsc::channel(); |     let (writer_channel_recv_tx, writer_channel_rx) = mpsc::channel(); | ||||||
| 
 | 
 | ||||||
|     thread::spawn(move || { |     thread::spawn(move || { | ||||||
|         listener_server::listen_to_client(listener_channel_send_tx, listener_channel_recv_rx, &port) |         listener_server::listen_to_client(listener_channel_send_tx, listener_channel_recv_rx, port) | ||||||
|     }); |     }); | ||||||
|     let tmp_server = server.clone(); |     let tmp_server = server.clone(); | ||||||
|     thread::spawn(|| { |     thread::spawn(|| { | ||||||
|  | @ -68,16 +80,18 @@ fn main() -> Result<()> { | ||||||
| 
 | 
 | ||||||
|     loop { |     loop { | ||||||
|         match listener_channel_rx.try_recv() { |         match listener_channel_rx.try_recv() { | ||||||
|             Ok(message) => client_handler::handle_message_from_client( |             Ok(message) => { | ||||||
|                 &message, |                 let _ = client_handler::handle_message_from_client( | ||||||
|                 &public_key, |                     &message, | ||||||
|                 &server, |                     &public_key, | ||||||
|                 &mut keys, |                     server, | ||||||
|                 &writer_channel_tx, |                     &mut keys, | ||||||
|                 &writer_channel_rx, |                     &writer_channel_tx, | ||||||
|                 &listener_channel_tx, |                     &writer_channel_rx, | ||||||
|                 &listener_channel_rx, |                     &listener_channel_tx, | ||||||
|             )?, |                     &listener_channel_rx, | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|             Err(error) => match error { |             Err(error) => match error { | ||||||
|                 mpsc::TryRecvError::Empty => {} |                 mpsc::TryRecvError::Empty => {} | ||||||
|                 mpsc::TryRecvError::Disconnected => panic!("listener_channel_rx disconnected"), |                 mpsc::TryRecvError::Disconnected => panic!("listener_channel_rx disconnected"), | ||||||
|  | @ -85,24 +99,26 @@ fn main() -> Result<()> { | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         match writer_channel_rx.try_recv() { |         match writer_channel_rx.try_recv() { | ||||||
|             Ok(message) => server_handler::handle_message_from_server( |             Ok(message) => { | ||||||
|                 &message, |                 let _ = server_handler::handle_message_from_server( | ||||||
|                 &public_key, |                     &message, | ||||||
|                 &secret_key, |                     &public_key, | ||||||
|                 &server, |                     &secret_key, | ||||||
|                 &passwd, |                     server, | ||||||
|                 &mut keys, |                     passwd, | ||||||
|                 &writer_channel_tx, |                     &mut keys, | ||||||
|                 &writer_channel_rx, |                     &writer_channel_tx, | ||||||
|                 &listener_channel_tx, |                     &writer_channel_rx, | ||||||
|                 &listener_channel_rx, |                     &listener_channel_tx, | ||||||
|             )?, |                     &listener_channel_rx, | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|             Err(error) => match error { |             Err(error) => match error { | ||||||
|                 mpsc::TryRecvError::Empty => {} |                 mpsc::TryRecvError::Empty => {} | ||||||
|                 mpsc::TryRecvError::Disconnected => panic!("writer_channel_rx disconnected"), |                 mpsc::TryRecvError::Disconnected => panic!("writer_channel_rx disconnected"), | ||||||
|             }, |             }, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         thread::sleep(Duration::from_millis(100)); |         thread::sleep(Duration::from_millis(1)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,15 +1,17 @@ | ||||||
|  | use crate::unwrap_or_return_option; | ||||||
|  | use crate::unwrap_or_return_result; | ||||||
| use crate::{encryption, helpers}; | use crate::{encryption, helpers}; | ||||||
|  | use eyre::Result; | ||||||
| use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; | use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
| use std::sync::mpsc::{self, Receiver, Sender}; | use std::sync::mpsc::{self, Receiver, Sender}; | ||||||
| use eyre::Result as Result; |  | ||||||
| 
 | 
 | ||||||
| fn forward( | fn forward( | ||||||
|     message: &str, |     message: &str, | ||||||
|     listener_channel_tx: &Sender<String>, |     listener_channel_tx: &Sender<String>, | ||||||
|     server: &str, |     server: &str, | ||||||
| ) -> Result<(), mpsc::SendError<String>> { | ) -> Result<(), mpsc::SendError<String>> { | ||||||
|     listener_channel_tx.send(message.replace(&server, "127.0.0.1")) |     listener_channel_tx.send(message.replace(server, "127.0.0.1")) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn handle_message_from_server( | pub fn handle_message_from_server( | ||||||
|  | @ -24,14 +26,14 @@ pub fn handle_message_from_server( | ||||||
|     listener_channel_tx: &Sender<String>, |     listener_channel_tx: &Sender<String>, | ||||||
|     _listener_channel_rx: &Receiver<String>, |     _listener_channel_rx: &Receiver<String>, | ||||||
| ) -> Result<()> { | ) -> Result<()> { | ||||||
|     let recieved_parsed = &ircparser::parse(&recieved).unwrap()[0]; |     let recieved_parsed = &unwrap_or_return_result!(ircparser::parse(recieved))[0]; | ||||||
| 
 | 
 | ||||||
|     if recieved_parsed.command != "PRIVMSG" |     if recieved_parsed.command != "PRIVMSG" | ||||||
|         || recieved_parsed |         || recieved_parsed | ||||||
|             .params |             .params | ||||||
|             .get(0) |             .get(0) | ||||||
|             .unwrap_or(&String::new()) |             .unwrap_or(&String::new()) | ||||||
|             .starts_with("#") |             .starts_with('#') | ||||||
|     { |     { | ||||||
|         forward(recieved, listener_channel_tx, server)?; |         forward(recieved, listener_channel_tx, server)?; | ||||||
|         return Ok(()); |         return Ok(()); | ||||||
|  | @ -39,30 +41,32 @@ pub fn handle_message_from_server( | ||||||
| 
 | 
 | ||||||
|     dbg!(&recieved_parsed); |     dbg!(&recieved_parsed); | ||||||
| 
 | 
 | ||||||
|  |     let source = unwrap_or_return_option!(&recieved_parsed.source); | ||||||
|  | 
 | ||||||
|     if recieved_parsed.params[1] == "START_MESSAGE" { |     if recieved_parsed.params[1] == "START_MESSAGE" { | ||||||
|         let sender = helpers::get_nick(&recieved_parsed.source.clone().unwrap()); |         let sender = unwrap_or_return_option!(helpers::get_nick(source)); | ||||||
| 
 | 
 | ||||||
|         let message = helpers::recieve_message_base64( |         let message = helpers::recieve_message_base64( | ||||||
|             writer_channel_rx, |             writer_channel_rx, | ||||||
|             listener_channel_tx, |             listener_channel_tx, | ||||||
|             &server, |             server, | ||||||
|             "127.0.0.1", |             "127.0.0.1", | ||||||
|             &sender, |             &sender, | ||||||
|             "END_MESSAGE", |             "END_MESSAGE", | ||||||
|         )?; // Get
 |         )?; // Get
 | ||||||
|         let message = encryption::decrypt(&secret_key, message, &passwd)?; // Decrypt
 |         let message = encryption::decrypt(secret_key, &message, passwd)?; // Decrypt
 | ||||||
| 
 | 
 | ||||||
|         listener_channel_tx.send(recieved.replace("START_MESSAGE", &message))?; // Send
 |         listener_channel_tx.send(recieved.replace("START_MESSAGE", &message))?; // Send
 | ||||||
|     } else if recieved_parsed.params[1] == "START_KEY" { |     } else if recieved_parsed.params[1] == "START_KEY" { | ||||||
|         let sender = helpers::get_nick(&recieved_parsed.source.clone().unwrap()); |         let sender = unwrap_or_return_option!(helpers::get_nick(source)); | ||||||
|         let to_send = helpers::bytes_to_privmsg_base64(&public_key, &sender); |         let to_send = helpers::bytes_to_privmsg_base64(public_key, &sender); | ||||||
|         writer_channel_tx.send(to_send)?; |         writer_channel_tx.send(to_send)?; | ||||||
|         writer_channel_tx.send(format!("PRIVMSG {sender} END_KEY\r\n"))?; |         writer_channel_tx.send(format!("PRIVMSG {sender} END_KEY\r\n"))?; | ||||||
| 
 | 
 | ||||||
|         let foreign_key = helpers::recieve_message_base64( |         let foreign_key = helpers::recieve_message_base64( | ||||||
|             writer_channel_rx, |             writer_channel_rx, | ||||||
|             listener_channel_tx, |             listener_channel_tx, | ||||||
|             &server, |             server, | ||||||
|             "127.0.0.1", |             "127.0.0.1", | ||||||
|             &sender, |             &sender, | ||||||
|             "END_KEY", |             "END_KEY", | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ pub fn write_to_server( | ||||||
|                 } |                 } | ||||||
|                 Err(_error) => match _error.io_error() { |                 Err(_error) => match _error.io_error() { | ||||||
|                     None => { |                     None => { | ||||||
|                         dbg!(_error); |                         dbg!(_error.ssl_error()); | ||||||
|                     } |                     } | ||||||
|                     Some(error) => match error.kind() { |                     Some(error) => match error.kind() { | ||||||
|                         ErrorKind::WouldBlock => {} |                         ErrorKind::WouldBlock => {} | ||||||
|  | @ -51,9 +51,9 @@ pub fn write_to_server( | ||||||
|                 Ok(_) => {} |                 Ok(_) => {} | ||||||
|                 Err(_e) => println!("Couldn't send {value}"), |                 Err(_e) => println!("Couldn't send {value}"), | ||||||
|             }; |             }; | ||||||
|  |             thread::sleep(Duration::from_micros(100)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let _ = tx.send(dbg!(String::from_utf8_lossy(&buffer).to_string())); |         let _ = tx.send(dbg!(String::from_utf8_lossy(&buffer).to_string())); | ||||||
|         thread::sleep(Duration::from_millis(100)); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue