|
@@ -12,15 +12,6 @@
|
|
|
|
|
|
using namespace Framework;
|
|
|
|
|
|
-char* randomKey(int& len)
|
|
|
-{
|
|
|
- len = 1024 + (int)(((double)rand() / RAND_MAX - 0.5) * 512);
|
|
|
- char* key = new char[len];
|
|
|
- for (int i = 0; i < len; i++)
|
|
|
- key[i] = (char)((((double)rand() / RAND_MAX) * 254) + 1);
|
|
|
- return key;
|
|
|
-}
|
|
|
-
|
|
|
GameClient::GameClient(Player* zPlayer, FCKlient* client)
|
|
|
: Thread(),
|
|
|
zPlayer(zPlayer),
|
|
@@ -299,6 +290,7 @@ Game::Game(Framework::Text name, Framework::Text worldsDir)
|
|
|
generator(0),
|
|
|
loader(0),
|
|
|
chat(0),
|
|
|
+ playerRegister(new PlayerRegister(path)),
|
|
|
totalTickTime(0),
|
|
|
tickCounter(0)
|
|
|
{
|
|
@@ -323,6 +315,7 @@ Game::~Game()
|
|
|
generator->release();
|
|
|
loader->release();
|
|
|
chat->release();
|
|
|
+ playerRegister->release();
|
|
|
}
|
|
|
|
|
|
void Game::initialize()
|
|
@@ -376,7 +369,7 @@ void Game::thread()
|
|
|
Chat::CHANNEL_INFO);
|
|
|
Datei pFile;
|
|
|
pFile.setDatei(
|
|
|
- path + "/player/" + player->zEntity()->getName());
|
|
|
+ path + "/player/" + getPlayerId(player->zEntity()->getName()));
|
|
|
pFile.erstellen();
|
|
|
if (pFile.open(Datei::Style::schreiben))
|
|
|
StaticRegistry<EntityType>::INSTANCE
|
|
@@ -558,8 +551,8 @@ void Game::api(Framework::InMemoryBuffer* zRequest, GameClient* zOrigin)
|
|
|
}
|
|
|
case 6:
|
|
|
{ // chat message
|
|
|
- short mLen = 0;
|
|
|
- chat->chatApi(zRequest, zOrigin->zEntity() , response);
|
|
|
+ chat->chatApi(zRequest, zOrigin->zEntity(), response);
|
|
|
+ break;
|
|
|
}
|
|
|
default:
|
|
|
std::cout << "received unknown api request in game with type "
|
|
@@ -635,71 +628,32 @@ bool Game::requestWorldUpdate(WorldUpdate* update)
|
|
|
|
|
|
bool Game::checkPlayer(Framework::Text name, Framework::Text secret)
|
|
|
{
|
|
|
- Datei pFile;
|
|
|
- pFile.setDatei(path + "/player/" + name + ".key");
|
|
|
- if (!pFile.existiert())
|
|
|
- {
|
|
|
- if (!secret.getLength())
|
|
|
- return 1;
|
|
|
- else
|
|
|
- {
|
|
|
- std::cout << "player " << name.getText()
|
|
|
- << " tryed to connect with an invalid secret.\n";
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
- pFile.open(Datei::Style::lesen);
|
|
|
- char* buffer = new char[(int)pFile.getSize()];
|
|
|
- pFile.lese(buffer, (int)pFile.getSize());
|
|
|
- bool eq = 1;
|
|
|
- int sLen = secret.getLength();
|
|
|
- for (int i = 0; i < pFile.getSize();
|
|
|
- i++) // !!SECURITY!! runtime should not be dependent on the position of
|
|
|
- // the first unequal character in the secret
|
|
|
- eq &= buffer[i] == (sLen > i ? secret[i] : ~buffer[i]);
|
|
|
- delete[] buffer;
|
|
|
- pFile.close();
|
|
|
- if (!eq)
|
|
|
+ if (playerRegister->checkSecret(name, secret))
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
{
|
|
|
std::cout << "player " << name.getText()
|
|
|
- << " tryed to connect with an invalid secret.\n";
|
|
|
+ << " tryed to connect with an invalid secret.\n";
|
|
|
+ return 0;
|
|
|
}
|
|
|
- return eq;
|
|
|
}
|
|
|
|
|
|
bool Game::existsPlayer(Framework::Text name)
|
|
|
{
|
|
|
- Datei pFile;
|
|
|
- pFile.setDatei(path + "/player/" + name + ".key");
|
|
|
- return pFile.existiert();
|
|
|
+ return playerRegister->hasPlayer(name);
|
|
|
}
|
|
|
|
|
|
Framework::Text Game::createPlayer(Framework::Text name)
|
|
|
{
|
|
|
- Datei pFile;
|
|
|
- pFile.setDatei(path + "/player/" + name + ".key");
|
|
|
- if (!pFile.existiert())
|
|
|
- {
|
|
|
- pFile.erstellen();
|
|
|
- int keyLen;
|
|
|
- char* key = randomKey(keyLen);
|
|
|
- pFile.open(Datei::Style::schreiben);
|
|
|
- pFile.schreibe(key, keyLen);
|
|
|
- pFile.close();
|
|
|
- Text res = "";
|
|
|
- for (int i = 0; i < keyLen; i++)
|
|
|
- res.append(key[i]);
|
|
|
- delete[] key;
|
|
|
- return res;
|
|
|
- }
|
|
|
- return "";
|
|
|
+ return playerRegister->addPlayer(name);
|
|
|
}
|
|
|
|
|
|
GameClient* Game::addPlayer(FCKlient* client, Framework::Text name)
|
|
|
{
|
|
|
cs.lock();
|
|
|
+ int id = playerRegister->getPlayerId(name);
|
|
|
Datei pFile;
|
|
|
- pFile.setDatei(path + "/player/" + name);
|
|
|
+ pFile.setDatei(path + "/player/" + id);
|
|
|
Player* player;
|
|
|
bool isNew = 0;
|
|
|
if (!pFile.existiert() || !pFile.open(Datei::Style::lesen))
|
|
@@ -872,6 +826,7 @@ void Game::save() const
|
|
|
d.open(Datei::Style::schreiben);
|
|
|
d.schreibe((char*)&nextEntityId, 4);
|
|
|
d.close();
|
|
|
+ playerRegister->save();
|
|
|
for (auto dim : *dimensions)
|
|
|
dim->save(path);
|
|
|
chat->save();
|
|
@@ -979,4 +934,9 @@ Player* Game::zPlayerByName(const char* name) const
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int Game::getPlayerId(const char* name) const
|
|
|
+{
|
|
|
+ return playerRegister->getPlayerId(name);
|
|
|
}
|