ErhaltungServer.cpp 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481
  1. #include "ErhaltungServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. #ifndef WIN32
  6. #include <unistd.h>
  7. #define Sleep( x ) usleep( (x) * 1000 )
  8. #endif
  9. // Inhalt der ErhaltungServer Klasse aus ErhaltungServer.h
  10. // Konstruktor
  11. ErhaltungServer::ErhaltungServer( InitDatei *zIni )
  12. : Thread()
  13. {
  14. Network::Start( 100 );
  15. std::cout << "ES: Verbindung mit Datenbank wird hergestellt...\n";
  16. db = new ESDatenbank( zIni );
  17. empfangen = 0;
  18. gesendet = 0;
  19. clients = 0;
  20. fehler = new Text();
  21. ini = zIni->getThis();
  22. id = *zIni->zWert( "ServerId" );
  23. server = new Server();
  24. aServer = new SSLServer();
  25. aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  26. aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  27. aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  28. std::cout << "ES: Starten des Admin Servers...\n";
  29. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  30. {
  31. std::cout << "ES: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  32. exit( 1 );
  33. }
  34. db->setServerStatus( id, 2 );
  35. end = 0;
  36. nichtPausiert = 0;
  37. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  38. {
  39. serverStarten();
  40. serverFortsetzen();
  41. }
  42. }
  43. // Destruktor
  44. ErhaltungServer::~ErhaltungServer()
  45. {
  46. fehler->release();
  47. server->trenne();
  48. server->release();
  49. aServer->trenne();
  50. aServer->release();
  51. ini->release();
  52. db->release();
  53. }
  54. void ErhaltungServer::runn()
  55. {
  56. while( !end && aServer->isConnected() )
  57. {
  58. SSLSKlient *klient;
  59. klient = aServer->getKlient();
  60. if( end && klient )
  61. {
  62. klient->trenne();
  63. klient = klient->release();
  64. Sleep( 1000 );
  65. return;
  66. }
  67. if( !klient )
  68. continue;
  69. ESAKlient * clHandle = new ESAKlient( klient, (ErhaltungServer *)getThis() );
  70. clHandle->start();
  71. }
  72. }
  73. void ErhaltungServer::thread()
  74. {
  75. while( server->isConnected() )
  76. {
  77. SKlient *klient;
  78. klient = server->getKlient();
  79. if( !klient )
  80. continue;
  81. Framework::getThreadRegister()->cleanUpClosedThreads();
  82. ESKlient * clHandle = new ESKlient( klient, (ErhaltungServer *)getThis() );
  83. clients++;
  84. clHandle->start();
  85. }
  86. }
  87. void ErhaltungServer::close()
  88. {
  89. db->setServerStatus( id, 1 );
  90. server->trenne();
  91. #ifdef WIN32
  92. warteAufThread( 1000 );
  93. #endif
  94. ende();
  95. run = 0;
  96. end = 1;
  97. Klient *klient = new Klient();
  98. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  99. Sleep( 500 );
  100. aServer->trenne();
  101. klient->release();
  102. }
  103. // nicht constant
  104. bool ErhaltungServer::serverStarten()
  105. {
  106. if( nichtPausiert )
  107. {
  108. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  109. return 0;
  110. }
  111. if( server )
  112. server->release();
  113. server = new Server();
  114. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  115. {
  116. nichtPausiert = 1;
  117. start();
  118. return 1;
  119. }
  120. else
  121. {
  122. serverBeenden();
  123. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  124. return 0;
  125. }
  126. }
  127. bool ErhaltungServer::serverPause()
  128. {
  129. if( !nichtPausiert )
  130. {
  131. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  132. return 0;
  133. }
  134. if( !db->setServerStatus( id, 2 ) )
  135. {
  136. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  137. fehler->append( db->getLetzterFehler() );
  138. return 0;
  139. }
  140. return 1;
  141. }
  142. bool ErhaltungServer::serverFortsetzen()
  143. {
  144. if( !nichtPausiert )
  145. {
  146. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  147. return 0;
  148. }
  149. if( !db->setServerStatus( id, 3 ) )
  150. {
  151. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  152. fehler->append( db->getLetzterFehler() );
  153. return 0;
  154. }
  155. return 1;
  156. }
  157. bool ErhaltungServer::serverBeenden()
  158. {
  159. if( !nichtPausiert )
  160. {
  161. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  162. return 0;
  163. }
  164. if( db->serverIstNichtPausiert( id ) )
  165. {
  166. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  167. return 0;
  168. }
  169. nichtPausiert = 0;
  170. if( server )
  171. server->trenne();
  172. #ifdef WIN32
  173. warteAufThread( 1000 );
  174. #endif
  175. ende();
  176. return 1;
  177. }
  178. bool ErhaltungServer::setMaxKlients( unsigned char mc )
  179. {
  180. if( !db->setMaxClients( id, mc ) )
  181. {
  182. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  183. fehler->append( db->getLetzterFehler() );
  184. return 0;
  185. }
  186. ini->setWert( "MaxClients", Text() += mc );
  187. return 1;
  188. }
  189. void ErhaltungServer::addGesendet( int bytes )
  190. {
  191. gesendet += bytes;
  192. }
  193. void ErhaltungServer::addEmpfangen( int bytes )
  194. {
  195. empfangen += bytes;
  196. }
  197. void ErhaltungServer::clientTrennung()
  198. {
  199. clients--;
  200. }
  201. // constant
  202. bool ErhaltungServer::istAn() const
  203. {
  204. return db->serverIstNichtPausiert( id );
  205. }
  206. Server *ErhaltungServer::zServer() const
  207. {
  208. return server;
  209. }
  210. ESDatenbank *ErhaltungServer::zDB() const
  211. {
  212. return db;
  213. }
  214. bool ErhaltungServer::hatClients() const
  215. {
  216. return clients > 0;
  217. }
  218. int ErhaltungServer::getId() const
  219. {
  220. return id;
  221. }
  222. char *ErhaltungServer::getLetzterFehler() const
  223. {
  224. return fehler->getText();
  225. }
  226. // Inhalt der RSAKlient Klasse aus RegisterServer.h
  227. // Konstruktor
  228. ESAKlient::ESAKlient( SSLSKlient * klient, ErhaltungServer * es )
  229. : Thread()
  230. {
  231. this->klient = klient;
  232. name = new Text( "" );
  233. passwort = new Text( "" );
  234. adminId = 0;
  235. version = 0;
  236. this->es = es;
  237. }
  238. // Destruktor
  239. ESAKlient::~ESAKlient()
  240. {
  241. klient->trenne();
  242. klient->release();
  243. es->release();
  244. name->release();
  245. passwort->release();
  246. }
  247. // nicht constant
  248. void ESAKlient::thread()
  249. {
  250. while( 1 )
  251. {
  252. char c = 0;
  253. if( !klient->getNachricht( &c, 1 ) )
  254. break;
  255. else
  256. {
  257. bool br = 0;
  258. switch( c )
  259. {
  260. case 1: // Login
  261. if( 1 )
  262. {
  263. klient->sende( "\1", 1 );
  264. unsigned char nLen = 0;
  265. klient->getNachricht( (char *)& nLen, 1 );
  266. char *n = new char[ nLen + 1 ];
  267. n[ (int)nLen ] = 0;
  268. if( nLen )
  269. klient->getNachricht( n, nLen );
  270. unsigned char pLen = 0;
  271. klient->getNachricht( (char *)& pLen, 1 );
  272. char *p = new char[ pLen + 1 ];
  273. p[ (int)pLen ] = 0;
  274. if( pLen )
  275. klient->getNachricht( p, pLen );
  276. int adminId = es->zDB()->istAdministrator( n, p );
  277. if( adminId )
  278. {
  279. klient->sende( "\1", 1 );
  280. name->setText( n );
  281. passwort->setText( p );
  282. this->adminId = adminId;
  283. }
  284. else
  285. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  286. delete[] n;
  287. delete[] p;
  288. }
  289. break;
  290. case 2: // Logout
  291. adminId = 0;
  292. name->setText( "" );
  293. passwort->setText( "" );
  294. klient->sende( "\1", 1 );
  295. break;
  296. case 3: // Trennen
  297. br = 1;
  298. klient->sende( "\1", 1 );
  299. break;
  300. case 4: // Server starten
  301. if( !adminId )
  302. errorZuKlient( "Du musst dich einloggen." );
  303. else
  304. {
  305. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSStarten ) )
  306. {
  307. if( !es->serverStarten() )
  308. {
  309. Text *err = new Text();
  310. err->append( es->getLetzterFehler() );
  311. errorZuKlient( err->getText() );
  312. err->release();
  313. }
  314. else
  315. klient->sende( "\1", 1 );
  316. }
  317. else
  318. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  319. }
  320. break;
  321. case 5: // Server beenden
  322. if( !adminId )
  323. errorZuKlient( "Du musst dich einloggen." );
  324. else
  325. {
  326. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  327. {
  328. if( es->serverBeenden() )
  329. klient->sende( "\1", 1 );
  330. else
  331. {
  332. Text *err = new Text();
  333. err->append( es->getLetzterFehler() );
  334. errorZuKlient( err->getText() );
  335. err->release();
  336. }
  337. }
  338. else
  339. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  340. }
  341. break;
  342. case 6: // Programm Schließen
  343. if( !adminId )
  344. errorZuKlient( "Du musst dich einloggen." );
  345. else
  346. {
  347. bool ok = 0;
  348. if( es->isRunning() )
  349. {
  350. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  351. {
  352. if( es->serverBeenden() )
  353. ok = 1;
  354. else
  355. {
  356. Text *err = new Text();
  357. err->append( es->getLetzterFehler() );
  358. errorZuKlient( err->getText() );
  359. err->release();
  360. }
  361. }
  362. else
  363. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  364. }
  365. else
  366. ok = 1;
  367. if( ok &&es->hatClients() )
  368. {
  369. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  370. break;
  371. }
  372. if( ok )
  373. {
  374. klient->sende( "\1", 1 );
  375. std::cout << "IS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  376. es->close();
  377. br = 1;
  378. }
  379. }
  380. break;
  381. case 7: // Progtamm abstürzen
  382. if( !adminId )
  383. errorZuKlient( "Du musst dich einloggen." );
  384. else
  385. {
  386. bool ok = 0;
  387. if( es->isRunning() )
  388. {
  389. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSBeenden ) )
  390. {
  391. es->serverBeenden();
  392. ok = 1;
  393. }
  394. else
  395. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  396. }
  397. else
  398. ok = 1;
  399. if( ok )
  400. {
  401. klient->sende( "\1", 1 );
  402. std::cout << "IS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  403. es->close();
  404. br = 1;
  405. }
  406. }
  407. break;
  408. case 8: // Status Frage
  409. if( 1 )
  410. {
  411. char status = 0;
  412. if( es->isRunning() )
  413. {
  414. status = 1;
  415. if( es->istAn() )
  416. status = 2;
  417. }
  418. klient->sende( "\1", 1 );
  419. klient->sende( &status, 1 );
  420. }
  421. break;
  422. case 9: // Server pausieren
  423. if( !adminId )
  424. errorZuKlient( "Du musst dich einloggen." );
  425. else
  426. {
  427. klient->sende( "\1", 1 );
  428. char pause = 0;
  429. klient->getNachricht( &pause, 1 );
  430. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSPausieren ) )
  431. {
  432. bool ok = 0;
  433. if( pause )
  434. ok = es->serverPause();
  435. else
  436. ok = es->serverFortsetzen();
  437. if( ok )
  438. klient->sende( "\1", 1 );
  439. else
  440. {
  441. Text *err = new Text();
  442. err->append( es->getLetzterFehler() );
  443. errorZuKlient( err->getText() );
  444. err->release();
  445. }
  446. }
  447. else
  448. {
  449. if( pause )
  450. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  451. else
  452. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  453. }
  454. }
  455. break;
  456. case 0xA: // maximale Anzahl der Clients setzen
  457. if( !adminId )
  458. errorZuKlient( "Du musst dich einloggen." );
  459. else
  460. {
  461. klient->sende( "\1", 1 );
  462. int maxC = 0;
  463. klient->getNachricht( (char *)& maxC, 4 );
  464. if( es->zDB()->adminHatRecht( adminId, Admin_Recht::LSMCChange ) )
  465. {
  466. if( es->setMaxKlients( (unsigned char)maxC ) )
  467. klient->sende( "\1", 1 );
  468. else
  469. {
  470. Text *err = new Text();
  471. err->append( es->getLetzterFehler() );
  472. errorZuKlient( err->getText() );
  473. err->release();
  474. }
  475. }
  476. else
  477. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  478. }
  479. break;
  480. default:
  481. errorZuKlient( "Unbekannte Nachricht!" );
  482. break;
  483. }
  484. if( br )
  485. break;
  486. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  487. es->addGesendet( klient->getUploadBytes( 1 ) );
  488. }
  489. }
  490. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  491. es->addGesendet( klient->getUploadBytes( 1 ) );
  492. delete this;
  493. }
  494. void ESAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  495. {
  496. klient->sende( "\3", 1 );
  497. char len = (char)textLength( nachricht );
  498. klient->sende( &len, 1 );
  499. klient->sende( nachricht, len );
  500. }
  501. // Inhalt der ESKThread Klasse aus ErhaltungServer.h
  502. // Konstruktor
  503. ESKThread::ESKThread( ESKlient * zKlient )
  504. : Thread()
  505. {
  506. this->zKlient = zKlient;
  507. }
  508. // Destruktor
  509. ESKThread::~ESKThread()
  510. {
  511. ende();
  512. }
  513. // nicht constant
  514. void ESKThread::thread()
  515. {
  516. while( 1 )
  517. {
  518. if( !zKlient->erhalten() )
  519. break;
  520. Sleep( 2000 );
  521. }
  522. run = 0;
  523. }
  524. // constant
  525. // Inhalt der ESKlient Klasse aus ErhaltungServer.h
  526. // Konstruktor
  527. ESKlient::ESKlient( SKlient * klient, ErhaltungServer * es )
  528. : Thread()
  529. {
  530. th = new ESKThread( this );
  531. this->klient = klient;
  532. unsigned char key[ 20 ] = { 207, 242, 142, 161, 148, 107, 131, 33, 172, 68, 91, 169, 81, 106, 69, 131, 207, 56, 166, 248 };
  533. klient->setSendeKey( (char *)key, 20 );
  534. klient->setEmpfangKey( (char *)key, 20 );
  535. zeit = new ZeitMesser();
  536. zeit->messungStart();
  537. sekunden = 0;
  538. letzteErhaltung = 0;
  539. abgemeldet = 0;
  540. klientNummer = 0;
  541. this->es = es;
  542. encrypted = 0;
  543. }
  544. // Destruktor
  545. ESKlient::~ESKlient()
  546. {
  547. th->release();
  548. es->clientTrennung();
  549. es->release();
  550. klient->release();
  551. zeit->release();
  552. }
  553. // nicht constant
  554. bool ESKlient::erhalten()
  555. {
  556. char ret = 0;
  557. if( encrypted )
  558. {
  559. if( !klient->sendeEncrypted( "\1", 1 ) )
  560. return 0;
  561. if( !klient->getNachrichtEncrypted( &ret, 1 ) )
  562. return 0;
  563. if( ret == 1 )
  564. {
  565. klient->sendeEncrypted( "\1", 1 );
  566. abgemeldet = 1;
  567. letzteErhaltung = -60;
  568. return 0;
  569. }
  570. }
  571. else
  572. {
  573. if( !klient->sende( "\1", 1 ) )
  574. return 0;
  575. if( !klient->getNachricht( &ret, 1 ) )
  576. return 0;
  577. if( ret == 1 )
  578. {
  579. klient->sende( "\1", 1 );
  580. abgemeldet = 1;
  581. letzteErhaltung = -60;
  582. return 0;
  583. }
  584. }
  585. letzteErhaltung = sekunden;
  586. return 1;
  587. }
  588. void ESKlient::thread()
  589. {
  590. bool erhalten = 0;
  591. bool br = 0;
  592. while( 1 )
  593. {
  594. char c = 0;
  595. if( ( !encrypted && klient->getNachricht( &c, 1 ) ) || ( encrypted && klient->getNachrichtEncrypted( &c, 1 ) ) )
  596. {
  597. if( !c )
  598. encrypted = 1;
  599. if( c == 1 ) // Klient hat sich verbunden
  600. {
  601. if( encrypted )
  602. klient->getNachrichtEncrypted( (char *)& klientNummer, 4 );
  603. else
  604. klient->getNachricht( (char *)& klientNummer, 4 );
  605. if( !es->zDB()->proveKlient( klientNummer, es->getId() ) )
  606. {
  607. klientNummer = 0;
  608. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  609. }
  610. else
  611. {
  612. if( encrypted )
  613. {
  614. Text *key = es->zDB()->getKlientKey( klientNummer );
  615. if( !key )
  616. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  617. else
  618. {
  619. klient->sendeEncrypted( "\1", 1 );
  620. klient->setEmpfangKey( *key, key->getLength() );
  621. klient->setSendeKey( *key, key->getLength() );
  622. key->release();
  623. }
  624. }
  625. else
  626. klient->sende( "\1", 1 );
  627. erhalten = 1;
  628. th->start();
  629. br = 1;
  630. }
  631. }
  632. else if( c == 3 )
  633. {
  634. if( encrypted )
  635. klient->sendeEncrypted( "\1", 1 );
  636. else
  637. klient->sende( "\1", 1 );
  638. br = 1;
  639. }
  640. else
  641. {
  642. }
  643. }
  644. else
  645. br = 1;
  646. if( br )
  647. break;
  648. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  649. es->addGesendet( klient->getUploadBytes( 1 ) );
  650. }
  651. while( erhalten )
  652. {
  653. Sleep( 1000 );
  654. zeit->messungEnde();
  655. zeit->messungStart();
  656. sekunden += zeit->getSekunden();
  657. if( letzteErhaltung <= sekunden - 60 ) // erhaltung time out
  658. {
  659. if( !abgemeldet )
  660. {
  661. std::cout << "IS: Der Klient " << klientNummer << " antwortet nicht mehr.\n";
  662. std::cout.flush();
  663. }
  664. int accountId = es->zDB()->clientIstEingeloggt( klientNummer );
  665. if( accountId )
  666. {
  667. Array< int > *ret = new Array< int >();
  668. int anzahl = es->zDB()->logoutKlient( klientNummer, ret );
  669. if( anzahl > 0 )
  670. {
  671. int jetzt = 0;
  672. int chAnz = ret->get( jetzt );
  673. jetzt++;
  674. for( int i = 0; i < chAnz; i++ )
  675. {
  676. int chatroomId = ret->get( jetzt );
  677. jetzt++;
  678. if( chatroomId )
  679. {
  680. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  681. weiter->spielerLeavesChatroom( chatroomId, accountId );
  682. weiter->release();
  683. if( ret->get( jetzt ) )
  684. {
  685. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  686. weiter->setChatroomAdmin( chatroomId, es->zDB()->getChatroomAdmin( chatroomId ) );
  687. weiter->release();
  688. }
  689. jetzt++;
  690. }
  691. }
  692. if( ret->get( jetzt ) == 1 )
  693. {
  694. jetzt++;
  695. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  696. weiter->spielErstelltAbbrechen( ret->get( jetzt ) );
  697. weiter->release();
  698. }
  699. jetzt++;
  700. if( ret->get( jetzt ) == 1 )
  701. {
  702. jetzt++;
  703. int gruppeId = ret->get( jetzt );
  704. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  705. weiter->spielerLeavesGruppe( gruppeId, accountId );
  706. weiter->release();
  707. jetzt++;
  708. if( ret->get( jetzt ) )
  709. {
  710. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  711. weiter->setGruppeAdmin( gruppeId, es->zDB()->getGruppeAdmin( gruppeId ) );
  712. weiter->release();
  713. }
  714. }
  715. else if( ret->get( jetzt ) == 2 )
  716. {
  717. jetzt++;
  718. int gruppeId = ret->get( jetzt );
  719. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  720. weiter->kickSpielerAusGruppe( gruppeId );
  721. weiter->release();
  722. }
  723. }
  724. ret->release();
  725. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  726. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  727. weiter->patchServerKlientAbsturz( klientNummer );
  728. weiter->registerServerKlientAbsturz( klientNummer );
  729. weiter->loginServerKlientAbsturz( klientNummer );
  730. weiter->informationServerKlientAbsturz( klientNummer );
  731. weiter->chatServerKlientAbsturz( klientNummer );
  732. weiter->anmeldungServerKlientAbsturz( klientNummer );
  733. weiter->spielServerKlientAbsturz( klientNummer );
  734. weiter->shopServerKlientAbsturz( klientNummer );
  735. weiter->historieServerKlientAbsturz( klientNummer );
  736. weiter->newsServerKlientAbsturz( klientNummer );
  737. weiter->kartenServerKlientAbsturz( klientNummer );
  738. weiter->editorServerKlientAbsturz( klientNummer );
  739. weiter->minigameServerKlientAbsturz( klientNummer );
  740. weiter->release();
  741. es->zDB()->removeKlient( klientNummer );
  742. }
  743. else
  744. {
  745. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  746. if( !abgemeldet )
  747. {
  748. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  749. weiter->patchServerKlientAbsturz( klientNummer );
  750. weiter->registerServerKlientAbsturz( klientNummer );
  751. weiter->loginServerKlientAbsturz( klientNummer );
  752. weiter->informationServerKlientAbsturz( klientNummer );
  753. weiter->chatServerKlientAbsturz( klientNummer );
  754. weiter->anmeldungServerKlientAbsturz( klientNummer );
  755. weiter->spielServerKlientAbsturz( klientNummer );
  756. weiter->shopServerKlientAbsturz( klientNummer );
  757. weiter->historieServerKlientAbsturz( klientNummer );
  758. weiter->newsServerKlientAbsturz( klientNummer );
  759. weiter->kartenServerKlientAbsturz( klientNummer );
  760. weiter->editorServerKlientAbsturz( klientNummer );
  761. weiter->minigameServerKlientAbsturz( klientNummer );
  762. weiter->release();
  763. es->zDB()->removeKlient( klientNummer );
  764. }
  765. }
  766. break;
  767. }
  768. }
  769. delete this;
  770. }
  771. // constant
  772. void ESKlient::errorZuKlient( const char *nachricht ) const
  773. {
  774. if( encrypted )
  775. {
  776. klient->sendeEncrypted( "\3", 1 );
  777. char len = (char)textLength( nachricht );
  778. klient->sendeEncrypted( &len, 1 );
  779. klient->sendeEncrypted( nachricht, len );
  780. }
  781. else
  782. {
  783. klient->sende( "\3", 1 );
  784. char len = (char)textLength( nachricht );
  785. klient->sende( &len, 1 );
  786. klient->sende( nachricht, len );
  787. }
  788. }
  789. // Inhalt der ESGWeiterleitung Klasse aus ErhaltungServer.h
  790. // Konstruktor
  791. ESGWeiterleitung::ESGWeiterleitung( ErhaltungServer * es )
  792. {
  793. this->es = es;
  794. ref = 1;
  795. }
  796. // Destruktor
  797. ESGWeiterleitung::~ESGWeiterleitung()
  798. {
  799. es->release();
  800. }
  801. // nicht constant
  802. bool ESGWeiterleitung::patchServerKlientAbsturz( int klientId )
  803. {
  804. Text *ip = new Text();
  805. int port = 0;
  806. if( !es->zDB()->getPatchServer( klientId, ip, &port ) )
  807. {
  808. ip->release();
  809. return 0;
  810. }
  811. Klient *k = new Klient();
  812. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  813. k->setSendeKey( (char *)key, 20 );
  814. k->setEmpfangKey( (char *)key, 20 );
  815. k->verbinde( (unsigned short)port, ip->getText() );
  816. ip->release();
  817. char ret = 0;
  818. k->sende( "\0", 1 ); // Verkeyung aktivieren
  819. k->sendeEncrypted( "\2\2", 2 );
  820. k->sendeEncrypted( (char *)& klientId, 4 );
  821. k->getNachrichtEncrypted( &ret, 1 );
  822. bool erf = ret == 1;
  823. k->sendeEncrypted( "\3", 1 );
  824. k->getNachrichtEncrypted( &ret, 1 );
  825. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  826. es->addGesendet( k->getUploadBytes( 1 ) );
  827. k->trenne();
  828. k->release();
  829. return erf;
  830. }
  831. bool ESGWeiterleitung::registerServerKlientAbsturz( int klientId )
  832. {
  833. Text *ip = new Text();
  834. int port = 0;
  835. if( !es->zDB()->getRegisterServer( klientId, ip, &port ) )
  836. {
  837. ip->release();
  838. return 0;
  839. }
  840. Klient *k = new Klient();
  841. unsigned char key[ 20 ] = { 186, 186, 179, 126, 216, 207, 123, 154, 168, 149, 51, 221, 6, 193, 160, 141, 164, 126, 44, 242 };
  842. k->setSendeKey( (char *)key, 20 );
  843. k->setEmpfangKey( (char *)key, 20 );
  844. k->verbinde( (unsigned short)port, ip->getText() );
  845. ip->release();
  846. char ret = 0;
  847. k->sendeEncrypted( "\2\2", 2 );
  848. k->sendeEncrypted( (char *)& klientId, 4 );
  849. k->getNachrichtEncrypted( &ret, 1 );
  850. bool erf = ret == 1;
  851. k->sendeEncrypted( "\3", 1 );
  852. k->getNachrichtEncrypted( &ret, 1 );
  853. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  854. es->addGesendet( k->getUploadBytes( 1 ) );
  855. k->trenne();
  856. k->release();
  857. return erf;
  858. }
  859. bool ESGWeiterleitung::loginServerKlientAbsturz( int klientId )
  860. {
  861. Text *ip = new Text();
  862. int port = 0;
  863. if( !es->zDB()->getLoginServer( klientId, ip, &port ) )
  864. {
  865. ip->release();
  866. return 0;
  867. }
  868. Klient *k = new Klient();
  869. unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  870. k->setSendeKey( (char *)key, 20 );
  871. k->setEmpfangKey( (char *)key, 20 );
  872. k->verbinde( (unsigned short)port, ip->getText() );
  873. ip->release();
  874. char ret = 0;
  875. k->sendeEncrypted( "\2\2", 2 );
  876. k->sendeEncrypted( (char *)& klientId, 4 );
  877. k->getNachrichtEncrypted( &ret, 1 );
  878. bool erf = ret == 1;
  879. k->sendeEncrypted( "\3", 1 );
  880. k->getNachrichtEncrypted( &ret, 1 );
  881. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  882. es->addGesendet( k->getUploadBytes( 1 ) );
  883. k->trenne();
  884. k->release();
  885. return erf;
  886. }
  887. bool ESGWeiterleitung::informationServerKlientAbsturz( int klientId )
  888. {
  889. Text *ip = new Text();
  890. int port = 0;
  891. if( !es->zDB()->getInformationServer( klientId, ip, &port ) )
  892. {
  893. ip->release();
  894. return 0;
  895. }
  896. Klient *k = new Klient();
  897. unsigned char key[ 20 ] = { 231, 246, 125, 32, 88, 172, 229, 223, 246, 138, 74, 64, 142, 245, 217, 218, 162, 62, 103, 50 };
  898. k->setSendeKey( (char *)key, 20 );
  899. k->setEmpfangKey( (char *)key, 20 );
  900. k->verbinde( (unsigned short)port, ip->getText() );
  901. ip->release();
  902. char ret = 0;
  903. k->sendeEncrypted( "\2\2", 2 );
  904. k->sendeEncrypted( (char *)& klientId, 4 );
  905. k->getNachrichtEncrypted( &ret, 1 );
  906. bool erf = ret == 1;
  907. k->sendeEncrypted( "\3", 1 );
  908. k->getNachrichtEncrypted( &ret, 1 );
  909. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  910. es->addGesendet( k->getUploadBytes( 1 ) );
  911. k->trenne();
  912. k->release();
  913. return erf;
  914. }
  915. bool ESGWeiterleitung::chatServerKlientAbsturz( int klientId )
  916. {
  917. Text *ip = new Text();
  918. int port = 0;
  919. if( !es->zDB()->getChatServer( klientId, ip, &port ) )
  920. {
  921. ip->release();
  922. return 0;
  923. }
  924. Klient *k = new Klient();
  925. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  926. k->setSendeKey( (char *)key, 20 );
  927. k->setEmpfangKey( (char *)key, 20 );
  928. k->verbinde( (unsigned short)port, ip->getText() );
  929. ip->release();
  930. char ret = 0;
  931. k->sendeEncrypted( "\2\2", 2 );
  932. k->sendeEncrypted( (char *)& klientId, 4 );
  933. k->getNachrichtEncrypted( &ret, 1 );
  934. bool erf = ret == 1;
  935. k->sendeEncrypted( "\3", 1 );
  936. k->getNachrichtEncrypted( &ret, 1 );
  937. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  938. es->addGesendet( k->getUploadBytes( 1 ) );
  939. k->trenne();
  940. k->release();
  941. return erf;
  942. }
  943. bool ESGWeiterleitung::anmeldungServerKlientAbsturz( int klientId )
  944. {
  945. Text *ip = new Text();
  946. int port = 0;
  947. if( !es->zDB()->getAnmeldungServer( klientId, ip, &port ) )
  948. {
  949. ip->release();
  950. return 0;
  951. }
  952. Klient *k = new Klient();
  953. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  954. k->setSendeKey( (char *)key, 20 );
  955. k->setEmpfangKey( (char *)key, 20 );
  956. k->verbinde( (unsigned short)port, ip->getText() );
  957. ip->release();
  958. char ret = 0;
  959. k->sendeEncrypted( "\2\2", 2 );
  960. k->sendeEncrypted( (char *)& klientId, 4 );
  961. k->getNachrichtEncrypted( &ret, 1 );
  962. bool erf = ret == 1;
  963. k->sendeEncrypted( "\3", 1 );
  964. k->getNachrichtEncrypted( &ret, 1 );
  965. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  966. es->addGesendet( k->getUploadBytes( 1 ) );
  967. k->trenne();
  968. k->release();
  969. return erf;
  970. }
  971. bool ESGWeiterleitung::spielServerKlientAbsturz( int klientId )
  972. {
  973. Text *ip = new Text();
  974. int port = 0;
  975. if( !es->zDB()->getSpielServer( klientId, ip, &port ) )
  976. {
  977. ip->release();
  978. return 0;
  979. }
  980. Klient *k = new Klient();
  981. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  982. k->setSendeKey( (char *)key, 20 );
  983. k->setEmpfangKey( (char *)key, 20 );
  984. k->verbinde( (unsigned short)port, ip->getText() );
  985. ip->release();
  986. char ret = 0;
  987. k->sendeEncrypted( "\2\2", 2 );
  988. k->sendeEncrypted( (char *)& klientId, 4 );
  989. k->getNachrichtEncrypted( &ret, 1 );
  990. bool erf = ret == 1;
  991. k->sendeEncrypted( "\3", 1 );
  992. k->getNachrichtEncrypted( &ret, 1 );
  993. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  994. es->addGesendet( k->getUploadBytes( 1 ) );
  995. k->trenne();
  996. k->release();
  997. return erf;
  998. }
  999. bool ESGWeiterleitung::shopServerKlientAbsturz( int klientId )
  1000. {
  1001. Text *ip = new Text();
  1002. int port = 0;
  1003. if( !es->zDB()->getShopServer( klientId, ip, &port ) )
  1004. {
  1005. ip->release();
  1006. return 0;
  1007. }
  1008. Klient *k = new Klient();
  1009. unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  1010. k->setSendeKey( (char *)key, 20 );
  1011. k->setEmpfangKey( (char *)key, 20 );
  1012. k->verbinde( (unsigned short)port, ip->getText() );
  1013. ip->release();
  1014. char ret = 0;
  1015. k->sendeEncrypted( "\2\2", 2 );
  1016. k->sendeEncrypted( (char *)& klientId, 4 );
  1017. k->getNachrichtEncrypted( &ret, 1 );
  1018. bool erf = ret == 1;
  1019. k->sendeEncrypted( "\3", 1 );
  1020. k->getNachrichtEncrypted( &ret, 1 );
  1021. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1022. es->addGesendet( k->getUploadBytes( 1 ) );
  1023. k->trenne();
  1024. k->release();
  1025. return erf;
  1026. }
  1027. bool ESGWeiterleitung::historieServerKlientAbsturz( int klientId )
  1028. {
  1029. Text *ip = new Text();
  1030. int port = 0;
  1031. if( !es->zDB()->getHistorieServer( klientId, ip, &port ) )
  1032. {
  1033. ip->release();
  1034. return 0;
  1035. }
  1036. Klient *k = new Klient();
  1037. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  1038. k->setSendeKey( (char *)key, 20 );
  1039. k->setEmpfangKey( (char *)key, 20 );
  1040. k->verbinde( (unsigned short)port, ip->getText() );
  1041. ip->release();
  1042. char ret = 0;
  1043. k->sendeEncrypted( "\2\2", 2 );
  1044. k->sendeEncrypted( (char *)& klientId, 4 );
  1045. k->getNachrichtEncrypted( &ret, 1 );
  1046. bool erf = ret == 1;
  1047. k->sendeEncrypted( "\3", 1 );
  1048. k->getNachrichtEncrypted( &ret, 1 );
  1049. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1050. es->addGesendet( k->getUploadBytes( 1 ) );
  1051. k->trenne();
  1052. k->release();
  1053. return erf;
  1054. }
  1055. bool ESGWeiterleitung::newsServerKlientAbsturz( int klientId )
  1056. {
  1057. Text *ip = new Text();
  1058. int port = 0;
  1059. if( !es->zDB()->getNewsServer( klientId, ip, &port ) )
  1060. {
  1061. ip->release();
  1062. return 0;
  1063. }
  1064. Klient *k = new Klient();
  1065. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  1066. k->setSendeKey( (char *)key, 20 );
  1067. k->setEmpfangKey( (char *)key, 20 );
  1068. k->verbinde( (unsigned short)port, ip->getText() );
  1069. ip->release();
  1070. char ret = 0;
  1071. k->sendeEncrypted( "\2\2", 2 );
  1072. k->sendeEncrypted( (char *)& klientId, 4 );
  1073. k->getNachrichtEncrypted( &ret, 1 );
  1074. bool erf = ret == 1;
  1075. k->sendeEncrypted( "\3", 1 );
  1076. k->getNachrichtEncrypted( &ret, 1 );
  1077. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1078. es->addGesendet( k->getUploadBytes( 1 ) );
  1079. k->trenne();
  1080. k->release();
  1081. return erf;
  1082. }
  1083. bool ESGWeiterleitung::kartenServerKlientAbsturz( int klientId )
  1084. {
  1085. Text *ip = new Text();
  1086. int port = 0;
  1087. if( !es->zDB()->getKartenServer( klientId, ip, &port ) )
  1088. {
  1089. ip->release();
  1090. return 0;
  1091. }
  1092. Klient *k = new Klient();
  1093. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  1094. k->setSendeKey( (char *)key, 20 );
  1095. k->setEmpfangKey( (char *)key, 20 );
  1096. k->verbinde( (unsigned short)port, ip->getText() );
  1097. ip->release();
  1098. char ret = 0;
  1099. k->sendeEncrypted( "\2\2", 2 );
  1100. k->sendeEncrypted( (char *)& klientId, 4 );
  1101. k->getNachrichtEncrypted( &ret, 1 );
  1102. bool erf = ret == 1;
  1103. k->sendeEncrypted( "\3", 1 );
  1104. k->getNachrichtEncrypted( &ret, 1 );
  1105. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1106. es->addGesendet( k->getUploadBytes( 1 ) );
  1107. k->trenne();
  1108. k->release();
  1109. return erf;
  1110. }
  1111. bool ESGWeiterleitung::editorServerKlientAbsturz( int klientId )
  1112. {
  1113. Text *ip = new Text();
  1114. int port = 0;
  1115. if( !es->zDB()->getEditorServer( klientId, ip, &port ) )
  1116. {
  1117. ip->release();
  1118. return 0;
  1119. }
  1120. Klient *k = new Klient();
  1121. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  1122. k->setSendeKey( (char *)key, 20 );
  1123. k->setEmpfangKey( (char *)key, 20 );
  1124. k->verbinde( (unsigned short)port, ip->getText() );
  1125. ip->release();
  1126. char ret = 0;
  1127. k->sendeEncrypted( "\2\2", 2 );
  1128. k->sendeEncrypted( (char *)& klientId, 4 );
  1129. k->getNachrichtEncrypted( &ret, 1 );
  1130. bool erf = ret == 1;
  1131. k->sendeEncrypted( "\3", 1 );
  1132. k->getNachrichtEncrypted( &ret, 1 );
  1133. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1134. es->addGesendet( k->getUploadBytes( 1 ) );
  1135. k->trenne();
  1136. k->release();
  1137. return erf;
  1138. }
  1139. bool ESGWeiterleitung::minigameServerKlientAbsturz( int klientId )
  1140. {
  1141. Text *ip = new Text();
  1142. int port = 0;
  1143. if( !es->zDB()->getMinigameServer( klientId, ip, &port ) )
  1144. {
  1145. ip->release();
  1146. return 0;
  1147. }
  1148. Klient *k = new Klient();
  1149. unsigned char key[ 20 ] = { 88, 103, 192, 232, 69, 54, 57, 3, 239, 138, 234, 172, 126, 72, 81, 55, 205, 97, 59, 255 };
  1150. k->setSendeKey( (char *)key, 20 );
  1151. k->setEmpfangKey( (char *)key, 20 );
  1152. k->verbinde( (unsigned short)port, ip->getText() );
  1153. ip->release();
  1154. char ret = 0;
  1155. k->sendeEncrypted( "\2\2", 2 );
  1156. k->sendeEncrypted( (char *)& klientId, 4 );
  1157. k->getNachrichtEncrypted( &ret, 1 );
  1158. bool erf = ret == 1;
  1159. k->sendeEncrypted( "\3", 1 );
  1160. k->getNachrichtEncrypted( &ret, 1 );
  1161. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1162. es->addGesendet( k->getUploadBytes( 1 ) );
  1163. k->trenne();
  1164. k->release();
  1165. return erf;
  1166. }
  1167. bool ESGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
  1168. {
  1169. bool ret = 1;
  1170. Text *ip = new Text( "" );
  1171. int port = 0;
  1172. ret = ret & es->zDB()->getSpielServer( spielErstelltId, ip, &port );
  1173. if( ip->getLength() )
  1174. {
  1175. Klient *klient = new Klient();
  1176. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1177. klient->setSendeKey( (char *)key, 20 );
  1178. klient->setEmpfangKey( (char *)key, 20 );
  1179. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1180. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  1181. char res = 0;
  1182. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1183. if( res )
  1184. {
  1185. ret = ret & klient->sendeEncrypted( (char *)& spielErstelltId, 4 );
  1186. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1187. }
  1188. ret = (char)ret & res;
  1189. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  1190. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1191. ret = (char)ret & res;
  1192. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1193. es->addGesendet( klient->getUploadBytes( 1 ) );
  1194. klient->trenne();
  1195. klient = klient->release();
  1196. ip->release();
  1197. }
  1198. return ret;
  1199. }
  1200. bool ESGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
  1201. {
  1202. bool ret = 1;
  1203. Array< int > *accId = new Array< int >();
  1204. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1205. for( int i = 0; i < anzahl; i++ )
  1206. {
  1207. int account = accId->get( i );
  1208. if( account == accountId )
  1209. continue;
  1210. Text * ip = new Text( "" );
  1211. int port = 0;
  1212. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1213. if( ip->getLength() )
  1214. {
  1215. Klient *klient = new Klient();
  1216. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1217. klient->setSendeKey( (char *)key, 20 );
  1218. klient->setEmpfangKey( (char *)key, 20 );
  1219. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1220. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1221. char res = 0;
  1222. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1223. if( res )
  1224. {
  1225. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1226. ret = ret & klient->sendeEncrypted( (char *)& accountId, 4 );
  1227. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1228. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1229. }
  1230. ret = (char)ret & res;
  1231. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1232. res = 0;
  1233. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1234. if( res )
  1235. {
  1236. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1237. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1238. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1239. }
  1240. ret = (char)ret & res;
  1241. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1242. es->addGesendet( klient->getUploadBytes( 1 ) );
  1243. klient->trenne();
  1244. klient = klient->release();
  1245. }
  1246. ip->release();
  1247. }
  1248. accId->release();
  1249. return ret;
  1250. }
  1251. bool ESGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
  1252. {
  1253. if( !adminId || !gruppeId )
  1254. return 0;
  1255. bool ret = 1;
  1256. Array< int > * accId = new Array< int >();
  1257. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1258. for( int i = 0; i < anzahl; i++ )
  1259. {
  1260. int account = accId->get( i );
  1261. Text *ip = new Text( "" );
  1262. int port = 0;
  1263. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1264. if( ip->getLength() )
  1265. {
  1266. Klient *klient = new Klient();
  1267. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1268. klient->setSendeKey( (char *)key, 20 );
  1269. klient->setEmpfangKey( (char *)key, 20 );
  1270. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1271. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1272. char res = 0;
  1273. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1274. if( res )
  1275. {
  1276. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1277. ret = ret & klient->sendeEncrypted( (char *)& adminId, 4 );
  1278. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1279. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1280. }
  1281. ret = (char)ret & res;
  1282. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1283. es->addGesendet( klient->getUploadBytes( 1 ) );
  1284. klient->trenne();
  1285. klient = klient->release();
  1286. }
  1287. ip->release();
  1288. }
  1289. accId->release();
  1290. return ret;
  1291. }
  1292. bool ESGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
  1293. {
  1294. bool ret = 1;
  1295. Array< int > *accId = new Array< int >();
  1296. int anzahl = es->zDB()->getSpielerAusChatroom( chatroomId, accId );
  1297. for( int i = 0; i < anzahl; i++ )
  1298. {
  1299. int account = accId->get( i );
  1300. if( account == accountId )
  1301. continue;
  1302. Text * ip = new Text( "" );
  1303. int port = 0;
  1304. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1305. if( ip->getLength() )
  1306. {
  1307. Klient *klient = new Klient();
  1308. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1309. klient->setSendeKey( (char *)key, 20 );
  1310. klient->setEmpfangKey( (char *)key, 20 );
  1311. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1312. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1313. char res = 0;
  1314. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1315. if( res )
  1316. {
  1317. ret = ret & klient->sendeEncrypted( (char *)& accountId, 4 );
  1318. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1319. ret = ret & klient->sendeEncrypted( (char *)& chatroomId, 4 );
  1320. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1321. }
  1322. ret = (char)ret & res;
  1323. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1324. es->addGesendet( klient->getUploadBytes( 1 ) );
  1325. klient->trenne();
  1326. klient = klient->release();
  1327. }
  1328. ip->release();
  1329. }
  1330. accId->release();
  1331. return ret;
  1332. }
  1333. bool ESGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
  1334. {
  1335. if( !adminId || !chatroomId )
  1336. return 0;
  1337. bool ret = 1;
  1338. Text * ip = new Text( "" );
  1339. int port = 0;
  1340. ret = ret & es->zDB()->getChatServer( adminId, ip, &port );
  1341. if( ip->getLength() )
  1342. {
  1343. Klient *klient = new Klient();
  1344. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1345. klient->setSendeKey( (char *)key, 20 );
  1346. klient->setEmpfangKey( (char *)key, 20 );
  1347. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1348. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1349. char res = 0;
  1350. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1351. if( res )
  1352. {
  1353. ret = ret & klient->sendeEncrypted( (char *)& adminId, 4 );
  1354. ret = ret & klient->sendeEncrypted( (char *)& chatroomId, 4 );
  1355. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1356. }
  1357. ret = (char)ret & res;
  1358. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1359. es->addGesendet( klient->getUploadBytes( 1 ) );
  1360. klient->trenne();
  1361. klient = klient->release();
  1362. }
  1363. ip->release();
  1364. return ret;
  1365. }
  1366. bool ESGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
  1367. {
  1368. if( !gruppeId )
  1369. return 0;
  1370. bool ret = 1;
  1371. Array< int > * accId = new Array< int >();
  1372. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1373. for( int i = 0; i < anzahl; i++ )
  1374. {
  1375. int account = accId->get( i );
  1376. Text *ip = new Text( "" );
  1377. int port = 0;
  1378. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1379. if( ip->getLength() )
  1380. {
  1381. Klient *klient = new Klient();
  1382. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1383. klient->setSendeKey( (char *)key, 20 );
  1384. klient->setEmpfangKey( (char *)key, 20 );
  1385. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1386. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1387. char res = 0;
  1388. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1389. if( res )
  1390. {
  1391. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1392. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1393. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1394. }
  1395. ret = (char)ret & res;
  1396. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1397. es->addGesendet( klient->getUploadBytes( 1 ) );
  1398. klient->trenne();
  1399. klient = klient->release();
  1400. }
  1401. es->zDB()->kickSpielerAusGruppe( gruppeId, account );
  1402. ip->release();
  1403. }
  1404. accId->release();
  1405. return ret;
  1406. }
  1407. // constant
  1408. // Reference Counting
  1409. ESGWeiterleitung *ESGWeiterleitung::getThis()
  1410. {
  1411. ref++;
  1412. return this;
  1413. }
  1414. ESGWeiterleitung *ESGWeiterleitung::release()
  1415. {
  1416. ref--;
  1417. if( !ref )
  1418. delete this;
  1419. return 0;
  1420. }