|
@@ -2,86 +2,51 @@
|
|
|
#include <iostream>
|
|
|
#include <Klient.h>
|
|
|
#include <Globals.h>
|
|
|
+#include <HttpRequest.h>
|
|
|
+#include <JSON.h>
|
|
|
|
|
|
// Inhalt der LoginServer Klasse aus LoginServer.h
|
|
|
// Konstruktor
|
|
|
FactoryCraftServer::FactoryCraftServer( InitDatei *zIni )
|
|
|
- : Thread()
|
|
|
+ : ReferenceCounter()
|
|
|
{
|
|
|
Network::Start( 100 );
|
|
|
- std::cout << "FC: Verbindung mit Datenbank wird hergestellt...\n";
|
|
|
- db = new LSDatenbank( zIni );
|
|
|
klientAnzahl = 0;
|
|
|
klients = new RCArray< FCKlient >();
|
|
|
empfangen = 0;
|
|
|
gesendet = 0;
|
|
|
- fehler = new Text();
|
|
|
ini = dynamic_cast<InitDatei *>( zIni->getThis() );
|
|
|
id = *zIni->zWert( "ServerId" );
|
|
|
- server = new Server();
|
|
|
- aServer = new SSLServer();
|
|
|
- aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
|
|
|
- aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
|
|
|
- aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
|
|
|
- std::cout << "FC: Starten des Admin Servers...\n";
|
|
|
- if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
|
|
|
- {
|
|
|
- std::cout << "FC: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
|
|
|
- exit( 1 );
|
|
|
- }
|
|
|
- db->setServerStatus( id, 2 );
|
|
|
- end = 0;
|
|
|
- nichtPausiert = 0;
|
|
|
+ server = new SSLServer();
|
|
|
+ server->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
|
|
|
+ server->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
|
|
|
+ server->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
|
|
|
+ game = new Game( zIni->zWert( "World" )->getText(), zIni->zWert( "SaveDir" )->getText() );
|
|
|
InitializeCriticalSection( &cs );
|
|
|
- if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
|
|
|
- {
|
|
|
- serverStarten();
|
|
|
- serverFortsetzen();
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
// Destruktor
|
|
|
FactoryCraftServer::~FactoryCraftServer()
|
|
|
{
|
|
|
- fehler->release();
|
|
|
server->trenne();
|
|
|
server->release();
|
|
|
- aServer->trenne();
|
|
|
- aServer->release();
|
|
|
if( klients )
|
|
|
klients->release();
|
|
|
ini->release();
|
|
|
- db->release();
|
|
|
+ game->requestStop();
|
|
|
+ game->release();
|
|
|
DeleteCriticalSection( &cs );
|
|
|
}
|
|
|
|
|
|
// nicht constant
|
|
|
-void FactoryCraftServer::runn()
|
|
|
-{
|
|
|
- while( !end && aServer->isConnected() )
|
|
|
- {
|
|
|
- SSLSKlient *klient;
|
|
|
- klient = aServer->getKlient();
|
|
|
- if( end && klient )
|
|
|
- {
|
|
|
- klient->trenne();
|
|
|
- klient = (SSLSKlient *)klient->release();
|
|
|
- Sleep( 1000 );
|
|
|
- return;
|
|
|
- }
|
|
|
- if( !klient )
|
|
|
- continue;
|
|
|
- FCAKlient *clHandle = new FCAKlient( klient, dynamic_cast<FactoryCraftServer *>( getThis() ) );
|
|
|
- clHandle->start();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void FactoryCraftServer::thread()
|
|
|
+void FactoryCraftServer::run()
|
|
|
{
|
|
|
+ if( server )
|
|
|
+ server->release();
|
|
|
+ server->verbinde( (unsigned short)TextZuInt( ini->zWert( "SSLPort" )->getText(), 10 ), 10 );
|
|
|
while( server->isConnected() )
|
|
|
{
|
|
|
- SKlient *klient;
|
|
|
- klient = server->getKlient();
|
|
|
+ SSLSKlient *klient = server->getKlient();
|
|
|
if( !klient )
|
|
|
continue;
|
|
|
Framework::getThreadRegister()->cleanUpClosedThreads();
|
|
@@ -96,121 +61,22 @@ void FactoryCraftServer::thread()
|
|
|
|
|
|
void FactoryCraftServer::close()
|
|
|
{
|
|
|
- db->setServerStatus( id, 1 );
|
|
|
server->trenne();
|
|
|
-#ifdef WIN32
|
|
|
- warteAufThread( 1000 );
|
|
|
-#endif
|
|
|
EnterCriticalSection( &cs );
|
|
|
for( int i = 0; i < klientAnzahl; i++ )
|
|
|
klients->z( i )->absturz();
|
|
|
klients = ( RCArray< FCKlient > * )klients->release();
|
|
|
klientAnzahl = 0;
|
|
|
LeaveCriticalSection( &cs );
|
|
|
- ende();
|
|
|
- run = 0;
|
|
|
- end = 1;
|
|
|
- Klient *klient = new Klient();
|
|
|
- klient->verbinde( aServer->getPort(), "127.0.0.1" );
|
|
|
- Sleep( 500 );
|
|
|
- aServer->trenne();
|
|
|
- klient->release();
|
|
|
}
|
|
|
|
|
|
-bool FactoryCraftServer::serverStarten()
|
|
|
-{
|
|
|
- if( nichtPausiert )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if( server )
|
|
|
- server->release();
|
|
|
- server = new Server();
|
|
|
- if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
|
|
|
- {
|
|
|
- nichtPausiert = 1;
|
|
|
- start();
|
|
|
- return 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- serverBeenden();
|
|
|
- fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-bool FactoryCraftServer::serverPause()
|
|
|
-{
|
|
|
- if( !nichtPausiert )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if( !db->setServerStatus( id, 2 ) )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht pausiert werden: " );
|
|
|
- fehler->append( db->getLetzterFehler() );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-bool FactoryCraftServer::serverFortsetzen()
|
|
|
-{
|
|
|
- if( !nichtPausiert )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if( !db->setServerStatus( id, 3 ) )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
|
|
|
- fehler->append( db->getLetzterFehler() );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-bool FactoryCraftServer::serverBeenden()
|
|
|
-{
|
|
|
- if( !nichtPausiert )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if( db->serverIstNichtPausiert( id ) )
|
|
|
- {
|
|
|
- fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- nichtPausiert = 0;
|
|
|
- ende();
|
|
|
- if( server )
|
|
|
- server->trenne();
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-bool FactoryCraftServer::setMaxKlients( int mc )
|
|
|
-{
|
|
|
- if( !db->setMaxClients( id, mc ) )
|
|
|
- {
|
|
|
- fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
|
|
|
- fehler->append( db->getLetzterFehler() );
|
|
|
- return 0;
|
|
|
- }
|
|
|
- ini->setWert( "MaxClients", Text() += mc );
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-bool FactoryCraftServer::absturzKlient( int klientId )
|
|
|
+bool FactoryCraftServer::absturzKlient( int accountId )
|
|
|
{
|
|
|
bool gefunden = 0;
|
|
|
EnterCriticalSection( &cs );
|
|
|
for( int i = 0; i < klientAnzahl; i++ )
|
|
|
{
|
|
|
- if( klients->z( i ) && klients->z( i )->getKlientNummer() == klientId )
|
|
|
+ if( klients->z( i ) && klients->z( i )->getAccountId() == accountId )
|
|
|
{
|
|
|
klients->z( i )->absturz();
|
|
|
klients->remove( i );
|
|
@@ -251,346 +117,32 @@ void FactoryCraftServer::addEmpfangen( int bytes )
|
|
|
empfangen += bytes;
|
|
|
}
|
|
|
|
|
|
-// constant
|
|
|
-bool FactoryCraftServer::istAn() const
|
|
|
-{
|
|
|
- return db->serverIstNichtPausiert( id );
|
|
|
-}
|
|
|
-
|
|
|
-Server *FactoryCraftServer::zServer() const
|
|
|
-{
|
|
|
- return server;
|
|
|
-}
|
|
|
-
|
|
|
-LSDatenbank *FactoryCraftServer::zDB() const
|
|
|
-{
|
|
|
- return db;
|
|
|
-}
|
|
|
-
|
|
|
bool FactoryCraftServer::hatClients() const
|
|
|
{
|
|
|
return klientAnzahl > 0;
|
|
|
}
|
|
|
|
|
|
-int FactoryCraftServer::getId() const
|
|
|
-{
|
|
|
- return id;
|
|
|
-}
|
|
|
-
|
|
|
-char *FactoryCraftServer::getLetzterFehler() const
|
|
|
-{
|
|
|
- return fehler->getText();
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-// Inhalt der LSAKlient Klasse aus LoginServer.h
|
|
|
-// Konstruktor
|
|
|
-FCAKlient::FCAKlient( SSLSKlient *klient, FactoryCraftServer *ls )
|
|
|
- : Thread()
|
|
|
-{
|
|
|
- this->klient = klient;
|
|
|
- name = new Text( "" );
|
|
|
- passwort = new Text( "" );
|
|
|
- adminId = 0;
|
|
|
- version = 0;
|
|
|
- this->ls = ls;
|
|
|
-}
|
|
|
-
|
|
|
-// Destruktor
|
|
|
-FCAKlient::~FCAKlient()
|
|
|
-{
|
|
|
- klient->trenne();
|
|
|
- klient->release();
|
|
|
- ls->release();
|
|
|
- name->release();
|
|
|
- passwort->release();
|
|
|
-}
|
|
|
-
|
|
|
-// nicht constant
|
|
|
-void FCAKlient::thread()
|
|
|
-{
|
|
|
- while( 1 )
|
|
|
- {
|
|
|
- char c = 0;
|
|
|
- if( !klient->getNachricht( &c, 1 ) )
|
|
|
- break;
|
|
|
- else
|
|
|
- {
|
|
|
- bool br = 0;
|
|
|
- switch( c )
|
|
|
- {
|
|
|
- case 1: // Login
|
|
|
- if( 1 )
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- unsigned char nLen = 0;
|
|
|
- klient->getNachricht( (char *)&nLen, 1 );
|
|
|
- char *n = new char[ nLen + 1 ];
|
|
|
- n[ (int)nLen ] = 0;
|
|
|
- if( nLen )
|
|
|
- klient->getNachricht( n, nLen );
|
|
|
- unsigned char pLen = 0;
|
|
|
- klient->getNachricht( (char *)&pLen, 1 );
|
|
|
- char *p = new char[ pLen + 1 ];
|
|
|
- p[ (int)pLen ] = 0;
|
|
|
- if( pLen )
|
|
|
- klient->getNachricht( p, pLen );
|
|
|
- int adminId = ls->zDB()->istAdministrator( n, p );
|
|
|
- if( adminId )
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- name->setText( n );
|
|
|
- passwort->setText( p );
|
|
|
- this->adminId = adminId;
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Falsche Kombination aus Name und Passwort." );
|
|
|
- delete[] n;
|
|
|
- delete[] p;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2: // Logout
|
|
|
- adminId = 0;
|
|
|
- name->setText( "" );
|
|
|
- passwort->setText( "" );
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- break;
|
|
|
- case 3: // Trennen
|
|
|
- br = 1;
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- break;
|
|
|
- case 4: // Server starten
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSStarten ) )
|
|
|
- {
|
|
|
- if( !ls->serverStarten() )
|
|
|
- {
|
|
|
- Text *err = new Text();
|
|
|
- err->append( ls->getLetzterFehler() );
|
|
|
- errorZuKlient( err->getText() );
|
|
|
- err->release();
|
|
|
- }
|
|
|
- else
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 5: // Server beenden
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
|
|
|
- {
|
|
|
- if( ls->serverBeenden() )
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- else
|
|
|
- {
|
|
|
- Text *err = new Text();
|
|
|
- err->append( ls->getLetzterFehler() );
|
|
|
- errorZuKlient( err->getText() );
|
|
|
- err->release();
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 6: // Programm Schließen
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- bool ok = 0;
|
|
|
- if( ls->isRunning() )
|
|
|
- {
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
|
|
|
- {
|
|
|
- if( ls->serverBeenden() )
|
|
|
- ok = 1;
|
|
|
- else
|
|
|
- {
|
|
|
- Text *err = new Text();
|
|
|
- err->append( ls->getLetzterFehler() );
|
|
|
- errorZuKlient( err->getText() );
|
|
|
- err->release();
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
|
|
|
- }
|
|
|
- else
|
|
|
- ok = 1;
|
|
|
- if( ok && ls->hatClients() )
|
|
|
- {
|
|
|
- errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
|
|
|
- break;
|
|
|
- }
|
|
|
- if( ok )
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- std::cout << "LS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
|
|
|
- ls->close();
|
|
|
- br = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 7: // Progtamm abstürzen
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- bool ok = 0;
|
|
|
- if( ls->isRunning() )
|
|
|
- {
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
|
|
|
- {
|
|
|
- ls->serverBeenden();
|
|
|
- ok = 1;
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
|
|
|
- }
|
|
|
- else
|
|
|
- ok = 1;
|
|
|
- if( ok )
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- std::cout << "LS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
|
|
|
- ls->close();
|
|
|
- br = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 8: // Status Frage
|
|
|
- if( 1 )
|
|
|
- {
|
|
|
- char status = 0;
|
|
|
- if( ls->isRunning() )
|
|
|
- {
|
|
|
- status = 1;
|
|
|
- if( ls->istAn() )
|
|
|
- status = 2;
|
|
|
- }
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- klient->sende( &status, 1 );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 9: // Server pausieren
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- char pause = 0;
|
|
|
- klient->getNachricht( &pause, 1 );
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSPausieren ) )
|
|
|
- {
|
|
|
- bool ok = 0;
|
|
|
- if( pause )
|
|
|
- ok = ls->serverPause();
|
|
|
- else
|
|
|
- ok = ls->serverFortsetzen();
|
|
|
- if( ok )
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- else
|
|
|
- {
|
|
|
- Text *err = new Text();
|
|
|
- err->append( ls->getLetzterFehler() );
|
|
|
- errorZuKlient( err->getText() );
|
|
|
- err->release();
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if( pause )
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0xA: // maximale Anzahl der Clients setzen
|
|
|
- if( !adminId )
|
|
|
- errorZuKlient( "Du musst dich einloggen." );
|
|
|
- else
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- int maxC = 0;
|
|
|
- klient->getNachricht( (char *)&maxC, 4 );
|
|
|
- if( ls->zDB()->adminHatRecht( adminId, Admin_Recht::LSMCChange ) )
|
|
|
- {
|
|
|
- if( ls->setMaxKlients( maxC ) )
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- else
|
|
|
- {
|
|
|
- Text *err = new Text();
|
|
|
- err->append( ls->getLetzterFehler() );
|
|
|
- errorZuKlient( err->getText() );
|
|
|
- err->release();
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0xC: // klient absturtz
|
|
|
- if( 1 )
|
|
|
- {
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- int klientId = 0;
|
|
|
- klient->getNachricht( (char *)&klientId, 4 );
|
|
|
- if( klientId && ls->absturzKlient( klientId ) )
|
|
|
- klient->sende( "\1", 1 );
|
|
|
- else
|
|
|
- klient->sende( "\0", 1 );
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- errorZuKlient( "Unbekannte Nachricht!" );
|
|
|
- break;
|
|
|
- }
|
|
|
- if( br )
|
|
|
- break;
|
|
|
- ls->addEmpfangen( klient->getDownloadBytes( 1 ) );
|
|
|
- ls->addGesendet( klient->getUploadBytes( 1 ) );
|
|
|
- }
|
|
|
- }
|
|
|
- ls->addEmpfangen( klient->getDownloadBytes( 1 ) );
|
|
|
- ls->addGesendet( klient->getUploadBytes( 1 ) );
|
|
|
- delete this;
|
|
|
-}
|
|
|
-
|
|
|
-void FCAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
|
|
|
-{
|
|
|
- klient->sende( "\3", 1 );
|
|
|
- char len = (char)textLength( nachricht );
|
|
|
- klient->sende( &len, 1 );
|
|
|
- klient->sende( nachricht, len );
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
// Inhalt der LSKlient aus LoginServer.h
|
|
|
// Konstruktor
|
|
|
-FCKlient::FCKlient( SKlient *klient, FactoryCraftServer *ls )
|
|
|
+FCKlient::FCKlient( SSLSKlient *klient, FactoryCraftServer *ls )
|
|
|
: Thread()
|
|
|
{
|
|
|
this->klient = klient;
|
|
|
- unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
|
|
|
- klient->setSendeKey( (char *)key, 20 );
|
|
|
- klient->setEmpfangKey( (char *)key, 20 );
|
|
|
- klientNummer = 0;
|
|
|
+ accountId = 0;
|
|
|
this->ls = ls;
|
|
|
+ reader = new NetworkReader( klient );
|
|
|
}
|
|
|
|
|
|
// Destruktor
|
|
|
FCKlient::~FCKlient()
|
|
|
{
|
|
|
+ if( zGameClient )
|
|
|
+ {
|
|
|
+ zGameClient->logout();
|
|
|
+ zGameClient = (GameClient *)zGameClient->release();
|
|
|
+ }
|
|
|
+ delete reader;
|
|
|
klient->release();
|
|
|
ls->release();
|
|
|
}
|
|
@@ -600,7 +152,6 @@ void FCKlient::absturz()
|
|
|
{
|
|
|
ende();
|
|
|
klient->trenne();
|
|
|
- ls->zDB()->unregisterKlient( klientNummer, ls->getId() );
|
|
|
}
|
|
|
|
|
|
void FCKlient::thread()
|
|
@@ -608,7 +159,7 @@ void FCKlient::thread()
|
|
|
while( 1 )
|
|
|
{
|
|
|
char c = 0;
|
|
|
- if( !klient->getNachrichtEncrypted( &c, 1 ) )
|
|
|
+ if( !klient->getNachricht( &c, 1 ) )
|
|
|
break;
|
|
|
else
|
|
|
{
|
|
@@ -616,76 +167,63 @@ void FCKlient::thread()
|
|
|
switch( c )
|
|
|
{
|
|
|
case 1: // Klient identifikation
|
|
|
- klient->getNachrichtEncrypted( (char *)&klientNummer, 4 );
|
|
|
- if( !ls->zDB()->proveKlient( klientNummer, ls->getId() ) )
|
|
|
- {
|
|
|
- klientNummer = 0;
|
|
|
- errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Text *key = ls->zDB()->getKlientKey( klientNummer );
|
|
|
- if( !key )
|
|
|
- errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
|
|
|
- else
|
|
|
- {
|
|
|
- klient->sendeEncrypted( "\1", 1 );
|
|
|
- klient->setEmpfangKey( *key, key->getLength() );
|
|
|
- klient->setSendeKey( *key, key->getLength() );
|
|
|
- key->release();
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2: // Main / Erhaltung Server message
|
|
|
- if( 1 )
|
|
|
+ {
|
|
|
+ int accountId = 0;
|
|
|
+ klient->getNachricht( (char *)&accountId, 4 );
|
|
|
+ unsigned char secretLength = 0;
|
|
|
+ klient->getNachricht( (char *)&secretLength, 1 );
|
|
|
+ char *secret = new char[ secretLength + 1 ];
|
|
|
+ klient->getNachricht( secret, (int)secretLength );
|
|
|
+ secret[ secretLength ] = 0;
|
|
|
+ Text data = "{\"account_id\":";
|
|
|
+ data += accountId;
|
|
|
+ data += ", \"secret\": \"";
|
|
|
+ data += secret;
|
|
|
+ data += "\"}";
|
|
|
+ bool ok = false;
|
|
|
+ HTTP::Answer *answer = HTTP::PostRequest( "/game_client/api/verify_client.php", "koljastrohm-games.com", data, "application/json", 443, true ).execute();
|
|
|
+ if( answer->getStatusCode() == 200 )
|
|
|
{
|
|
|
- char befehl = 0;
|
|
|
- klient->getNachrichtEncrypted( &befehl, 1 );
|
|
|
- switch( befehl )
|
|
|
+ JSON::JSONObject obj( answer->getData() );
|
|
|
+ if( obj.hasValue( "verified" ) )
|
|
|
{
|
|
|
- case 2: // klient absturtz
|
|
|
- if( 1 )
|
|
|
+ JSON::JSONValue *value = obj.getValue( "verified" );
|
|
|
+ if( value->getType() == JSON::BOOLEAN )
|
|
|
{
|
|
|
- int klientId = 0;
|
|
|
- klient->getNachrichtEncrypted( (char *)&klientId, 4 );
|
|
|
- if( klientId && ls->absturzKlient( klientId ) )
|
|
|
- klient->sendeEncrypted( "\1", 1 );
|
|
|
- else
|
|
|
- klient->sendeEncrypted( "\0", 1 );
|
|
|
+ if( ( (JSON::JSONBool *)value )->getBool() )
|
|
|
+ {
|
|
|
+ this->accountId = accountId;
|
|
|
+ if( zGameClient )
|
|
|
+ {
|
|
|
+ zGameClient->logout();
|
|
|
+ zGameClient = (GameClient *)zGameClient->release();
|
|
|
+ }
|
|
|
+ zGameClient = ls->zGame()->addPlayer( dynamic_cast<FCKlient *>( getThis() ), Text( accountId ) );
|
|
|
+ klient->sende( "\1", 1 );
|
|
|
+ ok = true;
|
|
|
+ }
|
|
|
}
|
|
|
- break;
|
|
|
- default:
|
|
|
- errorZuKlient( "Befehl nicht bekannt!" );
|
|
|
- break;
|
|
|
+ value->release();
|
|
|
}
|
|
|
}
|
|
|
+ answer->release();
|
|
|
+ delete[]secret;
|
|
|
+ if( !ok )
|
|
|
+ klient->sende( "\0", 1 );
|
|
|
break;
|
|
|
- case 3: // Verbindungsende
|
|
|
+ }
|
|
|
+ case 2: // Verbindungsende
|
|
|
br = 1;
|
|
|
- klient->sendeEncrypted( "\1", 1 );
|
|
|
- break;
|
|
|
- case 4: // unregister Klient
|
|
|
- if( !klientNummer )
|
|
|
+ if( zGameClient )
|
|
|
{
|
|
|
- errorZuKlient( "Du bist nicht Identifiziert." );
|
|
|
- break;
|
|
|
- }
|
|
|
- ls->zDB()->unregisterKlient( klientNummer, ls->getId() );
|
|
|
- klient->sendeEncrypted( "\1", 1 );
|
|
|
- break;
|
|
|
- case 0x7: // ping
|
|
|
- if( 1 )
|
|
|
- {
|
|
|
- if( !klientNummer )
|
|
|
- {
|
|
|
- errorZuKlient( "Du bist nicht Identifiziert." );
|
|
|
- break;
|
|
|
- }
|
|
|
- klient->sendeEncrypted( "\1", 1 );
|
|
|
+ zGameClient->logout();
|
|
|
+ zGameClient = (GameClient *)zGameClient->release();
|
|
|
}
|
|
|
+ klient->sende( "\1", 1 );
|
|
|
break;
|
|
|
default:
|
|
|
- errorZuKlient( "Unbekannte Nachricht!" );
|
|
|
+ if( zGameClient )
|
|
|
+ zGameClient->addMessage( reader );
|
|
|
break;
|
|
|
}
|
|
|
if( br )
|
|
@@ -699,30 +237,12 @@ void FCKlient::thread()
|
|
|
ls->removeKlient( this ); // delete this
|
|
|
}
|
|
|
|
|
|
-// constant
|
|
|
-void FCKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
|
|
|
+int FCKlient::getAccountId() const // gibt die KlientId zurück
|
|
|
{
|
|
|
- klient->sendeEncrypted( "\3", 1 );
|
|
|
- char len = (char)textLength( nachricht );
|
|
|
- klient->sendeEncrypted( &len, 1 );
|
|
|
- klient->sendeEncrypted( nachricht, len );
|
|
|
+ return accountId;
|
|
|
}
|
|
|
|
|
|
-int FCKlient::getKlientNummer() const // gibt die KlientId zurück
|
|
|
+SSLSKlient *FCKlient::zClient() const
|
|
|
{
|
|
|
- return klientNummer;
|
|
|
+ return klient;
|
|
|
}
|
|
|
-
|
|
|
-// Inhalt der MSGWeiterleitung Klasse aus LoginServer.h
|
|
|
-// Konstruktor
|
|
|
-MSGWeiterleitung::MSGWeiterleitung( FactoryCraftServer *ls )
|
|
|
- : ReferenceCounter()
|
|
|
-{
|
|
|
- this->ls = ls;
|
|
|
-}
|
|
|
-
|
|
|
-// Destruktor
|
|
|
-MSGWeiterleitung::~MSGWeiterleitung()
|
|
|
-{
|
|
|
- ls->release();
|
|
|
-}
|