2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
9 * @file tcp_admin.cpp Basic functions to receive and send TCP packets to and from the admin network.
12 #include "../../stdafx.h"
14 #include "../network_internal.h"
15 #include "tcp_admin.h"
16 #include "../../debug.h"
18 #include "../../safeguards.h"
20 /* Make sure that these enums match. */
21 static_assert((int)CRR_MANUAL
== (int)ADMIN_CRR_MANUAL
);
22 static_assert((int)CRR_AUTOCLEAN
== (int)ADMIN_CRR_AUTOCLEAN
);
23 static_assert((int)CRR_BANKRUPT
== (int)ADMIN_CRR_BANKRUPT
);
24 static_assert((int)CRR_END
== (int)ADMIN_CRR_END
);
27 * Create the admin handler for the given socket.
28 * @param s The socket to communicate over.
30 NetworkAdminSocketHandler::NetworkAdminSocketHandler(SOCKET s
) : status(ADMIN_STATUS_INACTIVE
)
33 this->admin_name
[0] = '\0';
34 this->admin_version
[0] = '\0';
37 NetworkAdminSocketHandler::~NetworkAdminSocketHandler()
41 NetworkRecvStatus
NetworkAdminSocketHandler::CloseConnection(bool error
)
44 return NETWORK_RECV_STATUS_CONN_LOST
;
48 * Handle the given packet, i.e. pass it to the right parser receive command.
49 * @param p the packet to handle.
50 * @return #NetworkRecvStatus of handling.
52 NetworkRecvStatus
NetworkAdminSocketHandler::HandlePacket(Packet
*p
)
54 PacketAdminType type
= (PacketAdminType
)p
->Recv_uint8();
56 switch (this->HasClientQuit() ? INVALID_ADMIN_PACKET
: type
) {
57 case ADMIN_PACKET_ADMIN_JOIN
: return this->Receive_ADMIN_JOIN(p
);
58 case ADMIN_PACKET_ADMIN_QUIT
: return this->Receive_ADMIN_QUIT(p
);
59 case ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY
: return this->Receive_ADMIN_UPDATE_FREQUENCY(p
);
60 case ADMIN_PACKET_ADMIN_POLL
: return this->Receive_ADMIN_POLL(p
);
61 case ADMIN_PACKET_ADMIN_CHAT
: return this->Receive_ADMIN_CHAT(p
);
62 case ADMIN_PACKET_ADMIN_RCON
: return this->Receive_ADMIN_RCON(p
);
63 case ADMIN_PACKET_ADMIN_GAMESCRIPT
: return this->Receive_ADMIN_GAMESCRIPT(p
);
64 case ADMIN_PACKET_ADMIN_PING
: return this->Receive_ADMIN_PING(p
);
66 case ADMIN_PACKET_SERVER_FULL
: return this->Receive_SERVER_FULL(p
);
67 case ADMIN_PACKET_SERVER_BANNED
: return this->Receive_SERVER_BANNED(p
);
68 case ADMIN_PACKET_SERVER_ERROR
: return this->Receive_SERVER_ERROR(p
);
69 case ADMIN_PACKET_SERVER_PROTOCOL
: return this->Receive_SERVER_PROTOCOL(p
);
70 case ADMIN_PACKET_SERVER_WELCOME
: return this->Receive_SERVER_WELCOME(p
);
71 case ADMIN_PACKET_SERVER_NEWGAME
: return this->Receive_SERVER_NEWGAME(p
);
72 case ADMIN_PACKET_SERVER_SHUTDOWN
: return this->Receive_SERVER_SHUTDOWN(p
);
74 case ADMIN_PACKET_SERVER_DATE
: return this->Receive_SERVER_DATE(p
);
75 case ADMIN_PACKET_SERVER_CLIENT_JOIN
: return this->Receive_SERVER_CLIENT_JOIN(p
);
76 case ADMIN_PACKET_SERVER_CLIENT_INFO
: return this->Receive_SERVER_CLIENT_INFO(p
);
77 case ADMIN_PACKET_SERVER_CLIENT_UPDATE
: return this->Receive_SERVER_CLIENT_UPDATE(p
);
78 case ADMIN_PACKET_SERVER_CLIENT_QUIT
: return this->Receive_SERVER_CLIENT_QUIT(p
);
79 case ADMIN_PACKET_SERVER_CLIENT_ERROR
: return this->Receive_SERVER_CLIENT_ERROR(p
);
80 case ADMIN_PACKET_SERVER_COMPANY_NEW
: return this->Receive_SERVER_COMPANY_NEW(p
);
81 case ADMIN_PACKET_SERVER_COMPANY_INFO
: return this->Receive_SERVER_COMPANY_INFO(p
);
82 case ADMIN_PACKET_SERVER_COMPANY_UPDATE
: return this->Receive_SERVER_COMPANY_UPDATE(p
);
83 case ADMIN_PACKET_SERVER_COMPANY_REMOVE
: return this->Receive_SERVER_COMPANY_REMOVE(p
);
84 case ADMIN_PACKET_SERVER_COMPANY_ECONOMY
: return this->Receive_SERVER_COMPANY_ECONOMY(p
);
85 case ADMIN_PACKET_SERVER_COMPANY_STATS
: return this->Receive_SERVER_COMPANY_STATS(p
);
86 case ADMIN_PACKET_SERVER_CHAT
: return this->Receive_SERVER_CHAT(p
);
87 case ADMIN_PACKET_SERVER_RCON
: return this->Receive_SERVER_RCON(p
);
88 case ADMIN_PACKET_SERVER_CONSOLE
: return this->Receive_SERVER_CONSOLE(p
);
89 case ADMIN_PACKET_SERVER_CMD_NAMES
: return this->Receive_SERVER_CMD_NAMES(p
);
90 case ADMIN_PACKET_SERVER_CMD_LOGGING
: return this->Receive_SERVER_CMD_LOGGING(p
);
91 case ADMIN_PACKET_SERVER_RCON_END
: return this->Receive_SERVER_RCON_END(p
);
92 case ADMIN_PACKET_SERVER_PONG
: return this->Receive_SERVER_PONG(p
);
95 if (this->HasClientQuit()) {
96 DEBUG(net
, 0, "[tcp/admin] received invalid packet type %d from '%s' (%s)", type
, this->admin_name
, this->admin_version
);
98 DEBUG(net
, 0, "[tcp/admin] received illegal packet from '%s' (%s)", this->admin_name
, this->admin_version
);
101 this->CloseConnection();
102 return NETWORK_RECV_STATUS_MALFORMED_PACKET
;
107 * Do the actual receiving of packets.
108 * As long as HandlePacket returns OKAY packets are handled. Upon
109 * failure, or no more packets to process the last result of
110 * HandlePacket is returned.
111 * @return #NetworkRecvStatus of the last handled packet.
113 NetworkRecvStatus
NetworkAdminSocketHandler::ReceivePackets()
116 while ((p
= this->ReceivePacket()) != nullptr) {
117 NetworkRecvStatus res
= this->HandlePacket(p
);
119 if (res
!= NETWORK_RECV_STATUS_OKAY
) return res
;
122 return NETWORK_RECV_STATUS_OKAY
;
126 * Helper for logging receiving invalid packets.
127 * @param type The received packet type.
128 * @return The status the network should have, in this case: "malformed packet error".
130 NetworkRecvStatus
NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminType type
)
132 DEBUG(net
, 0, "[tcp/admin] received illegal packet type %d from admin %s (%s)", type
, this->admin_name
, this->admin_version
);
133 return NETWORK_RECV_STATUS_MALFORMED_PACKET
;
136 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN
); }
137 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT
); }
138 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY
); }
139 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL
); }
140 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT
); }
141 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON
); }
142 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT
); }
143 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING
); }
145 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL
); }
146 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED
); }
147 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR
); }
148 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL
); }
149 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME
); }
150 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME
); }
151 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN
); }
153 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE
); }
154 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN
); }
155 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO
); }
156 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE
); }
157 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT
); }
158 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR
); }
159 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW
); }
160 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO
); }
161 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE
); }
162 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE
); }
163 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY
); }
164 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS
); }
165 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT
); }
166 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON
); }
167 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE
); }
168 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES
); }
169 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING
); }
170 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END
); }
171 NetworkRecvStatus
NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet
*p
) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG
); }