X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclientiface.h;h=c09942909f8136be3dfe14dcc7e7fb050a3315f4;hb=65c09a96f41705bb8e75fc5ff4276342be91ed11;hp=5452ccddbdf5a08cb642ac35d3f4cab2adc8c129;hpb=c91f8b1d251c81dcfc398c9ca2a4d79086212839;p=minetest.git diff --git a/src/clientiface.h b/src/clientiface.h index 5452ccddb..c09942909 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -23,7 +23,8 @@ 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 #include @@ -46,96 +47,119 @@ 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; @@ -143,25 +167,34 @@ namespace con { #define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) +// Also make sure to update the ClientInterface::statenames +// array when modifying these enums + enum ClientState { CS_Invalid, 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 }; @@ -200,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), @@ -216,6 +265,7 @@ class RemoteClient m_version_minor(0), m_version_patch(0), m_full_version("unknown"), + m_deployed_compression(0), m_connection_time(getTime(PRECISION_SECONDS)) { } @@ -238,6 +288,14 @@ class RemoteClient void SetBlockNotSent(v3s16 p); void SetBlocksNotSent(std::map &blocks); + /** + * tell client about this block being modified right now. + * this information is required to requeue the block in case it's "on wire" + * while modification is processed by server + * @param p position of modified block + */ + void ResendBlockIfOnWire(v3s16 p); + s32 SendingCount() { return m_blocks_sending.size(); @@ -264,7 +322,6 @@ class RemoteClient /* List of active objects that the client knows of. - Value is dummy. */ std::set m_known_objects; @@ -284,13 +341,15 @@ 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(); - /* set version information */ void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) { m_version_major = major; @@ -317,7 +376,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; @@ -335,6 +394,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 @@ -361,6 +430,8 @@ class RemoteClient std::string m_full_version; + u16 m_deployed_compression; + /* time this client was created */ @@ -379,16 +450,16 @@ class ClientInterface { void step(float dtime); /* get list of active client id's */ - std::list getClientIDs(ClientState min_state=CS_Active); + std::vector getClientIDs(ClientState min_state=CS_Active); /* get list of client player names */ std::vector getPlayerNames(); /* send message to client */ - void send(u16 peer_id, u8 channelnum, SharedBuffer data, bool reliable); + void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable); /* send to all clients */ - void sendToAll(u16 channelnum, SharedBuffer data, bool reliable); + void sendToAll(u16 channelnum, NetworkPacket* pkt, bool reliable); /* delete a client */ void DeleteClient(u16 peer_id); @@ -417,18 +488,19 @@ 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; } @@ -439,17 +511,17 @@ 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; 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; - + static const char *statenames[]; };