Fix Option<T> parsing and add actual UUIDs
This commit is contained in:
parent
8227b5d4f0
commit
be6eb595a5
42
Cargo.lock
generated
42
Cargo.lock
generated
@ -189,6 +189,7 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
"uuid",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -330,6 +331,18 @@ dependencies = [
|
|||||||
"slab",
|
"slab",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"wasi 0.13.3+wasi-0.2.2",
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gimli"
|
name = "gimli"
|
||||||
version = "0.31.1"
|
version = "0.31.1"
|
||||||
@ -426,7 +439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
|
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"wasi",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -909,6 +922,15 @@ version = "0.2.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uuid"
|
||||||
|
version = "1.13.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "valuable"
|
name = "valuable"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -921,6 +943,15 @@ version = "0.11.0+wasi-snapshot-preview1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.13.3+wasi-0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
|
||||||
|
dependencies = [
|
||||||
|
"wit-bindgen-rt",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
@ -1033,3 +1064,12 @@ checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wit-bindgen-rt"
|
||||||
|
version = "0.33.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
]
|
||||||
|
@ -37,3 +37,4 @@ toml = "0.8.19"
|
|||||||
tracing = { version = "0.1.37", features = ["log"] }
|
tracing = { version = "0.1.37", features = ["log"] }
|
||||||
tracing-subscriber = { version = "0.3.17", features = ["tracing-log"] }
|
tracing-subscriber = { version = "0.3.17", features = ["tracing-log"] }
|
||||||
tracing-appender = "0.2.2"
|
tracing-appender = "0.2.2"
|
||||||
|
uuid = { version = "1.13.1", features = ["v4"] }
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
// Inspired by https://github.com/iceiix/stevenarella.
|
// Inspired by https://github.com/iceiix/stevenarella.
|
||||||
|
|
||||||
|
use tracing::trace;
|
||||||
|
|
||||||
/// Enum representation of a packet's direction.
|
/// Enum representation of a packet's direction.
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum PacketDirection {
|
pub enum PacketDirection {
|
||||||
@ -62,7 +64,9 @@ macro_rules! packets {
|
|||||||
ClientState::Disconnected => false,
|
ClientState::Disconnected => false,
|
||||||
}
|
}
|
||||||
})(packet_body)?;
|
})(packet_body)?;
|
||||||
|
trace!("Parsing packet: {:?} {:?} {:02x} ({} bytes)", direction, client_state, *packet_id, packet_body.len());
|
||||||
let (_, packet) = Packet::body_parser(client_state, direction, packet_id)(packet_body)?;
|
let (_, packet) = Packet::body_parser(client_state, direction, packet_id)(packet_body)?;
|
||||||
|
// trace!("Parsed packet: {:?}", packet);
|
||||||
Ok((input, packet))
|
Ok((input, packet))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,24 +114,13 @@ pub trait Parsable {
|
|||||||
impl<T: Parsable + std::fmt::Debug> Parsable for Option<T> {
|
impl<T: Parsable + std::fmt::Debug> Parsable for Option<T> {
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
fn parse(data: &[u8]) -> IResult<&[u8], Self> {
|
fn parse(data: &[u8]) -> IResult<&[u8], Self> {
|
||||||
let (data, exists) = bool::parse(data)?;
|
nom::combinator::opt(T::parse)(data)
|
||||||
if exists {
|
|
||||||
let (data, thing) = T::parse(data)?;
|
|
||||||
Ok((data, Some(thing)))
|
|
||||||
} else {
|
|
||||||
Ok((data, None))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
fn serialize(&self) -> Vec<u8> {
|
fn serialize(&self) -> Vec<u8> {
|
||||||
match self {
|
match self {
|
||||||
Some(t) => {
|
Some(t) => t.serialize(),
|
||||||
let mut output = vec![];
|
None => Vec::new(),
|
||||||
output.extend(true.serialize());
|
|
||||||
output.extend(t.serialize());
|
|
||||||
output
|
|
||||||
}
|
|
||||||
None => false.serialize(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,6 +140,16 @@ impl<T: Parsable + std::fmt::Debug> Parsable for Vec<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Parsable for uuid::Uuid {
|
||||||
|
#[tracing::instrument]
|
||||||
|
fn parse(data: &[u8]) -> IResult<&[u8], Self> {
|
||||||
|
map_res(take(16usize), uuid::Uuid::from_slice)(data)
|
||||||
|
}
|
||||||
|
#[tracing::instrument]
|
||||||
|
fn serialize(&self) -> Vec<u8> {
|
||||||
|
self.as_bytes().to_vec()
|
||||||
|
}
|
||||||
|
}
|
||||||
impl Parsable for serde_json::Value {
|
impl Parsable for serde_json::Value {
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
fn parse(data: &[u8]) -> IResult<&[u8], Self> {
|
fn parse(data: &[u8]) -> IResult<&[u8], Self> {
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
use crate::protocol::parsing::{IResult, Parsable};
|
use crate::protocol::parsing::{IResult, Parsable};
|
||||||
|
pub use uuid::Uuid;
|
||||||
|
|
||||||
/// Alias for a u128.
|
// /// Alias for a u128.
|
||||||
pub type Uuid = u128;
|
// pub type Uuid = u128;
|
||||||
pub use crate::protocol::parsing::VarInt;
|
pub use crate::protocol::parsing::VarInt;
|
||||||
/// Alias for a `serde_json::Value`.
|
/// Alias for a `serde_json::Value`.
|
||||||
pub type Json = serde_json::Value;
|
pub type Json = serde_json::Value;
|
||||||
|
@ -15,6 +15,7 @@ use tokio::net::{TcpListener, ToSocketAddrs};
|
|||||||
use tokio::{sync::RwLock, task::JoinHandle};
|
use tokio::{sync::RwLock, task::JoinHandle};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{error, trace};
|
use tracing::{error, trace};
|
||||||
|
use crate::protocol::types::Uuid;
|
||||||
|
|
||||||
/// The main state and logic of the program.
|
/// The main state and logic of the program.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -270,7 +271,7 @@ impl App for Server {
|
|||||||
// TODO: Get the user from the stored database.
|
// TODO: Get the user from the stored database.
|
||||||
// TODO: Encryption/compression.
|
// TODO: Encryption/compression.
|
||||||
client.queue_packet(LoginSuccess {
|
client.queue_packet(LoginSuccess {
|
||||||
uuid: login_start.uuid.unwrap_or(0u128),
|
uuid: login_start.uuid.unwrap_or(Uuid::nil()),
|
||||||
username: login_start.name.clone(),
|
username: login_start.name.clone(),
|
||||||
properties: vec![],
|
properties: vec![],
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user