X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclientiface.h;h=d2299c8796910d3c020ae34d6d388c8e40aa7797;hb=d99b6fed5517797bfafe4bbb307963967f0ca749;hp=2f265b128f6010158a023b391a65c585d5325ddd;hpb=2066655aae2022384fc12a10c04dccfd2996f0ac;p=dragonfireclient.git diff --git a/src/clientiface.h b/src/clientiface.h index 2f265b128..d2299c879 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -23,12 +23,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "serialization.h" // for SER_FMT_VER_INVALID -#include "jthread/jmutex.h" +#include "threading/mutex.h" #include "network/networkpacket.h" +#include "util/cpp11_container.h" +#include "porting.h" #include #include -#include #include class MapBlock; @@ -47,102 +48,127 @@ class EmergeManager; | Created | | | \-----------------/ - | - | -+-----------------------------+ invalid playername, password -|IN: | or denied by mod -| TOSERVER_INIT |------------------------------ -+-----------------------------+ | - | | - | Auth ok | - | | -+-----------------------------+ | -|OUT: | | -| TOCLIENT_INIT | | -+-----------------------------+ | - | | - v | - /-----------------\ | - | | | - | InitSent | | - | | | - \-----------------/ +------------------ - | | | -+-----------------------------+ +-----------------------------+ | -|IN: | |OUT: | | -| TOSERVER_INIT2 | | TOCLIENT_ACCESS_DENIED | | -+-----------------------------+ +-----------------------------+ | - | | | - v v | - /-----------------\ /-----------------\ | - | | | | | - | InitDone | | Denied | | - | | | | | - \-----------------/ \-----------------/ | - | | -+-----------------------------+ | -|OUT: | | -| TOCLIENT_MOVEMENT | | -| TOCLIENT_ITEMDEF | | -| TOCLIENT_NODEDEF | | -| TOCLIENT_ANNOUNCE_MEDIA | | -| TOCLIENT_DETACHED_INVENTORY | | -| TOCLIENT_TIME_OF_DAY | | -+-----------------------------+ | - | | - | | - | ----------------------------------- | - v | | | - /-----------------\ v | - | | +-----------------------------+ | - | DefinitionsSent | |IN: | | - | | | TOSERVER_REQUEST_MEDIA | | - \-----------------/ | TOSERVER_RECEIVED_MEDIA | | - | +-----------------------------+ | - | ^ | | - | ----------------------------------- | - | | -+-----------------------------+ | -|IN: | | -| TOSERVER_CLIENT_READY | | -+-----------------------------+ | - | async | - v mod action | -+-----------------------------+ (ban,kick) | -|OUT: | | -| TOCLIENT_MOVE_PLAYER | | -| TOCLIENT_PRIVILEGES | | -| TOCLIENT_INVENTORY_FORMSPEC | | -| UpdateCrafting | | -| TOCLIENT_INVENTORY | | -| TOCLIENT_HP (opt) | | -| TOCLIENT_BREATH | | -| TOCLIENT_DEATHSCREEN | | -+-----------------------------+ | - | | - v | - /-----------------\ | - | |------------------------------------------------------ - | Active | - | |---------------------------------- - \-----------------/ timeout | - | +-----------------------------+ - | |OUT: | - | | TOCLIENT_DISCONNECT | - | +-----------------------------+ - | | - | v -+-----------------------------+ /-----------------\ -|IN: | | | -| TOSERVER_DISCONNECT |------------------->| Disconnecting | -+-----------------------------+ | | - \-----------------/ + | depending of the incoming packet + +--------------------------------------- + v v ++-----------------------------+ +-----------------------------+ +|IN: | |IN: | +| TOSERVER_INIT_LEGACY |----- | TOSERVER_INIT | invalid playername, ++-----------------------------+ | +-----------------------------+ password (for _LEGACY), + | | | or denied by mod + | Auth ok -------------------+--------------------------------- + v v | ++-----------------------------+ +-----------------------------+ | +|OUT: | |OUT: | | +| TOCLIENT_INIT_LEGACY | | TOCLIENT_HELLO | | ++-----------------------------+ +-----------------------------+ | + | | | + | | | + v v | + /-----------------\ /-----------------\ | + | | | | | + | AwaitingInit2 |<--------- | HelloSent | | + | | | | | | + \-----------------/ | \-----------------/ | + | | | | ++-----------------------------+ | *-----------------------------* Auth fails | +|IN: | | |Authentication, depending on |-----------------+ +| TOSERVER_INIT2 | | | packet sent by client | | ++-----------------------------+ | *-----------------------------* | + | | | | + | | | Authentication | + v | | successful | + /-----------------\ | v | + | | | +-----------------------------+ | + | InitDone | | |OUT: | | + | | | | TOCLIENT_AUTH_ACCEPT | | + \-----------------/ | +-----------------------------+ | + | | | | ++-----------------------------+ --------------------- | +|OUT: | | +| TOCLIENT_MOVEMENT | | +| TOCLIENT_ITEMDEF | | +| TOCLIENT_NODEDEF | | +| TOCLIENT_ANNOUNCE_MEDIA | | +| TOCLIENT_DETACHED_INVENTORY | | +| TOCLIENT_TIME_OF_DAY | | ++-----------------------------+ | + | | + | | + | ----------------------------- | + v | | | + /-----------------\ v | + | | +-----------------------------+ | + | DefinitionsSent | |IN: | | + | | | TOSERVER_REQUEST_MEDIA | | + \-----------------/ | TOSERVER_RECEIVED_MEDIA | | + | +-----------------------------+ | + | ^ | | + | ----------------------------- | + v | ++-----------------------------+ --------------------------------+ +|IN: | | | +| TOSERVER_CLIENT_READY | v | ++-----------------------------+ +-------------------------------+ | + | |OUT: | | + v | TOCLIENT_ACCESS_DENIED_LEGAGY | | ++-----------------------------+ +-------------------------------+ | +|OUT: | | | +| TOCLIENT_MOVE_PLAYER | v | +| TOCLIENT_PRIVILEGES | /-----------------\ | +| TOCLIENT_INVENTORY_FORMSPEC | | | | +| UpdateCrafting | | Denied | | +| TOCLIENT_INVENTORY | | | | +| TOCLIENT_HP (opt) | \-----------------/ | +| TOCLIENT_BREATH | | +| TOCLIENT_DEATHSCREEN | | ++-----------------------------+ | + | | + v | + /-----------------\ async mod action (ban, kick) | + | |--------------------------------------------------------------- + ---->| Active | + | | |---------------------------------------------- + | \-----------------/ timeout v + | | | +-----------------------------+ + | | | |OUT: | + | | | | TOCLIENT_DISCONNECT | + | | | +-----------------------------+ + | | | | + | | v v + | | +-----------------------------+ /-----------------\ + | | |IN: | | | + | | | TOSERVER_DISCONNECT |------------------->| Disconnecting | + | | +-----------------------------+ | | + | | \-----------------/ + | | any auth packet which was + | | allowed in TOCLIENT_AUTH_ACCEPT + | v + | *-----------------------------* Auth +-------------------------------+ + | |Authentication, depending on | succeeds |OUT: | + | | packet sent by client |---------->| TOCLIENT_ACCEPT_SUDO_MODE | + | *-----------------------------* +-------------------------------+ + | | | + | | Auth fails /-----------------\ + | v | | + | +-------------------------------+ | SudoMode | + | |OUT: | | | + | | TOCLIENT_DENY_SUDO_MODE | \-----------------/ + | +-------------------------------+ | + | | v + | | +-----------------------------+ + | | sets password accordingly |IN: | + -------------------+-------------------------------| TOSERVER_FIRST_SRP | + +-----------------------------+ + */ namespace con { class Connection; } -#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) + +// Also make sure to update the ClientInterface::statenames +// array when modifying these enums enum ClientState { @@ -150,19 +176,25 @@ enum ClientState CS_Disconnecting, CS_Denied, CS_Created, - CS_InitSent, + CS_AwaitingInit2, + CS_HelloSent, CS_InitDone, CS_DefinitionsSent, - CS_Active + CS_Active, + CS_SudoMode }; enum ClientStateEvent { - CSE_Init, + CSE_Hello, + CSE_AuthAccept, + CSE_InitLegacy, CSE_GotInit2, CSE_SetDenied, CSE_SetDefinitionsSent, CSE_SetClientReady, + CSE_SudoSuccess, + CSE_SudoLeave, CSE_Disconnect }; @@ -201,10 +233,26 @@ class RemoteClient // u16 net_proto_version; + /* Authentication information */ + std::string enc_pwd; + bool create_player_on_auth_success; + AuthMechanism chosen_mech; + void * auth_data; + u32 allowed_auth_mechs; + u32 allowed_sudo_mechs; + + bool isSudoMechAllowed(AuthMechanism mech) + { return allowed_sudo_mechs & mech; } + bool isMechAllowed(AuthMechanism mech) + { return allowed_auth_mechs & mech; } + RemoteClient(): peer_id(PEER_ID_INEXISTENT), serialization_version(SER_FMT_VER_INVALID), net_proto_version(0), + create_player_on_auth_success(false), + chosen_mech(AUTH_MECHANISM_NONE), + auth_data(NULL), m_time_from_building(9999), m_pending_serialization_version(SER_FMT_VER_INVALID), m_state(CS_Created), @@ -217,7 +265,8 @@ class RemoteClient m_version_minor(0), m_version_patch(0), m_full_version("unknown"), - m_connection_time(getTime(PRECISION_SECONDS)) + m_deployed_compression(0), + m_connection_time(porting::getTimeS()) { } ~RemoteClient() @@ -273,18 +322,14 @@ class RemoteClient /* List of active objects that the client knows of. - Value is dummy. */ std::set m_known_objects; - ClientState getState() - { return m_state; } + ClientState getState() const { return m_state; } - std::string getName() - { return m_name; } + std::string getName() const { return m_name; } - void setName(std::string name) - { m_name = name; } + void setName(const std::string &name) { m_name = name; } /* update internal client state */ void notifyEvent(ClientStateEvent event); @@ -293,15 +338,18 @@ class RemoteClient void setPendingSerializationVersion(u8 version) { m_pending_serialization_version = version; } + void setDeployedCompressionMode(u16 byteFlag) + { m_deployed_compression = byteFlag; } + void confirmSerializationVersion() { serialization_version = m_pending_serialization_version; } /* get uptime */ - u32 uptime(); - + u64 uptime() const; /* set version information */ - void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) { + void setVersionInfo(u8 major, u8 minor, u8 patch, const std::string &full) + { m_version_major = major; m_version_minor = minor; m_version_patch = patch; @@ -309,10 +357,9 @@ class RemoteClient } /* read version information */ - u8 getMajor() { return m_version_major; } - u8 getMinor() { return m_version_minor; } - u8 getPatch() { return m_version_patch; } - std::string getVersion() { return m_full_version; } + u8 getMajor() const { return m_version_major; } + u8 getMinor() const { return m_version_minor; } + u8 getPatch() const { return m_version_patch; } private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version; @@ -326,7 +373,7 @@ class RemoteClient - A block is cleared from here when client says it has deleted it from it's memory - Key is position, value is dummy. + List of block positions. No MapBlock* is stored here because the blocks can get deleted. */ std::set m_blocks_sent; @@ -344,6 +391,16 @@ class RemoteClient */ std::map m_blocks_sending; + /* + Blocks that have been modified since last sending them. + These blocks will not be marked as sent, even if the + client reports it has received them to account for blocks + that are being modified while on the line. + + List of block positions. + */ + std::set m_blocks_modified; + /* Count of excess GotBlocks(). There is an excess amount because the client sometimes @@ -370,10 +427,12 @@ class RemoteClient std::string m_full_version; + u16 m_deployed_compression; + /* time this client was created */ - const u32 m_connection_time; + const u64 m_connection_time; }; class ClientInterface { @@ -391,13 +450,13 @@ class ClientInterface { std::vector getClientIDs(ClientState min_state=CS_Active); /* get list of client player names */ - std::vector getPlayerNames(); + const std::vector &getPlayerNames() const { return m_clients_names; } /* send message to client */ - void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable, bool deletepkt=true); + void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable); /* send to all clients */ - void sendToAll(u16 channelnum, NetworkPacket* pkt, bool reliable); + void sendToAll(NetworkPacket *pkt); /* delete a client */ void DeleteClient(u16 peer_id); @@ -426,21 +485,21 @@ class ClientInterface { /* event to update client state */ void event(u16 peer_id, ClientStateEvent event); - /* set environment */ - void setEnv(ServerEnvironment* env) - { assert(m_env == 0); m_env = env; } + /* Set environment. Do not call this function if environment is already set */ + void setEnv(ServerEnvironment *env) + { + assert(m_env == NULL); // pre-condition + m_env = env; + } static std::string state2Name(ClientState state); protected: //TODO find way to avoid this functions - void Lock() - { m_clients_mutex.Lock(); } - void Unlock() - { m_clients_mutex.Unlock(); } + void lock() { m_clients_mutex.lock(); } + void unlock() { m_clients_mutex.unlock(); } - std::map& getClientList() - { return m_clients; } + UNORDERED_MAP& getClientList() { return m_clients; } private: /* update internal player list */ @@ -448,14 +507,14 @@ class ClientInterface { // Connection con::Connection* m_con; - JMutex m_clients_mutex; + Mutex m_clients_mutex; // Connected clients (behind the con mutex) - std::map m_clients; + UNORDERED_MAP m_clients; std::vector m_clients_names; //for announcing masterserver // Environment ServerEnvironment *m_env; - JMutex m_env_mutex; + Mutex m_env_mutex; float m_print_info_timer;