|
|
@ -110,6 +110,10 @@ impl ProtoEncode for ServerResponse { |
|
|
encoder.encode_u32(CODE_FILE_SEARCH)?;
|
|
|
encoder.encode_u32(CODE_FILE_SEARCH)?;
|
|
|
response.encode(encoder)?;
|
|
|
response.encode(encoder)?;
|
|
|
},
|
|
|
},
|
|
|
|
|
|
ServerResponse::LoginResponse(ref response) => {
|
|
|
|
|
|
encoder.encode_u32(CODE_LOGIN)?;
|
|
|
|
|
|
response.encode(encoder)?;
|
|
|
|
|
|
},
|
|
|
_ => {
|
|
|
_ => {
|
|
|
unimplemented!();
|
|
|
unimplemented!();
|
|
|
},
|
|
|
},
|
|
|
@ -130,6 +134,10 @@ impl ProtoDecode for ServerResponse { |
|
|
let response = FileSearchResponse::decode(decoder)?;
|
|
|
let response = FileSearchResponse::decode(decoder)?;
|
|
|
ServerResponse::FileSearchResponse(response)
|
|
|
ServerResponse::FileSearchResponse(response)
|
|
|
},
|
|
|
},
|
|
|
|
|
|
CODE_LOGIN => {
|
|
|
|
|
|
let response = LoginResponse::decode(decoder)?;
|
|
|
|
|
|
ServerResponse::LoginResponse(response)
|
|
|
|
|
|
},
|
|
|
_ => {
|
|
|
_ => {
|
|
|
return Err(DecodeError::UnknownCodeError(code));
|
|
|
return Err(DecodeError::UnknownCodeError(code));
|
|
|
},
|
|
|
},
|
|
|
@ -289,6 +297,49 @@ impl ReadFromPacket for LoginResponse { |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl ProtoEncode for LoginResponse {
|
|
|
|
|
|
fn encode(&self, encoder: &mut ProtoEncoder) -> Result<(), io::Error> {
|
|
|
|
|
|
match *self {
|
|
|
|
|
|
LoginResponse::LoginOk { ref motd, ip, password_md5_opt: _ } => {
|
|
|
|
|
|
encoder.encode_bool(true)?;
|
|
|
|
|
|
encoder.encode_string(motd)?;
|
|
|
|
|
|
encoder.encode_ipv4_addr(ip)?;
|
|
|
|
|
|
},
|
|
|
|
|
|
LoginResponse::LoginFail { ref reason } => {
|
|
|
|
|
|
encoder.encode_bool(false)?;
|
|
|
|
|
|
encoder.encode_string(reason)?;
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
Ok(())
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl ProtoDecode for LoginResponse {
|
|
|
|
|
|
fn decode(decoder: &mut ProtoDecoder) -> Result<Self, DecodeError> {
|
|
|
|
|
|
let ok = decoder.decode_bool()?;
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
let reason = decoder.decode_string()?;
|
|
|
|
|
|
return Ok(LoginResponse::LoginFail {
|
|
|
|
|
|
reason: reason,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let motd = decoder.decode_string()?;
|
|
|
|
|
|
let ip = decoder.decode_ipv4_addr()?;
|
|
|
|
|
|
|
|
|
|
|
|
match decoder.decode_bool() {
|
|
|
|
|
|
Ok(value) => debug!("LoginResponse last field: {}", value),
|
|
|
|
|
|
Err(e) => debug!("Error reading LoginResponse field: {:?}", e),
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Ok(LoginResponse::LoginOk {
|
|
|
|
|
|
motd: motd,
|
|
|
|
|
|
ip: ip,
|
|
|
|
|
|
password_md5_opt: None,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
/*==================*
|
|
|
/*==================*
|
|
|
* PARENT MIN SPEED *
|
|
|
* PARENT MIN SPEED *
|
|
|
*==================*/
|
|
|
*==================*/
|
|
|
@ -760,4 +811,20 @@ mod tests { |
|
|
query: "foo.txt".to_string(),
|
|
|
query: "foo.txt".to_string(),
|
|
|
}))
|
|
|
}))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
|
fn roundtrip_login_ok() {
|
|
|
|
|
|
roundtrip(ServerResponse::LoginResponse(LoginResponse::LoginOk {
|
|
|
|
|
|
motd: "welcome one welcome all!".to_string(),
|
|
|
|
|
|
ip: net::Ipv4Addr::new(127, 0, 0, 1),
|
|
|
|
|
|
password_md5_opt: None,
|
|
|
|
|
|
}))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
|
fn roundtrip_login_fail() {
|
|
|
|
|
|
roundtrip(ServerResponse::LoginResponse(LoginResponse::LoginFail {
|
|
|
|
|
|
reason: "I just don't like you".to_string(),
|
|
|
|
|
|
}))
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|