|
|
@ -62,7 +62,12 @@ pub fn get_login_status(entity_gateway: &dyn EntityGateway, pkt: &Login) -> Resu |
|
|
|
let user = entity_gateway.get_user_by_name(username).ok_or(AccountStatus::InvalidUser)?;
|
|
|
|
let verified = bcrypt::verify(password, user.password.as_str()).map_err(|_err| AccountStatus::Error)?;
|
|
|
|
match verified {
|
|
|
|
true => Ok(user),
|
|
|
|
true => if user.banned {
|
|
|
|
Err(AccountStatus::Banned)
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Ok(user)
|
|
|
|
},
|
|
|
|
false => Err(AccountStatus::InvalidPassword)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -279,4 +284,47 @@ mod test { |
|
|
|
caps: 258
|
|
|
|
}))])
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_banned_user() {
|
|
|
|
struct TestData {
|
|
|
|
}
|
|
|
|
|
|
|
|
impl EntityGateway for TestData {
|
|
|
|
fn get_user_by_name(&self, name: String) -> Option<UserAccount> {
|
|
|
|
assert!(name == "testuser");
|
|
|
|
Some(UserAccount {
|
|
|
|
id: 1,
|
|
|
|
username: "testuser".to_owned(),
|
|
|
|
password: bcrypt::hash("mypassword", 5).unwrap(),
|
|
|
|
guildcard: None,
|
|
|
|
team_id: None,
|
|
|
|
banned: true,
|
|
|
|
muted_until: SystemTime::now(),
|
|
|
|
created_at: SystemTime::now(),
|
|
|
|
flags: 0,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let mut server = LoginServerState::new(TestData {});
|
|
|
|
let send = server.handle(ClientId(1), &LOGIN_PACKET).unwrap().collect::<Vec<_>>();
|
|
|
|
|
|
|
|
assert!(send == vec![
|
|
|
|
(ClientId(1), SendLoginPacket::LoginResponse(LoginResponse {
|
|
|
|
status: AccountStatus::Banned,
|
|
|
|
tag: 65536,
|
|
|
|
guildcard: 0,
|
|
|
|
team_id: 0,
|
|
|
|
session: Session {
|
|
|
|
version: [69, 108, 115, 101, 119, 97, 114, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // utf8_to_array!("Elseware", 30),
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
|
|
session_id: 0,
|
|
|
|
interserver_checksum: 0,
|
|
|
|
action: SessionAction::None,
|
|
|
|
character_slot: 0,
|
|
|
|
},
|
|
|
|
caps: 258
|
|
|
|
}))])
|
|
|
|
}
|
|
|
|
}
|