#include "../KSGKlient.h" #include "../KSGServer.h" #include "../Keys.h" // Inhalt der LoginKlient Klase aus KSGKlient.h // Konstruktor LoginKlient::LoginKlient() { verbunden = 0; fehler = 0; brauchKick = 0; klient = 0; klientId = getKlientId(); accountId = 0; ref = 1; } // Destruktor LoginKlient::~LoginKlient() // wenn verbunden, dann trennen { cs.lock(); if( klient ) { char serverReturn = 0; if( verbunden ) { if( brauchKick ) klient->sendeEncrypted( "\0", 1 ); klient->sendeEncrypted( "\4", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char län = 0; klient->getNachrichtEncrypted( &län, 1 ); char *nachricht = new char[ län + 1 ]; nachricht[ län ] = 0; klient->getNachrichtEncrypted( nachricht, län ); delete[]nachricht; } klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); } else { int keyLen = 0; char *key = 0; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN ); klient->setEmpfangKey( key, keyLen ); delete[] key; klient->verbinde( klient->getServerPort(), klient->getServerIp() ); klient->sendeEncrypted( "\1", 1 ); klient->sendeEncrypted( (char*)&klientId, 4 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char län = 0; klient->getNachrichtEncrypted( &län, 1 ); char *nachricht = new char[ län + 1 ]; nachricht[ län ] = 0; klient->getNachrichtEncrypted( nachricht, län ); delete[]nachricht; } else { char *sl = 0; char slLän = getSchlüssel( &sl ); klient->setSendeKey( sl, slLän ); klient->setEmpfangKey( sl, slLän ); delete[] sl; klient->sendeEncrypted( "\4", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char län = 0; klient->getNachrichtEncrypted( &län, 1 ); char *nachricht = new char[ län + 1 ]; nachricht[ län ] = 0; klient->getNachrichtEncrypted( nachricht, län ); delete[]nachricht; } } klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); } klient = klient->release(); } delete[]fehler; cs.unlock(); } // nicht constant bool LoginKlient::verbinde() // verbindet sich mit dem Login Server { cs.lock(); if( verbunden ) { cs.unlock(); return 1; } brauchKick = 0; if( !klient ) { char *msIp = getMainServerIp(); unsigned short msPort = getMainServerPort(); klient = new Klient(); int keyLen = 0; char *key = 0; Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::EMPFANGEN ); klient->setEmpfangKey( key, keyLen ); delete[] key; if( !klient->verbinde( msPort, msIp ) ) { char *err = "Fehler beim verbinden mit dem Main Server. Bitte versuche es Später erneut."; delete[]fehler; fehler = new char[ textLength( err ) + 1 ]; fehler[ textLength( err ) ] = 0; memcpy( fehler, err, textLength( err ) ); klient = klient->release(); delete[]msIp; cs.unlock(); return 0; } delete[]msIp; klient->sende( "\0", 1 ); // verschlüsselung aktivieren klient->sendeEncrypted( "\1", 1 ); klient->sendeEncrypted( (char*)&klientId, 4 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); klient = klient->release(); cs.unlock(); return 0; } char *sl = 0; char slLän = getSchlüssel( &sl ); klient->setSendeKey( sl, slLän ); klient->setEmpfangKey( sl, slLän ); delete[] sl; klient->sendeEncrypted( "\6\3", 2 ); char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 2 ) { unsigned char lsIp[ 4 ]; klient->getNachrichtEncrypted( (char *)lsIp, 4 ); unsigned short lsPort = 0; klient->getNachrichtEncrypted( (char*)&lsPort, 2 ); klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); Text *lsIpT = new Text( "" ); lsIpT->append( (int)lsIp[ 0 ] ); lsIpT->append( "." ); lsIpT->append( (int)lsIp[ 1 ] ); lsIpT->append( "." ); lsIpT->append( (int)lsIp[ 2 ] ); lsIpT->append( "." ); lsIpT->append( (int)lsIp[ 3 ] ); int keyLen = 0; char *key = 0; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN ); klient->setEmpfangKey( key, keyLen ); delete[] key; klient->verbinde( lsPort, lsIpT->getText() ); lsIpT = lsIpT->release(); klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); } if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); klient = klient->release(); cs.unlock(); return 0; } } int keyLen = 0; char *key = 0; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN ); klient->setEmpfangKey( key, keyLen ); delete[] key; if( klient->verbinde( klient->getServerPort(), klient->getServerIp() ) ) { if( klient->sendeEncrypted( "\1", 1 ) ) { klient->sendeEncrypted( (char*)&klientId, 4 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); klient->sendeEncrypted( "\3", 1 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); cs.unlock(); return 0; } char *sl = 0; char slLän = getSchlüssel( &sl ); klient->setSendeKey( sl, slLän ); klient->setEmpfangKey( sl, slLän ); delete[] sl; verbunden = 1; cs.unlock(); return 1; } else { char *err = "Der dir zugewiesene Login Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut."; delete[]fehler; fehler = new char[ textLength( err ) + 1 ]; fehler[ textLength( err ) ] = 0; memcpy( fehler, err, textLength( err ) ); klient = klient->release(); } } else { char *err = "Der dir zugewiesene Login Server antwortet nicht. Bitte versuche es Später erneut."; delete[]fehler; fehler = new char[ textLength( err ) + 1 ]; fehler[ textLength( err ) ] = 0; memcpy( fehler, err, textLength( err ) ); klient = klient->release(); } cs.unlock(); return 0; } int LoginKlient::login( const char *name, const char *pass ) // gibt bei Erfolg 1 zurück { cs.lock(); if( !verbunden ) verbinde(); if( !verbunden ) { cs.unlock(); return 0; } if( brauchKick ) klient->sendeEncrypted( "\0", 1 ); brauchKick = 0; klient->sendeEncrypted( "\5", 1 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); cs.unlock(); return 0; } unsigned char byte = (unsigned char)textLength( name ); klient->sendeEncrypted( (char*)&byte, 1 ); klient->sendeEncrypted( name, byte ); byte = (unsigned char)textLength( pass ); klient->sendeEncrypted( (char*)&byte, 1 ); klient->sendeEncrypted( pass, byte ); klient->getNachrichtEncrypted( (char*)&byte, 1 ); if( byte == 1 ) { char host[ 255 ] = ""; getHostName( host, 255 ); Text *addresse = new Text( getHostAddresse() ); unsigned char localIp[ 4 ]; localIp[ 0 ] = TextZuInt( addresse->getText(), 10 ); localIp[ 1 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 0 ) + 1, 10 ); localIp[ 2 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 1 ) + 1, 10 ); localIp[ 3 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 2 ) + 1, 10 ); addresse = addresse->release(); klient->sendeEncrypted( (char*)&localIp, 4 ); byte = textLength( host ); klient->sendeEncrypted( (char*)&byte, 1 ); klient->sendeEncrypted( host, byte ); klient->getNachrichtEncrypted( (char*)&accountId, 4 ); cs.unlock(); return 1; } else if( byte == 2 ) { brauchKick = 1; cs.unlock(); return 2; } else if( byte == 3 ) { klient->getNachrichtEncrypted( (char*)&byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool LoginKlient::kick( const char *geheim ) { if( !brauchKick ) return 1; cs.lock(); brauchKick = 0; unsigned char byte = (unsigned char)textLength( geheim ); klient->sendeEncrypted( (char*)&byte, 1 ); klient->sendeEncrypted( geheim, byte ); klient->getNachrichtEncrypted( (char*)&byte, 1 ); if( !byte ) { cs.unlock(); return 0; } char host[ 255 ]; getHostName( host, 255 ); Text *addresse = new Text( getHostAddresse() ); unsigned char localIp[ 4 ]; localIp[ 0 ] = TextZuInt( addresse->getText(), 10 ); localIp[ 1 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 0 ) + 1, 10 ); localIp[ 2 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 1 ) + 1, 10 ); localIp[ 3 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 2 ) + 1, 10 ); addresse = addresse->release(); klient->sendeEncrypted( (char*)&localIp, 4 ); byte = textLength( host ); klient->sendeEncrypted( (char*)&byte, 1 ); klient->sendeEncrypted( host, byte ); klient->getNachrichtEncrypted( (char*)&accountId, 4 ); cs.unlock(); return 1; } bool LoginKlient::logout() // logt den Account aus { cs.lock(); if( !verbunden ) verbinde(); if( !verbunden ) { cs.unlock(); return 0; } if( brauchKick ) klient->sendeEncrypted( "\0", 1 ); brauchKick = 0; klient->sendeEncrypted( "\6", 1 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); cs.unlock(); return 0; } klient->sendeEncrypted( (char*)&accountId, 4 ); klient->getNachrichtEncrypted( &serverReturn, 1 ); if( serverReturn == 3 ) { char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); cs.unlock(); return 0; } cs.unlock(); return 1; } bool LoginKlient::keepAlive() // Erhält die Verbindung aufrecht { if( !verbunden ) return 0; char res = 0; if( !cs.tryLock() ) return 1; klient->sendeEncrypted( "\x7", 1 ); klient->getNachrichtEncrypted( &res, 1 ); cs.unlock(); if( res != 1 ) trenne(); return res == 1; } bool LoginKlient::trenne() // trennt sich von dem Login Server { if( verbunden ) { cs.lock(); if( brauchKick ) klient->sendeEncrypted( "\0", 1 ); brauchKick = 0; klient->sendeEncrypted( "\3", 1 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); verbunden = 0; cs.unlock(); } return 1; } void LoginKlient::setLetzterFehler( char *err ) // setzt den letzten Fehler { if( fehler ) delete[]fehler; fehler = new char[ textLength( err ) + 1 ]; memcpy( fehler, err, textLength( err ) ); fehler[ textLength( err ) ] = 0; } // constant bool LoginKlient::istVerbunden() const // prüft, ob mit Login Server verbunden { return verbunden; } int LoginKlient::getAccountId() const // gibt die AccountId zurück { return accountId; } char *LoginKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück { return fehler; } // Reference Counting LoginKlient *LoginKlient::getThis() { ref++; return this; } LoginKlient *LoginKlient::release() { ref--; if( !ref ) delete this; return 0; }