diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-11-18 15:35:22 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-11-18 15:35:22 -0300 |
| commit | 6036d4f37ad97ee1a9a830b36fb2edf9b82e3a3b (patch) | |
| tree | ce91fb0a9acd8d95fbbe58a9d19664162a30a7cf /src/login.hh | |
| parent | b101f3809e509df16c71e1415e9ebb0c687601b8 (diff) | |
| download | login-6036d4f37ad97ee1a9a830b36fb2edf9b82e3a3b.tar.gz login-6036d4f37ad97ee1a9a830b36fb2edf9b82e3a3b.zip | |
overall improvements + support STATUS requests
Diffstat (limited to 'src/login.hh')
| -rw-r--r-- | src/login.hh | 401 |
1 files changed, 0 insertions, 401 deletions
diff --git a/src/login.hh b/src/login.hh deleted file mode 100644 index aa391a1..0000000 --- a/src/login.hh +++ /dev/null @@ -1,401 +0,0 @@ -#ifndef TIBIA_LOGIN_HH_ -#define TIBIA_LOGIN_HH_ 1 - -#include "common.hh" - -// Shutdown Signal -extern int g_ShutdownSignal; - -// Time -extern int g_MonotonicTimeMS; - -// Config -extern char g_Motd[256]; -extern int g_UpdateRate; -extern int g_LoginPort; -extern int g_MaxConnections; -extern int g_LoginTimeout; -extern char g_QueryManagerHost[100]; -extern int g_QueryManagerPort; -extern char g_QueryManagerPassword[30]; - -// Buffer Utility -//============================================================================== -inline uint8 BufferRead8(const uint8 *Buffer){ - return Buffer[0]; -} - -inline uint16 BufferRead16LE(const uint8 *Buffer){ - return (uint16)Buffer[0] - | ((uint16)Buffer[1] << 8); -} - -inline uint16 BufferRead16BE(const uint8 *Buffer){ - return ((uint16)Buffer[0] << 8) - | (uint16)Buffer[1]; -} - -inline uint32 BufferRead32LE(const uint8 *Buffer){ - return (uint32)Buffer[0] - | ((uint32)Buffer[1] << 8) - | ((uint32)Buffer[2] << 16) - | ((uint32)Buffer[3] << 24); -} - -inline uint32 BufferRead32BE(const uint8 *Buffer){ - return ((uint32)Buffer[0] << 24) - | ((uint32)Buffer[1] << 16) - | ((uint32)Buffer[2] << 8) - | (uint32)Buffer[3]; -} - -inline uint64 BufferRead64LE(const uint8 *Buffer){ - return (uint64)Buffer[0] - | ((uint64)Buffer[1] << 8) - | ((uint64)Buffer[2] << 16) - | ((uint64)Buffer[3] << 24) - | ((uint64)Buffer[4] << 32) - | ((uint64)Buffer[5] << 40) - | ((uint64)Buffer[6] << 48) - | ((uint64)Buffer[7] << 56); -} - -inline uint64 BufferRead64BE(const uint8 *Buffer){ - return ((uint64)Buffer[0] << 56) - | ((uint64)Buffer[1] << 48) - | ((uint64)Buffer[2] << 40) - | ((uint64)Buffer[3] << 32) - | ((uint64)Buffer[4] << 24) - | ((uint64)Buffer[5] << 16) - | ((uint64)Buffer[6] << 8) - | (uint64)Buffer[7]; -} - -inline void BufferWrite8(uint8 *Buffer, uint8 Value){ - Buffer[0] = Value; -} - -inline void BufferWrite16LE(uint8 *Buffer, uint16 Value){ - Buffer[0] = (uint8)(Value >> 0); - Buffer[1] = (uint8)(Value >> 8); -} - -inline void BufferWrite16BE(uint8 *Buffer, uint16 Value){ - Buffer[0] = (uint8)(Value >> 8); - Buffer[1] = (uint8)(Value >> 0); -} - -inline void BufferWrite32LE(uint8 *Buffer, uint32 Value){ - Buffer[0] = (uint8)(Value >> 0); - Buffer[1] = (uint8)(Value >> 8); - Buffer[2] = (uint8)(Value >> 16); - Buffer[3] = (uint8)(Value >> 24); -} - -inline void BufferWrite32BE(uint8 *Buffer, uint32 Value){ - Buffer[0] = (uint8)(Value >> 24); - Buffer[1] = (uint8)(Value >> 16); - Buffer[2] = (uint8)(Value >> 8); - Buffer[3] = (uint8)(Value >> 0); -} - -inline void BufferWrite64LE(uint8 *Buffer, uint64 Value){ - Buffer[0] = (uint8)(Value >> 0); - Buffer[1] = (uint8)(Value >> 8); - Buffer[2] = (uint8)(Value >> 16); - Buffer[3] = (uint8)(Value >> 24); - Buffer[4] = (uint8)(Value >> 32); - Buffer[5] = (uint8)(Value >> 40); - Buffer[6] = (uint8)(Value >> 48); - Buffer[7] = (uint8)(Value >> 56); -} - -inline void BufferWrite64BE(uint8 *Buffer, uint64 Value){ - Buffer[0] = (uint8)(Value >> 56); - Buffer[1] = (uint8)(Value >> 48); - Buffer[2] = (uint8)(Value >> 40); - Buffer[3] = (uint8)(Value >> 32); - Buffer[4] = (uint8)(Value >> 24); - Buffer[5] = (uint8)(Value >> 16); - Buffer[6] = (uint8)(Value >> 8); - Buffer[7] = (uint8)(Value >> 0); -} - -struct TReadBuffer{ - uint8 *Buffer; - int Size; - int Position; - - TReadBuffer(void) : TReadBuffer(NULL, 0) {} - TReadBuffer(uint8 *Buffer, int Size) - : Buffer(Buffer), Size(Size), Position(0) {} - - bool CanRead(int Bytes){ - return (this->Position + Bytes) <= this->Size; - } - - bool Overflowed(void){ - return this->Position > this->Size; - } - - bool ReadFlag(void){ - return this->Read8() != 0x00; - } - - uint8 Read8(void){ - uint8 Result = 0; - if(this->CanRead(1)){ - Result = BufferRead8(this->Buffer + this->Position); - } - this->Position += 1; - return Result; - } - - uint16 Read16(void){ - uint16 Result = 0; - if(this->CanRead(2)){ - Result = BufferRead16LE(this->Buffer + this->Position); - } - this->Position += 2; - return Result; - } - - uint16 Read16BE(void){ - uint16 Result = 0; - if(this->CanRead(2)){ - Result = BufferRead16BE(this->Buffer + this->Position); - } - this->Position += 2; - return Result; - } - - uint32 Read32(void){ - uint32 Result = 0; - if(this->CanRead(4)){ - Result = BufferRead32LE(this->Buffer + this->Position); - } - this->Position += 4; - return Result; - } - - uint32 Read32BE(void){ - uint32 Result = 0; - if(this->CanRead(4)){ - Result = BufferRead32BE(this->Buffer + this->Position); - } - this->Position += 4; - return Result; - } - - void ReadString(char *Dest, int DestCapacity){ - int Length = (int)this->Read16(); - if(Length == 0xFFFF){ - Length = (int)this->Read32(); - } - - if(Dest != NULL && DestCapacity > 0){ - if(Length < DestCapacity && this->CanRead(Length)){ - memcpy(Dest, this->Buffer + this->Position, Length); - Dest[Length] = 0; - }else{ - Dest[0] = 0; - } - } - - this->Position += Length; - } - - void ReadBytes(uint8 *Buffer, int Count){ - if(this->CanRead(Count)){ - memcpy(Buffer, this->Buffer + this->Position, Count); - } - this->Position += Count; - } -}; - -struct TWriteBuffer{ - uint8 *Buffer; - int Size; - int Position; - - TWriteBuffer(void) : TWriteBuffer(NULL, 0) {} - TWriteBuffer(uint8 *Buffer, int Size) - : Buffer(Buffer), Size(Size), Position(0) {} - - bool CanWrite(int Bytes){ - return (this->Position + Bytes) <= this->Size; - } - - bool Overflowed(void){ - return this->Position > this->Size; - } - - void WriteFlag(bool Value){ - this->Write8(Value ? 0x01 : 0x00); - } - - void Write8(uint8 Value){ - if(this->CanWrite(1)){ - BufferWrite8(this->Buffer + this->Position, Value); - } - this->Position += 1; - } - - void Write16(uint16 Value){ - if(this->CanWrite(2)){ - BufferWrite16LE(this->Buffer + this->Position, Value); - } - this->Position += 2; - } - - void Write16BE(uint16 Value){ - if(this->CanWrite(2)){ - BufferWrite16BE(this->Buffer + this->Position, Value); - } - this->Position += 2; - } - - void Write32(uint32 Value){ - if(this->CanWrite(4)){ - BufferWrite32LE(this->Buffer + this->Position, Value); - } - this->Position += 4; - } - - void Write32BE(uint32 Value){ - if(this->CanWrite(4)){ - BufferWrite32BE(this->Buffer + this->Position, Value); - } - this->Position += 4; - } - - void WriteString(const char *String){ - int StringLength = 0; - if(String != NULL){ - StringLength = (int)strlen(String); - } - - if(StringLength < 0xFFFF){ - this->Write16((uint16)StringLength); - }else{ - this->Write16(0xFFFF); - this->Write32((uint32)StringLength); - } - - if(StringLength > 0 && this->CanWrite(StringLength)){ - memcpy(this->Buffer + this->Position, String, StringLength); - } - - this->Position += StringLength; - } - - void Rewrite16(int Position, uint16 Value){ - if((Position + 2) <= this->Position && !this->Overflowed()){ - BufferWrite16LE(this->Buffer + Position, Value); - } - } - - void Insert32(int Position, uint32 Value){ - if(Position <= this->Position){ - if(this->CanWrite(4)){ - memmove(this->Buffer + Position + 4, - this->Buffer + Position, - this->Position - Position); - BufferWrite32LE(this->Buffer + Position, Value); - } - - this->Position += 4; - } - } -}; - -// crypto.cc -//============================================================================== -typedef void RSAKey; -RSAKey *RSALoadPEM(const char *FileName); -void RSAFree(RSAKey *Key); -bool RSADecrypt(RSAKey *Key, uint8 *Data, int Size); -void XTEAEncrypt(const uint32 *Key, uint8 *Data, int Size); -void XTEADecrypt(const uint32 *Key, uint8 *Data, int Size); - -// query.cc -//============================================================================== -enum : int { - APPLICATION_TYPE_GAME = 1, - APPLICATION_TYPE_LOGIN = 2, - APPLICATION_TYPE_WEB = 3, -}; - -enum : int { - QUERY_STATUS_OK = 0, - QUERY_STATUS_ERROR = 1, - QUERY_STATUS_FAILED = 3, -}; - -struct TCharacterLoginData{ - char Name[30]; - char WorldName[30]; - int WorldAddress; - int WorldPort; -}; - -struct TQueryManagerConnection{ - int Socket; - uint8 Buffer[KB(16)]; -}; - -bool Connect(TQueryManagerConnection *Connection); -void Disconnect(TQueryManagerConnection *Connection); -bool IsConnected(TQueryManagerConnection *Connection); -TWriteBuffer PrepareQuery(TQueryManagerConnection *Connection, int QueryType); -int ExecuteQuery(TQueryManagerConnection *Connection, bool AutoReconnect, - TWriteBuffer *WriteBuffer, TReadBuffer *OutReadBuffer); -int LoginAccount(int AccountID, const char *Password, const char *IPAddress, - int MaxCharacters, int *NumCharacters, TCharacterLoginData *Characters, - int *PremiumDays); -bool InitQuery(void); -void ExitQuery(void); - -// connections.cc -//============================================================================== -enum ConnectionState{ - CONNECTION_FREE = 0, - CONNECTION_HANDSHAKE = 1, - CONNECTION_LOGIN = 2, - CONNECTION_WRITE = 3, -}; - -struct TConnection{ - ConnectionState State; - int Socket; - int StartTime; - int RWSize; - int RWPosition; - uint32 RandomSeed; - uint32 XTEA[4]; - char IPAddress[16]; - char RemoteAddress[30]; - uint8 Buffer[KB(2)]; -}; - -int ListenerBind(uint16 Port); -int ListenerAccept(int Listener, uint32 *OutAddr, uint16 *OutPort); -void CloseConnection(TConnection *Connection); -TConnection *AssignConnection(int Socket, uint32 Addr, uint16 Port); -void ReleaseConnection(TConnection *Connection); -void ProcessLoginRequest(TConnection *Connection); -void CheckConnectionInput(TConnection *Connection, int Events); -void CheckConnectionOutput(TConnection *Connection, int Events); -void CheckConnection(TConnection *Connection, int Events); -void ProcessConnections(void); -bool InitConnections(void); -void ExitConnections(void); - -TWriteBuffer PrepareResponse(TConnection *Connection); -void SendResponse(TConnection *Connection, TWriteBuffer *WriteBuffer); -void SendLoginError(TConnection *Connection, const char *Message); -void SendCharacterList(TConnection *Connection, int NumCharacters, - TCharacterLoginData *Characters, int PremiumDays); -void ProcessLoginRequest(TConnection *Connection); - -#endif //TIBIA_LOGIN_HH_ |
