#include "../KSGKlient.h" #include "../KSGServer.h" #include "../Keys.h" // Inhalt der RegisterKlient Klasse aus KSGKlient.h // Konstruktor RegisterKlient::RegisterKlient() { klient = 0; verbunden = 0; fehler = 0; brauchSchlüssel = 0; klientId = getKlientId(); ref = 1; } // Destruktor RegisterKlient::~RegisterKlient() // wenn verbunden, dann trennen { cs.lock(); if( klient ) { char serverReturn = 0; if( verbunden ) { if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 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::REGISTER, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::REGISTER, 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 RegisterKlient::verbinde() // verbindet ich mit dem Register Server { cs.lock(); if( verbunden ) { cs.unlock(); return 1; } brauchSchlüssel = 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\1", 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::REGISTER, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::REGISTER, 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::REGISTER, Keys::SENDEN ); klient->setSendeKey( key, keyLen ); delete[] key; Keys::getServerKey( &key, keyLen, Keys::REGISTER, 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 Registrierungs 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 Registrierungs 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; } bool RegisterKlient::accountErstellen( const char *name, const char *pass, const char *geheim, const char *eMail, unsigned short jahr, char monat, char tag ) // erstellt den Account { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 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 län[ 4 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ), (unsigned char)textLength( eMail ) }; klient->sendeEncrypted( (char*)län, 4 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( geheim, län[ 2 ] ); klient->sendeEncrypted( eMail, län[ 3 ] ); klient->sendeEncrypted( (char*)&jahr, 2 ); klient->sendeEncrypted( &monat, 1 ); klient->sendeEncrypted( &tag, 1 ); char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { brauchSchlüssel = 1; cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::accountLöschen( const char *name, const char *pass, const char *geheim ) // löscht den Account { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 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; } unsigned char län[ 3 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ) }; klient->sendeEncrypted( (char*)län, 3 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( geheim, län[ 2 ] ); char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { brauchSchlüssel = 1; cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } int RegisterKlient::accountBestätigen( const char *name, const char *pass ) // account Bestätigung fortsetzen { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } char byte = 0xE; klient->sendeEncrypted( &byte, 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 län[ 2 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ) }; klient->sendeEncrypted( (char*)län, 2 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); brauchSchlüssel = 1; if( byte == 1 ) { cs.unlock(); return 1; } if( byte == 2 ) { cs.unlock(); return 2; } brauchSchlüssel = 0; if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::bestätigen( const char *schlüssel ) // bestätigt den Vorgang mit Schüssel { if( !brauchSchlüssel ) return 1; cs.lock(); unsigned char län = textLength( schlüssel ); klient->sendeEncrypted( (char*)&län, 1 ); klient->sendeEncrypted( schlüssel, län ); klient->getNachrichtEncrypted( (char*)&län, 1 ); cs.unlock(); if( län ) { brauchSchlüssel = 0; return 1; } else return 0; } void RegisterKlient::eMailErneutSenden() // E-Mail nochmal senden { cs.lock(); char byte = -2; if( brauchSchlüssel ) klient->sendeEncrypted( &byte, 1 ); cs.unlock(); } void RegisterKlient::später() // bestätigung später abclose { cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; cs.unlock(); } void RegisterKlient::abbrechen() // bricht den Vorgang ab { cs.lock(); if( brauchSchlüssel ) klient->sendeEncrypted( "\0", 1 ); brauchSchlüssel = 0; cs.unlock(); } bool RegisterKlient::passwortÄndern( const char *name, const char *pass, const char *geheim, const char *nPass ) // ändert das Passwort { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; klient->sendeEncrypted( "\7", 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 län[ 4 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( nPass ), (unsigned char)textLength( geheim ) }; klient->sendeEncrypted( (char*)län, 4 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( nPass, län[ 2 ] ); klient->sendeEncrypted( geheim, län[ 3 ] ); char byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::eMailÄndern( const char *name, const char *pass, const char *geheim, const char *nEMail ) // ändert die E-Mail Addresse { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte = 8; klient->sendeEncrypted( &byte, 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 län[ 4 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ), (unsigned char)textLength( nEMail ) }; klient->sendeEncrypted( (char*)län, 4 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( geheim, län[ 2 ] ); klient->sendeEncrypted( nEMail, län[ 3 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::geheimnisÄndern( const char *name, const char *pass, const char *geheim, const char *nGeheim ) // ändert das Geheimnis { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte = 9; klient->sendeEncrypted( &byte, 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 län[ 4 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ), (unsigned char)textLength( nGeheim ) }; klient->sendeEncrypted( (char*)län, 4 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( geheim, län[ 2 ] ); klient->sendeEncrypted( nGeheim, län[ 3 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::nameVergessen( const char *pass, const char *geheim ) // schickt den Account Namen an die Bekannte E-Mail Addresse { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte = 0xA; klient->sendeEncrypted( &byte, 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 län[ 2 ] = { (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ) }; klient->sendeEncrypted( (char*)län, 2 ); klient->sendeEncrypted( pass, län[ 0 ] ); klient->sendeEncrypted( geheim, län[ 1 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::passwortVergessen( const char *name, const char *geheim ) // schickt das Account Passwort an die Bekannte E-Mail Addresse { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte = 0xB; klient->sendeEncrypted( &byte, 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 län[ 2 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( geheim ) }; klient->sendeEncrypted( (char*)län, 2 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( geheim, län[ 1 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::geheimnisVergessen( const char *name, const char *pass ) // schickt das Account Geheimnis an die Bekannte E-Mail Addresse { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte = 0xC; klient->sendeEncrypted( &byte, 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 län[ 2 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ) }; klient->sendeEncrypted( (char*)län, 2 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); byte = 0; klient->getNachrichtEncrypted( &byte, 1 ); if( byte == 1 ) { cs.unlock(); return 1; } else if( byte == 3 ) { klient->getNachrichtEncrypted( &byte, 1 ); delete[]fehler; fehler = new char[ byte + 1 ]; fehler[ byte ] = 0; klient->getNachrichtEncrypted( fehler, byte ); } cs.unlock(); return 0; } bool RegisterKlient::eMailVergessen( const char *name, const char *pass, const char *geheim, char **eMail ) // gibt die E-Mail Addresse des Accounts zurück { if( !verbunden ) verbinde(); if( !verbunden ) return 0; cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; char byte2 = 0xD; klient->sendeEncrypted( &byte2, 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 län[ 3 ] = { (unsigned char)textLength( name ), (unsigned char)textLength( pass ), (unsigned char)textLength( geheim ) }; klient->sendeEncrypted( (char*)län, 3 ); klient->sendeEncrypted( name, län[ 0 ] ); klient->sendeEncrypted( pass, län[ 1 ] ); klient->sendeEncrypted( geheim, län[ 2 ] ); unsigned char byte = 0; klient->getNachrichtEncrypted( (char*)&byte, 1 ); if( byte == 1 ) { klient->getNachrichtEncrypted( (char*)&byte, 1 ); char *mail = new char[ byte + 1 ]; mail[ byte ] = 0; klient->getNachrichtEncrypted( mail, byte ); *eMail = mail; cs.unlock(); return 1; } 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 RegisterKlient::keepAlive() // Erhält die Verbindung aufrecht { if( !verbunden ) return 0; char res = 0; if( !cs.tryLock() ) return 1; klient->sendeEncrypted( "\xF", 1 ); klient->getNachrichtEncrypted( &res, 1 ); cs.unlock(); if( res != 1 ) trenne(); return res == 1; } bool RegisterKlient::trenne() // trennt sich von dem Register Server { if( verbunden ) { cs.lock(); if( brauchSchlüssel ) { char byte = -1; klient->sendeEncrypted( &byte, 1 ); } brauchSchlüssel = 0; klient->sendeEncrypted( "\3", 1 ); char serverReturn = 0; klient->getNachrichtEncrypted( &serverReturn, 1 ); klient->trenne(); verbunden = 0; cs.unlock(); } return 1; } // constant bool RegisterKlient::istVerbunden() const // prüft, ob mit Register Server verbunden { return verbunden; } bool RegisterKlient::vorgangBrauchBestätigung() const // prüft, ob eine Bestätigung notwendig ist { return brauchSchlüssel; } char *RegisterKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück { return fehler; } // Reference Counting RegisterKlient *RegisterKlient::getThis() { ref++; return this; } RegisterKlient *RegisterKlient::release() { ref--; if( !ref ) delete this; return 0; }