From de973723312c56a58651f12146668500697543c0 Mon Sep 17 00:00:00 2001 From: Max Audron Date: Fri, 17 Jan 2020 10:47:50 +0100 Subject: finish main parsing --- src/protocol/message/handshake.rs | 22 +++++++++++----------- src/protocol/message/handshake/types.rs | 31 ++++++++++++++----------------- 2 files changed, 25 insertions(+), 28 deletions(-) (limited to 'src/protocol/message') diff --git a/src/protocol/message/handshake.rs b/src/protocol/message/handshake.rs index 918c424..b346d8e 100644 --- a/src/protocol/message/handshake.rs +++ b/src/protocol/message/handshake.rs @@ -46,7 +46,7 @@ pub struct ClientInitReject { impl HandshakeSerialize for ClientInitReject { fn serialize(&self) -> Vec { let mut values: VariantMap = VariantMap::with_capacity(2); - values.insert("MsgProtocol::Primitive".to_string(), Variant::String("ClientInitReject".to_string())); + values.insert("MsgType".to_string(), Variant::String("ClientInitReject".to_string())); values.insert("ErrorString".to_string(), Variant::String(self.error_string.clone())); return HandshakeSerialize::serialize(&values); } @@ -66,19 +66,19 @@ impl HandshakeDeserialize for ClientInitReject { pub struct ClientInitAck { pub core_features: u32, // Flags of supported legacy features pub core_configured: bool, // If the core has already been configured - pub backend_info: VariantList, // List of VariantMaps of info on available backends - pub authenticator_info: VariantList, // List of VariantMaps of info on available authenticators + pub storage_backends: VariantList, // List of VariantMaps of info on available backends + pub authenticators: VariantList, // List of VariantMaps of info on available authenticators pub feature_list: StringList, // List of supported extended features } impl HandshakeSerialize for ClientInitAck { fn serialize(&self) -> Vec { let mut values: VariantMap = VariantMap::with_capacity(2); - values.insert("MsgProtocol::Primitive".to_string(), Variant::String("ClientInitAck".to_string())); + values.insert("MsgType".to_string(), Variant::String("ClientInitAck".to_string())); values.insert("CoreFeatures".to_string(), Variant::u32(self.core_features)); - values.insert("CoreConfigured".to_string(), Variant::bool(self.core_configured)); - values.insert("BackendInfo".to_string(), Variant::VariantList(self.backend_info.clone())); - values.insert("AuthenticatorInfo".to_string(), Variant::VariantList(self.authenticator_info.clone())); + values.insert("Configured".to_string(), Variant::bool(self.core_configured)); + values.insert("StorageBackends".to_string(), Variant::VariantList(self.storage_backends.clone())); + values.insert("Authenticators".to_string(), Variant::VariantList(self.authenticators.clone())); values.insert("FeatureList".to_string(), Variant::StringList(self.feature_list.clone())); return HandshakeSerialize::serialize(&values); } @@ -89,10 +89,10 @@ impl HandshakeDeserialize for ClientInitAck { let (len, values): (usize, VariantMap) = HandshakeDeserialize::parse(b); return (len, Self { - core_features: match_variant!(values, Variant::u32, "CoreFeatures"), - core_configured: match_variant!(values, Variant::bool, "CoreConfigured"), - backend_info: match_variant!(values, Variant::VariantList, "BackendInfo"), - authenticator_info: match_variant!(values, Variant::VariantList, "AuthenticatorInfo"), + core_features: 0x00008000, + core_configured: match_variant!(values, Variant::bool, "Configured"), + storage_backends: match_variant!(values, Variant::VariantList, "StorageBackends"), + authenticators: match_variant!(values, Variant::VariantList, "Authenticators"), feature_list: match_variant!(values, Variant::StringList, "FeatureList") }); } diff --git a/src/protocol/message/handshake/types.rs b/src/protocol/message/handshake/types.rs index d6ea346..dadd058 100644 --- a/src/protocol/message/handshake/types.rs +++ b/src/protocol/message/handshake/types.rs @@ -1,6 +1,5 @@ use std::io::Read; use std::vec::Vec; -use std::net::TcpStream; use std::convert::TryInto; use std::collections::HashMap; @@ -19,10 +18,9 @@ pub trait HandshakeDeserialize { } pub trait HandshakeQRead { - fn read(stream: &mut std::net::TcpStream, buf: &mut [u8]) -> usize; + fn read(stream: &mut T, buf: &mut [u8]) -> usize; } - pub type VariantMap = HashMap; impl HandshakeSerialize for VariantMap { @@ -38,8 +36,7 @@ impl HandshakeSerialize for VariantMap { util::insert_bytes(0, &mut res, &mut [0, 0, 0, 10]); let len: i32 = res.len().try_into().unwrap(); - util::insert_bytes(0, &mut res, &mut ((len + 4).to_be_bytes())); - println!("len: {:?}", len + 4); + util::insert_bytes(0, &mut res, &mut ((len).to_be_bytes())); return res; } @@ -54,15 +51,17 @@ impl HandshakeDeserialize for VariantMap { let ulen: usize = len as usize; loop { if (pos) >= ulen { break; } - let (nlen, name) = Variant::parse(&b[(pos)..]); + let (nlen, name) = Variant::parse(&b[pos..]); pos += nlen; - let (vlen, value) = Variant::parse(&b[(pos)..]); + let (vlen, value) = Variant::parse(&b[pos..]); pos += vlen; - if let Variant::StringUTF8(x) = name { - map.insert(x, value); - } + match name { + Variant::String(x) => map.insert(x, value), + Variant::StringUTF8(x) => map.insert(x, value), + _ => panic!() + }; } return (pos, map); @@ -70,21 +69,19 @@ impl HandshakeDeserialize for VariantMap { } impl HandshakeQRead for VariantMap { - fn read(mut s: &mut TcpStream, b: &mut [u8]) -> usize { + fn read(s: &mut T, b: &mut [u8]) -> usize { s.read(&mut b[0..4]).unwrap(); let (_, len) = i32::parse(&b[0..4]); - println!("len: {:?}", len); // Read the 00 00 00 0a VariantType bytes and discard - let mut tbuf = [0; 4]; - s.read(&mut tbuf).unwrap(); + s.read(&mut b[4..8]).unwrap(); - let mut pos = 4; + let mut pos = 8; let len: usize = len as usize; loop { if pos >= (len - 4) { break; } - pos += Variant::read(&mut s, &mut b[pos..]); - pos += Variant::read(&mut s, &mut b[(pos+4..)]); + pos += Variant::read(s, &mut b[pos..]); + pos += Variant::read(s, &mut b[pos..]); } return pos; -- cgit v1.2.3