Compare commits

..

3 Commits

Author SHA1 Message Date
uelen 2dd4f21534 Manually setup rustls protocol
For some reason the default was broken and I don't know why. Also for
some reason the rustls default feature to set a default provider doesnt
work so I had to manually set that up too
2026-06-01 15:56:37 -07:00
uelen bcd9f1992d Added message + listen commands 2026-05-31 14:15:59 -07:00
uelen 0f36ee454e Add message signing
All messages are now signed by default with a randomly generated key.
TODO still is keyserver stuff, locking down the config file potentially
(or telling users to do it in the readme?), and doing any sort of
verification
2026-05-31 11:09:15 -07:00
5 changed files with 418 additions and 17 deletions
Generated
+301 -4
View File
@@ -87,12 +87,40 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
[[package]]
name = "aws-lc-rs"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00"
dependencies = [
"aws-lc-sys",
"zeroize",
]
[[package]]
name = "aws-lc-sys"
version = "0.41.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4"
dependencies = [
"cc",
"cmake",
"dunce",
"fs_extra",
]
[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "base64ct"
version = "1.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -116,6 +144,15 @@ dependencies = [
"constant_time_eq",
]
[[package]]
name = "block-buffer"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]]
name = "bumpalo"
version = "3.20.3"
@@ -135,6 +172,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
dependencies = [
"find-msvc-tools",
"jobserver",
"libc",
"shlex",
]
@@ -163,7 +202,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
dependencies = [
"cfg-if",
"cpufeatures",
"cpufeatures 0.3.0",
"rand_core 0.10.1",
]
@@ -207,6 +246,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "cmake"
version = "0.1.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
dependencies = [
"cc",
]
[[package]]
name = "colorchoice"
version = "1.0.5"
@@ -223,6 +271,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "const-oid"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]]
name = "constant_time_eq"
version = "0.1.5"
@@ -255,6 +309,15 @@ version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "cpufeatures"
version = "0.3.0"
@@ -294,6 +357,16 @@ version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crypto-common"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "ctrlc-async"
version = "3.2.2"
@@ -305,12 +378,49 @@ dependencies = [
"winapi",
]
[[package]]
name = "curve25519-dalek"
version = "4.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
dependencies = [
"cfg-if",
"cpufeatures 0.2.17",
"curve25519-dalek-derive",
"digest",
"fiat-crypto",
"rustc_version",
"subtle",
"zeroize",
]
[[package]]
name = "curve25519-dalek-derive"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "data-encoding"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
[[package]]
name = "der"
version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
dependencies = [
"const-oid",
"zeroize",
]
[[package]]
name = "deranged"
version = "0.5.8"
@@ -321,6 +431,16 @@ dependencies = [
"serde_core",
]
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]]
name = "dirs"
version = "1.0.5"
@@ -349,6 +469,38 @@ version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]]
name = "dunce"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
name = "ed25519"
version = "2.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
dependencies = [
"pkcs8",
"serde",
"signature",
]
[[package]]
name = "ed25519-dalek"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
dependencies = [
"curve25519-dalek",
"ed25519",
"rand_core 0.6.4",
"serde",
"sha2",
"subtle",
"zeroize",
]
[[package]]
name = "either"
version = "1.16.0"
@@ -397,10 +549,13 @@ dependencies = [
[[package]]
name = "fedichat"
version = "0.1.0"
source = "git+https://git.firechicken.net/fedichat/fedichat-lib#49cbd905ceecb7bf7be463f81836742e3a7ddc24"
source = "git+https://git.firechicken.net/fedichat/fedichat-lib#27cff2ced9f1879ddea03d2db3a0c5c5252b8cee"
dependencies = [
"ed25519",
"rmp-serde",
"serde",
"serde_bytes",
"thiserror 2.0.18",
"time",
"uuid",
]
@@ -412,11 +567,15 @@ dependencies = [
"clap",
"ctrlc-async",
"dotenv",
"ed25519-dalek",
"expanduser",
"fedichat",
"hickory-resolver",
"quinn",
"rand 0.8.6",
"rmp-serde",
"rustls",
"rustls-platform-verifier 0.7.0",
"serde",
"thiserror 2.0.18",
"time",
@@ -427,6 +586,12 @@ dependencies = [
"uuid",
]
[[package]]
name = "fiat-crypto"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
@@ -448,6 +613,12 @@ dependencies = [
"percent-encoding",
]
[[package]]
name = "fs_extra"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]]
name = "futures-channel"
version = "0.3.32"
@@ -499,6 +670,16 @@ dependencies = [
"slab",
]
[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "getrandom"
version = "0.1.16"
@@ -871,6 +1052,16 @@ dependencies = [
"syn",
]
[[package]]
name = "jobserver"
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
"getrandom 0.3.4",
"libc",
]
[[package]]
name = "js-sys"
version = "0.3.99"
@@ -1077,6 +1268,16 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "pkcs8"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
dependencies = [
"der",
"spki",
]
[[package]]
name = "portable-atomic"
version = "1.13.1"
@@ -1182,7 +1383,7 @@ dependencies = [
"rustc-hash",
"rustls",
"rustls-pki-types",
"rustls-platform-verifier",
"rustls-platform-verifier 0.6.2",
"slab",
"thiserror 2.0.18",
"tinyvec",
@@ -1225,13 +1426,24 @@ version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "rand"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
"libc",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
dependencies = [
"rand_chacha",
"rand_chacha 0.9.0",
"rand_core 0.9.5",
]
@@ -1246,6 +1458,16 @@ dependencies = [
"rand_core 0.10.1",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
@@ -1256,6 +1478,15 @@ dependencies = [
"rand_core 0.9.5",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom 0.2.17",
]
[[package]]
name = "rand_core"
version = "0.9.5"
@@ -1369,6 +1600,8 @@ version = "0.23.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
dependencies = [
"aws-lc-rs",
"log",
"once_cell",
"ring",
"rustls-pki-types",
@@ -1420,6 +1653,27 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "rustls-platform-verifier"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0"
dependencies = [
"core-foundation 0.10.1",
"core-foundation-sys",
"jni 0.22.4",
"log",
"once_cell",
"rustls",
"rustls-native-certs",
"rustls-platform-verifier-android",
"rustls-webpki",
"security-framework",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.61.2",
]
[[package]]
name = "rustls-platform-verifier-android"
version = "0.1.1"
@@ -1432,6 +1686,7 @@ version = "0.103.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
dependencies = [
"aws-lc-rs",
"ring",
"rustls-pki-types",
"untrusted",
@@ -1558,6 +1813,17 @@ dependencies = [
"serde_core",
]
[[package]]
name = "sha2"
version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures 0.2.17",
"digest",
]
[[package]]
name = "sharded-slab"
version = "0.1.7"
@@ -1583,6 +1849,15 @@ dependencies = [
"libc",
]
[[package]]
name = "signature"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [
"rand_core 0.6.4",
]
[[package]]
name = "simd_cesu8"
version = "1.1.1"
@@ -1627,6 +1902,16 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "spki"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
dependencies = [
"base64ct",
"der",
]
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
@@ -1923,6 +2208,12 @@ dependencies = [
"tracing-log",
]
[[package]]
name = "typenum"
version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
[[package]]
name = "unicode-ident"
version = "1.0.24"
@@ -1983,6 +2274,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
version = "2.5.0"
+4
View File
@@ -21,3 +21,7 @@ time = { version = "0.3.47", features = ["serde"] }
hickory-resolver = "0.26.1"
expanduser = "1.2.2"
uuid = { version = "1.23.2", features = ["v4"] }
ed25519-dalek = { version = "2.2.0", features = ["rand_core", "serde"] }
rand = "0.8"
rustls = {version = "0.23.40" }
rustls-platform-verifier = "0.7.0"
+21 -3
View File
@@ -1,4 +1,5 @@
use clap::{Parser,Subcommand,ArgAction};
use ed25519_dalek::SigningKey;
use fedichat::client::{ClientMessage,SignedClientMessage,AuthMethod};
use fedichat::ServerAddr;
use fedichat::state::StatePath;
@@ -29,7 +30,7 @@ pub struct Args {
pub verbose: u8,
}
#[derive(Subcommand,Debug)]
#[derive(Subcommand,Debug,Clone)]
pub enum Command {
CreateUser {
#[clap(short, long)]
@@ -49,6 +50,12 @@ pub enum Command {
#[clap(short, long, value_parser=Room::from_str)]
room: Room,
},
GetMessages {
#[clap(short, long, default_value_t = 100)]
count: u64,
#[clap(value_parser=Room::from_str)]
room: Room
},
Join {
#[clap(value_parser=Room::from_str)]
room: Room,
@@ -62,7 +69,7 @@ pub enum Command {
room: Room,
},
Listen {
#[clap(short, long, value_parser=Room::from_str)]
#[clap(value_parser=Room::from_str)]
room: Room,
},
Upload {
@@ -122,6 +129,10 @@ impl Command {
Listen {
room,
} => (ClientMessage::SubscribeMessages{room_id: room.get_coord()},room.get_server()),
GetMessages {
room,
count
} => (ClientMessage::FetchMessages{room_id: room.get_coord(), count, end: fedichat::message::MessageId(i64::MAX as u64)},room.get_server()),
Join {
room,
} => (ClientMessage::RoomJoin{room_id: room.get_coord()},room.get_server()),
@@ -181,7 +192,7 @@ impl Command {
}
// If a command needs multiple messages, like an auth message first
// then call this
pub fn generate_messages(self,username: String,token: Option<String>)
pub fn generate_messages(self,username: String,token: Option<String>, key: SigningKey)
-> Result<Vec<SignedClientMessage>,MessageError>
{
let mut messages = Vec::with_capacity(2);
@@ -211,6 +222,11 @@ impl Command {
signature: Box::new([0])});
}
// sign all the messages
for message in messages.iter_mut() {
message.sign(key.clone())?;
}
Ok(messages)
}
}
@@ -223,6 +239,8 @@ pub enum MessageError {
UuidError(#[from] uuid::Error),
#[error("Error during file IO: {0}")]
IoError(#[from] std::io::Error),
#[error("Error while processing signature: {0}")]
Signature(#[from] fedichat::client::SignatureError)
}
+41 -5
View File
@@ -1,4 +1,6 @@
use expanduser::expanduser;
use rand::rngs::OsRng;
use ed25519_dalek::SigningKey;
use serde::{Serialize,Deserialize};
use std::collections::HashMap;
use std::fs::File;
@@ -62,14 +64,41 @@ impl Config {
pub fn insert_token(&mut self,server: &String,username: String, token: String) -> Result<(),ConfigError> {
let _ = self.servers.get_mut(server).ok_or(ConfigError::ServerNotFound(server.clone()))?
.users.insert(username,token);
.users.get_mut(&username).ok_or(ConfigError::UserNotFound(username.clone()))?.token = Some(token);
Ok(())
}
pub fn get_token(&self,server: &String, username: &String) -> Result<Option<String>,ConfigError> {
// TODO: Dont really have to clone the return value probably. Should refactor at some point
Ok(self.servers.get(server).ok_or(ConfigError::ServerNotFound(server.clone()))?
.users.get(username).cloned())
.users.get(username).ok_or(ConfigError::UserNotFound(username.clone()))?.token.clone())
}
// Set up key if user does not exist
//
// If user does exist they are guaranteed to already have a key
//
// Maybe at some point there should be a command to load/save/regenerate keys
pub fn maybe_gen_key(&mut self, server: &String, username: &String) -> Result<(),ConfigError>{
if !self.servers.contains_key(server) {
self.servers.insert(server.to_string(),Server{users: HashMap::new()});
}
let server = self.servers.get_mut(server).ok_or(ConfigError::ServerNotFound(server.clone()))?;
if !server.users.contains_key(username) {
let mut rng = OsRng;
let key = SigningKey::generate(&mut rng);
server.users.insert(username.to_string(),User{token: None, key});
}
Ok(())
}
pub fn get_key(&self,server: &String, username: &String) -> Result<SigningKey,ConfigError>{
Ok(self.servers.get(server).ok_or(ConfigError::ServerNotFound(server.clone()))?
.users.get(username).ok_or(ConfigError::UserNotFound(username.clone()))?.key.clone())
}
}
@@ -78,7 +107,14 @@ impl Config {
#[derive(Serialize,Deserialize)]
pub struct Server {
// user to token mapping
users: HashMap<String,String>
users: HashMap<String,User>
}
// NOTE: Storing keys in the config file means we need to lock down read access
#[derive(Serialize,Deserialize,Clone)]
pub struct User {
pub token: Option<String>,
pub key: ed25519_dalek::SigningKey
}
#[derive(Error,Debug)]
@@ -91,8 +127,8 @@ pub enum ConfigError {
#[error("Error while serializing config file: {0}")]
SerError(#[from] toml::ser::Error),
//#[error("User `{0}` not found in config")]
//UserNotFound(String),
#[error("User `{0}` not found in config")]
UserNotFound(String),
#[error("Server `{0}` not found in config")]
ServerNotFound(String),
+50 -4
View File
@@ -11,10 +11,15 @@ use hickory_resolver::Resolver;
use std::net::{IpAddr,SocketAddr};
use std::fs::File;
use std::io::Write;
use std::time::Duration;
use std::sync::Arc;
use quinn::Endpoint;
use quinn::TransportConfig;
use quinn::crypto::rustls::QuicClientConfig;
use rmp_serde::encode::Serializer;
use serde::Serialize;
use tracing::{instrument,debug,Level};
use rustls_platform_verifier::{BuilderVerifierExt};
const CLIENT_ADDR: SocketAddr = SocketAddr::new(IpAddr::V6(std::net::Ipv6Addr::UNSPECIFIED), 0);
const PORT: u16 = 53512;
@@ -57,10 +62,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Err(e) => return Err(Box::new(e).into())
};
// set homeserver
let target_server = match cli.server {
Some(s) => s,
None => config.default_server.clone()
};
// Generate a key for the specified user if they do not already exist
config.maybe_gen_key(&target_server,&cli.username)?;
let token = config.get_token(&target_server,&cli.username)?;
debug!("Target server is {target_server}");
@@ -70,8 +78,26 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let response = resolver.lookup_ip(&target_server).await.unwrap().iter()
.next().expect("DNS lookup of server failed");
debug!("Found address {response}");
// create connection
let client_config = quinn::ClientConfig::try_with_platform_verifier().unwrap();
let mut transport_config: TransportConfig = TransportConfig::default();
transport_config.keep_alive_interval(Some(Duration::from_secs(1)));
let provider = rustls::crypto::aws_lc_rs::default_provider();
let mut client_crypto = rustls::ClientConfig::builder_with_provider(Arc::new(provider))
.with_protocol_versions(&[&rustls::version::TLS13])?
.with_platform_verifier()?
.with_no_client_auth();
client_crypto.enable_early_data = true;
client_crypto.alpn_protocols = vec![b"fedichatv0".to_vec()];
let mut client_config = quinn::ClientConfig::new(Arc::new(QuicClientConfig::try_from(client_crypto)?));
client_config.transport_config(Arc::new(transport_config));
let endpoint = Endpoint::client(CLIENT_ADDR)?;
let connection = endpoint.connect_with(
client_config,
@@ -84,8 +110,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
file_to_write = Some(file.clone());
}
let key = config.get_key(&target_server,&cli.username)?;
let command = cli.command.clone();
// send messages, each time waiting for a response
let messages = cli.command.generate_messages(cli.username.clone(),token)?;
let messages = cli.command.generate_messages(cli.username.clone(),token,key)?;
debug!("Sending commands");
@@ -121,10 +151,26 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
},
_ => {}
}
}
if let Command::Listen{..} = command {
loop {
debug!("Receiving post");
let mut recv = connection.accept_uni().await?;
debug!("Connection established");
let received = recv.read_to_end(1000 * 1000).await?;
debug!("Message read");
debug!("BYTES: {:?}",received);
response = rmp_serde::from_slice(&received)?;
debug!("Message processed");
println!("{}",format_response(response));
}
} else {
println!("{}",format_response(response));
}
// On listen specifically we will stay connected