close proxy session early if client intentionally disconnects

This commit is contained in:
Martin Michelsen
2022-10-04 23:42:49 -07:00
parent 7ffa043941
commit d5154f0a5d
3 changed files with 13 additions and 1 deletions
+8 -1
View File
@@ -114,6 +114,12 @@ static HandlerResult S_invalid(shared_ptr<ServerState>,
return HandlerResult::Type::SUPPRESS;
}
static HandlerResult C_05(shared_ptr<ServerState>,
ProxyServer::LinkedSession& session, uint16_t, uint32_t, string&) {
session.close_on_disconnect = true;
return HandlerResult::Type::FORWARD;
}
static HandlerResult S_97(shared_ptr<ServerState>,
ProxyServer::LinkedSession& session, uint16_t, uint32_t flag, string&) {
// If the client has already received a 97 command, block this one and
@@ -1303,6 +1309,7 @@ static HandlerResult C_V123_A0_A1(shared_ptr<ServerState>,
// For licensed sessions, send them back to newserv's main menu instead of
// going to the remote server's ship/block select menu
session.send_to_game_server();
session.close_on_disconnect = true;
return HandlerResult::Type::SUPPRESS;
}
@@ -1316,7 +1323,7 @@ static on_command_t handlers[0x100][6][2] = {
/* 02 */ {{S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {nullptr, nullptr}},
/* 03 */ {{S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_B_03, nullptr}},
/* 04 */ {{nullptr, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {nullptr, nullptr}},
/* 05 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}},
/* 05 */ {{nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}},
/* 06 */ {{nullptr, nullptr}, {S_V123_06, C_06}, {S_V123_06, C_06}, {S_V123_06, C_06}, {S_V123_06, C_06}, {nullptr, C_06}},
/* 07 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}},
/* 08 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}},
+4
View File
@@ -469,6 +469,7 @@ ProxyServer::LinkedSession::LinkedSession(
TerminalFormat::FG_YELLOW,
TerminalFormat::FG_RED),
local_port(local_port),
close_on_disconnect(false),
remote_ip_crc(0),
enable_remote_ip_crc_patch(false),
version(version),
@@ -660,6 +661,9 @@ void ProxyServer::LinkedSession::on_error(Channel& ch, short events) {
session->send_to_game_server("The server has\ndisconnected.");
}
session->disconnect();
if (session->close_on_disconnect) {
session->server->delete_session(session->id);
}
}
}
+1
View File
@@ -45,6 +45,7 @@ public:
Channel server_channel;
uint16_t local_port;
struct sockaddr_storage next_destination;
bool close_on_disconnect;
uint8_t prev_server_command_bytes[6];
uint32_t remote_ip_crc;