1 /* 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/>. 6 */ 7 8 /** @file network_admin.h Server part of the admin network protocol. */ 9 10 #ifndef NETWORK_ADMIN_H 11 #define NETWORK_ADMIN_H 12 13 #include "network_internal.h" 14 #include "core/tcp_listen.h" 15 #include "core/tcp_admin.h" 16 17 extern AdminIndex _redirect_console_to_admin; 18 19 class ServerNetworkAdminSocketHandler; 20 /** Pool with all admin connections. */ 21 typedef Pool<ServerNetworkAdminSocketHandler, AdminIndex, 2, MAX_ADMINS, PT_NADMIN> NetworkAdminSocketPool; 22 extern NetworkAdminSocketPool _networkadminsocket_pool; 23 24 /** Class for handling the server side of the game connection. */ 25 class ServerNetworkAdminSocketHandler : public NetworkAdminSocketPool::PoolItem<&_networkadminsocket_pool>, public NetworkAdminSocketHandler, public TCPListenHandler<ServerNetworkAdminSocketHandler, ADMIN_PACKET_SERVER_FULL, ADMIN_PACKET_SERVER_BANNED> { 26 protected: 27 NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p) override; 28 NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p) override; 29 NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) override; 30 NetworkRecvStatus Receive_ADMIN_POLL(Packet *p) override; 31 NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p) override; 32 NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p) override; 33 NetworkRecvStatus Receive_ADMIN_RCON(Packet *p) override; 34 NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p) override; 35 NetworkRecvStatus Receive_ADMIN_PING(Packet *p) override; 36 37 NetworkRecvStatus SendProtocol(); 38 NetworkRecvStatus SendPong(uint32 d1); 39 public: 40 AdminUpdateFrequency update_frequency[ADMIN_UPDATE_END]; ///< Admin requested update intervals. 41 std::chrono::steady_clock::time_point connect_time; ///< Time of connection. 42 NetworkAddress address; ///< Address of the admin. 43 44 ServerNetworkAdminSocketHandler(SOCKET s); 45 ~ServerNetworkAdminSocketHandler(); 46 47 NetworkRecvStatus SendError(NetworkErrorCode error); 48 NetworkRecvStatus SendWelcome(); 49 NetworkRecvStatus SendNewGame(); 50 NetworkRecvStatus SendShutdown(); 51 52 NetworkRecvStatus SendDate(); 53 NetworkRecvStatus SendClientJoin(ClientID client_id); 54 NetworkRecvStatus SendClientInfo(const NetworkClientSocket *cs, const NetworkClientInfo *ci); 55 NetworkRecvStatus SendClientUpdate(const NetworkClientInfo *ci); 56 NetworkRecvStatus SendClientQuit(ClientID client_id); 57 NetworkRecvStatus SendClientError(ClientID client_id, NetworkErrorCode error); 58 NetworkRecvStatus SendCompanyNew(CompanyID company_id); 59 NetworkRecvStatus SendCompanyInfo(const Company *c); 60 NetworkRecvStatus SendCompanyUpdate(const Company *c); 61 NetworkRecvStatus SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr); 62 NetworkRecvStatus SendCompanyEconomy(); 63 NetworkRecvStatus SendCompanyStats(); 64 65 NetworkRecvStatus SendChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64 data); 66 NetworkRecvStatus SendRcon(uint16 colour, const std::string_view command); 67 NetworkRecvStatus SendConsole(const std::string_view origin, const std::string_view command); 68 NetworkRecvStatus SendGameScript(const std::string_view json); 69 NetworkRecvStatus SendCmdNames(); 70 NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp); 71 NetworkRecvStatus SendRconEnd(const std::string_view command); 72 73 static void Send(); 74 static void AcceptConnection(SOCKET s, const NetworkAddress &address); 75 static bool AllowConnection(); 76 static void WelcomeAll(); 77 78 /** 79 * Get the name used by the listener. 80 * @return the name to show in debug logs and the like. 81 */ GetName()82 static const char *GetName() 83 { 84 return "admin"; 85 } 86 87 struct ServerNetworkAdminSocketHandlerFilter { operatorServerNetworkAdminSocketHandlerFilter88 bool operator() (size_t index) { return ServerNetworkAdminSocketHandler::Get(index)->GetAdminStatus() == ADMIN_STATUS_ACTIVE; } 89 }; 90 91 /** 92 * Returns an iterable ensemble of all active admin sockets 93 * @param from index of the first socket to consider 94 * @return an iterable ensemble of all active admin sockets 95 */ 96 static Pool::IterateWrapperFiltered<ServerNetworkAdminSocketHandler, ServerNetworkAdminSocketHandlerFilter> IterateActive(size_t from = 0) 97 { 98 return Pool::IterateWrapperFiltered<ServerNetworkAdminSocketHandler, ServerNetworkAdminSocketHandlerFilter>(from, ServerNetworkAdminSocketHandlerFilter{}); 99 } 100 }; 101 102 void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client = false); 103 void NetworkAdminClientUpdate(const NetworkClientInfo *ci); 104 void NetworkAdminClientQuit(ClientID client_id); 105 void NetworkAdminClientError(ClientID client_id, NetworkErrorCode error_code); 106 void NetworkAdminCompanyInfo(const Company *company, bool new_company); 107 void NetworkAdminCompanyUpdate(const Company *company); 108 void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr); 109 110 void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64 data = 0, bool from_admin = false); 111 void NetworkAdminUpdate(AdminUpdateFrequency freq); 112 void NetworkServerSendAdminRcon(AdminIndex admin_index, TextColour colour_code, const std::string_view string); 113 void NetworkAdminConsole(const std::string_view origin, const std::string_view string); 114 void NetworkAdminGameScript(const std::string_view json); 115 void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp); 116 117 #endif /* NETWORK_ADMIN_H */ 118