parent
96f45a48d4
commit
3406957f1b
@ -100,6 +100,15 @@ cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAdd
|
||||
m_IsEncrypted(false),
|
||||
m_LastSentDimension(dimNotSet)
|
||||
{
|
||||
// BungeeCord handling:
|
||||
// If BC is setup with ip_forward == true, it sends additional data in the login packet's ServerAddress field:
|
||||
// hostname\00ip-address\00uuid\00profile-properties-as-json
|
||||
AStringVector Params;
|
||||
if (SplitZeroTerminatedStrings(a_ServerAddress, Params) && (Params.size() == 4))
|
||||
{
|
||||
m_ServerAddress = Params[0];
|
||||
}
|
||||
|
||||
// Create the comm log file, if so requested:
|
||||
if (g_ShouldLogCommIn || g_ShouldLogCommOut)
|
||||
{
|
||||
|
@ -27,7 +27,7 @@
|
||||
cProtocolRecognizer::cProtocolRecognizer(cClientHandle * a_Client) :
|
||||
super(a_Client),
|
||||
m_Protocol(NULL),
|
||||
m_Buffer(512)
|
||||
m_Buffer(8192) // We need a larger buffer to support BungeeCord - it sends one huge packet at the start
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -869,3 +869,31 @@ void SetBEInt(char * a_Mem, Int32 a_Value)
|
||||
|
||||
|
||||
|
||||
|
||||
bool SplitZeroTerminatedStrings(const AString & a_Strings, AStringVector & a_Output)
|
||||
{
|
||||
a_Output.clear();
|
||||
size_t size = a_Strings.size();
|
||||
size_t start = 0;
|
||||
bool res = false;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
{
|
||||
if (a_Strings[i] == 0)
|
||||
{
|
||||
a_Output.push_back(a_Strings.substr(start, i - start));
|
||||
start = i + 1;
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
if (start < size)
|
||||
{
|
||||
a_Output.push_back(a_Strings.substr(start, size - start));
|
||||
res = true;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -99,6 +99,11 @@ extern int GetBEInt(const char * a_Mem);
|
||||
/// Writes four bytes to the specified memory location so that they interpret as BigEndian int
|
||||
extern void SetBEInt(char * a_Mem, Int32 a_Value);
|
||||
|
||||
/** Splits a string that has embedded \0 characters, on those characters.
|
||||
a_Output is first cleared and then each separate string is pushed back into a_Output.
|
||||
Returns true if there are at least two strings in a_Output (there was at least one \0 separator). */
|
||||
extern bool SplitZeroTerminatedStrings(const AString & a_Strings, AStringVector & a_Output);
|
||||
|
||||
/// Parses any integer type. Checks bounds and returns errors out of band.
|
||||
template <class T>
|
||||
bool StringToInteger(const AString & a_str, T & a_Num)
|
||||
|
Loading…
Reference in New Issue
Block a user