ErhaltungServer.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480
  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. {
  505. this->zKlient = zKlient;
  506. ref = 1;
  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. {
  529. th = new ESKThread( this );
  530. this->klient = klient;
  531. unsigned char key[ 20 ] = { 207, 242, 142, 161, 148, 107, 131, 33, 172, 68, 91, 169, 81, 106, 69, 131, 207, 56, 166, 248 };
  532. klient->setSendeKey( (char *)key, 20 );
  533. klient->setEmpfangKey( (char *)key, 20 );
  534. zeit = new ZeitMesser();
  535. zeit->messungStart();
  536. sekunden = 0;
  537. letzteErhaltung = 0;
  538. abgemeldet = 0;
  539. klientNummer = 0;
  540. this->es = es;
  541. encrypted = 0;
  542. }
  543. // Destruktor
  544. ESKlient::~ESKlient()
  545. {
  546. th->release();
  547. es->clientTrennung();
  548. es->release();
  549. klient->release();
  550. zeit->release();
  551. }
  552. // nicht constant
  553. bool ESKlient::erhalten()
  554. {
  555. char ret = 0;
  556. if( encrypted )
  557. {
  558. if( !klient->sendeEncrypted( "\1", 1 ) )
  559. return 0;
  560. if( !klient->getNachrichtEncrypted( &ret, 1 ) )
  561. return 0;
  562. if( ret == 1 )
  563. {
  564. klient->sendeEncrypted( "\1", 1 );
  565. abgemeldet = 1;
  566. letzteErhaltung = -60;
  567. return 0;
  568. }
  569. }
  570. else
  571. {
  572. if( !klient->sende( "\1", 1 ) )
  573. return 0;
  574. if( !klient->getNachricht( &ret, 1 ) )
  575. return 0;
  576. if( ret == 1 )
  577. {
  578. klient->sende( "\1", 1 );
  579. abgemeldet = 1;
  580. letzteErhaltung = -60;
  581. return 0;
  582. }
  583. }
  584. letzteErhaltung = sekunden;
  585. return 1;
  586. }
  587. void ESKlient::thread()
  588. {
  589. bool erhalten = 0;
  590. bool br = 0;
  591. while( 1 )
  592. {
  593. char c = 0;
  594. if( ( !encrypted && klient->getNachricht( &c, 1 ) ) || ( encrypted && klient->getNachrichtEncrypted( &c, 1 ) ) )
  595. {
  596. if( !c )
  597. encrypted = 1;
  598. if( c == 1 ) // Klient hat sich verbunden
  599. {
  600. if( encrypted )
  601. klient->getNachrichtEncrypted( (char *)& klientNummer, 4 );
  602. else
  603. klient->getNachricht( (char *)& klientNummer, 4 );
  604. if( !es->zDB()->proveKlient( klientNummer, es->getId() ) )
  605. {
  606. klientNummer = 0;
  607. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  608. }
  609. else
  610. {
  611. if( encrypted )
  612. {
  613. Text *key = es->zDB()->getKlientKey( klientNummer );
  614. if( !key )
  615. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  616. else
  617. {
  618. klient->sendeEncrypted( "\1", 1 );
  619. klient->setEmpfangKey( *key, key->getLength() );
  620. klient->setSendeKey( *key, key->getLength() );
  621. key->release();
  622. }
  623. }
  624. else
  625. klient->sende( "\1", 1 );
  626. erhalten = 1;
  627. th->start();
  628. br = 1;
  629. }
  630. }
  631. else if( c == 3 )
  632. {
  633. if( encrypted )
  634. klient->sendeEncrypted( "\1", 1 );
  635. else
  636. klient->sende( "\1", 1 );
  637. br = 1;
  638. }
  639. else
  640. {
  641. }
  642. }
  643. else
  644. br = 1;
  645. if( br )
  646. break;
  647. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  648. es->addGesendet( klient->getUploadBytes( 1 ) );
  649. }
  650. while( erhalten )
  651. {
  652. Sleep( 1000 );
  653. zeit->messungEnde();
  654. zeit->messungStart();
  655. sekunden += zeit->getSekunden();
  656. if( letzteErhaltung <= sekunden - 60 ) // erhaltung time out
  657. {
  658. if( !abgemeldet )
  659. {
  660. std::cout << "IS: Der Klient " << klientNummer << " antwortet nicht mehr.\n";
  661. std::cout.flush();
  662. }
  663. int accountId = es->zDB()->clientIstEingeloggt( klientNummer );
  664. if( accountId )
  665. {
  666. Array< int > *ret = new Array< int >();
  667. int anzahl = es->zDB()->logoutKlient( klientNummer, ret );
  668. if( anzahl > 0 )
  669. {
  670. int jetzt = 0;
  671. int chAnz = ret->get( jetzt );
  672. jetzt++;
  673. for( int i = 0; i < chAnz; i++ )
  674. {
  675. int chatroomId = ret->get( jetzt );
  676. jetzt++;
  677. if( chatroomId )
  678. {
  679. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  680. weiter->spielerLeavesChatroom( chatroomId, accountId );
  681. weiter->release();
  682. if( ret->get( jetzt ) )
  683. {
  684. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  685. weiter->setChatroomAdmin( chatroomId, es->zDB()->getChatroomAdmin( chatroomId ) );
  686. weiter->release();
  687. }
  688. jetzt++;
  689. }
  690. }
  691. if( ret->get( jetzt ) == 1 )
  692. {
  693. jetzt++;
  694. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  695. weiter->spielErstelltAbbrechen( ret->get( jetzt ) );
  696. weiter->release();
  697. }
  698. jetzt++;
  699. if( ret->get( jetzt ) == 1 )
  700. {
  701. jetzt++;
  702. int gruppeId = ret->get( jetzt );
  703. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  704. weiter->spielerLeavesGruppe( gruppeId, accountId );
  705. weiter->release();
  706. jetzt++;
  707. if( ret->get( jetzt ) )
  708. {
  709. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  710. weiter->setGruppeAdmin( gruppeId, es->zDB()->getGruppeAdmin( gruppeId ) );
  711. weiter->release();
  712. }
  713. }
  714. else if( ret->get( jetzt ) == 2 )
  715. {
  716. jetzt++;
  717. int gruppeId = ret->get( jetzt );
  718. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  719. weiter->kickSpielerAusGruppe( gruppeId );
  720. weiter->release();
  721. }
  722. }
  723. ret->release();
  724. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  725. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  726. weiter->patchServerKlientAbsturz( klientNummer );
  727. weiter->registerServerKlientAbsturz( klientNummer );
  728. weiter->loginServerKlientAbsturz( klientNummer );
  729. weiter->informationServerKlientAbsturz( klientNummer );
  730. weiter->chatServerKlientAbsturz( klientNummer );
  731. weiter->anmeldungServerKlientAbsturz( klientNummer );
  732. weiter->spielServerKlientAbsturz( klientNummer );
  733. weiter->shopServerKlientAbsturz( klientNummer );
  734. weiter->historieServerKlientAbsturz( klientNummer );
  735. weiter->newsServerKlientAbsturz( klientNummer );
  736. weiter->kartenServerKlientAbsturz( klientNummer );
  737. weiter->editorServerKlientAbsturz( klientNummer );
  738. weiter->minigameServerKlientAbsturz( klientNummer );
  739. weiter->release();
  740. es->zDB()->removeKlient( klientNummer );
  741. }
  742. else
  743. {
  744. es->zDB()->unregisterKlient( klientNummer, es->getId() );
  745. if( !abgemeldet )
  746. {
  747. ESGWeiterleitung *weiter = new ESGWeiterleitung( (ErhaltungServer *)es->getThis() );
  748. weiter->patchServerKlientAbsturz( klientNummer );
  749. weiter->registerServerKlientAbsturz( klientNummer );
  750. weiter->loginServerKlientAbsturz( klientNummer );
  751. weiter->informationServerKlientAbsturz( klientNummer );
  752. weiter->chatServerKlientAbsturz( klientNummer );
  753. weiter->anmeldungServerKlientAbsturz( klientNummer );
  754. weiter->spielServerKlientAbsturz( klientNummer );
  755. weiter->shopServerKlientAbsturz( klientNummer );
  756. weiter->historieServerKlientAbsturz( klientNummer );
  757. weiter->newsServerKlientAbsturz( klientNummer );
  758. weiter->kartenServerKlientAbsturz( klientNummer );
  759. weiter->editorServerKlientAbsturz( klientNummer );
  760. weiter->minigameServerKlientAbsturz( klientNummer );
  761. weiter->release();
  762. es->zDB()->removeKlient( klientNummer );
  763. }
  764. }
  765. break;
  766. }
  767. }
  768. delete this;
  769. }
  770. // constant
  771. void ESKlient::errorZuKlient( const char *nachricht ) const
  772. {
  773. if( encrypted )
  774. {
  775. klient->sendeEncrypted( "\3", 1 );
  776. char len = (char)textLength( nachricht );
  777. klient->sendeEncrypted( &len, 1 );
  778. klient->sendeEncrypted( nachricht, len );
  779. }
  780. else
  781. {
  782. klient->sende( "\3", 1 );
  783. char len = (char)textLength( nachricht );
  784. klient->sende( &len, 1 );
  785. klient->sende( nachricht, len );
  786. }
  787. }
  788. // Inhalt der ESGWeiterleitung Klasse aus ErhaltungServer.h
  789. // Konstruktor
  790. ESGWeiterleitung::ESGWeiterleitung( ErhaltungServer * es )
  791. {
  792. this->es = es;
  793. ref = 1;
  794. }
  795. // Destruktor
  796. ESGWeiterleitung::~ESGWeiterleitung()
  797. {
  798. es->release();
  799. }
  800. // nicht constant
  801. bool ESGWeiterleitung::patchServerKlientAbsturz( int klientId )
  802. {
  803. Text *ip = new Text();
  804. int port = 0;
  805. if( !es->zDB()->getPatchServer( klientId, ip, &port ) )
  806. {
  807. ip->release();
  808. return 0;
  809. }
  810. Klient *k = new Klient();
  811. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  812. k->setSendeKey( (char *)key, 20 );
  813. k->setEmpfangKey( (char *)key, 20 );
  814. k->verbinde( (unsigned short)port, ip->getText() );
  815. ip->release();
  816. char ret = 0;
  817. k->sende( "\0", 1 ); // Verkeyung aktivieren
  818. k->sendeEncrypted( "\2\2", 2 );
  819. k->sendeEncrypted( (char *)& klientId, 4 );
  820. k->getNachrichtEncrypted( &ret, 1 );
  821. bool erf = ret == 1;
  822. k->sendeEncrypted( "\3", 1 );
  823. k->getNachrichtEncrypted( &ret, 1 );
  824. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  825. es->addGesendet( k->getUploadBytes( 1 ) );
  826. k->trenne();
  827. k->release();
  828. return erf;
  829. }
  830. bool ESGWeiterleitung::registerServerKlientAbsturz( int klientId )
  831. {
  832. Text *ip = new Text();
  833. int port = 0;
  834. if( !es->zDB()->getRegisterServer( klientId, ip, &port ) )
  835. {
  836. ip->release();
  837. return 0;
  838. }
  839. Klient *k = new Klient();
  840. unsigned char key[ 20 ] = { 186, 186, 179, 126, 216, 207, 123, 154, 168, 149, 51, 221, 6, 193, 160, 141, 164, 126, 44, 242 };
  841. k->setSendeKey( (char *)key, 20 );
  842. k->setEmpfangKey( (char *)key, 20 );
  843. k->verbinde( (unsigned short)port, ip->getText() );
  844. ip->release();
  845. char ret = 0;
  846. k->sendeEncrypted( "\2\2", 2 );
  847. k->sendeEncrypted( (char *)& klientId, 4 );
  848. k->getNachrichtEncrypted( &ret, 1 );
  849. bool erf = ret == 1;
  850. k->sendeEncrypted( "\3", 1 );
  851. k->getNachrichtEncrypted( &ret, 1 );
  852. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  853. es->addGesendet( k->getUploadBytes( 1 ) );
  854. k->trenne();
  855. k->release();
  856. return erf;
  857. }
  858. bool ESGWeiterleitung::loginServerKlientAbsturz( int klientId )
  859. {
  860. Text *ip = new Text();
  861. int port = 0;
  862. if( !es->zDB()->getLoginServer( klientId, ip, &port ) )
  863. {
  864. ip->release();
  865. return 0;
  866. }
  867. Klient *k = new Klient();
  868. unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  869. k->setSendeKey( (char *)key, 20 );
  870. k->setEmpfangKey( (char *)key, 20 );
  871. k->verbinde( (unsigned short)port, ip->getText() );
  872. ip->release();
  873. char ret = 0;
  874. k->sendeEncrypted( "\2\2", 2 );
  875. k->sendeEncrypted( (char *)& klientId, 4 );
  876. k->getNachrichtEncrypted( &ret, 1 );
  877. bool erf = ret == 1;
  878. k->sendeEncrypted( "\3", 1 );
  879. k->getNachrichtEncrypted( &ret, 1 );
  880. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  881. es->addGesendet( k->getUploadBytes( 1 ) );
  882. k->trenne();
  883. k->release();
  884. return erf;
  885. }
  886. bool ESGWeiterleitung::informationServerKlientAbsturz( int klientId )
  887. {
  888. Text *ip = new Text();
  889. int port = 0;
  890. if( !es->zDB()->getInformationServer( klientId, ip, &port ) )
  891. {
  892. ip->release();
  893. return 0;
  894. }
  895. Klient *k = new Klient();
  896. unsigned char key[ 20 ] = { 231, 246, 125, 32, 88, 172, 229, 223, 246, 138, 74, 64, 142, 245, 217, 218, 162, 62, 103, 50 };
  897. k->setSendeKey( (char *)key, 20 );
  898. k->setEmpfangKey( (char *)key, 20 );
  899. k->verbinde( (unsigned short)port, ip->getText() );
  900. ip->release();
  901. char ret = 0;
  902. k->sendeEncrypted( "\2\2", 2 );
  903. k->sendeEncrypted( (char *)& klientId, 4 );
  904. k->getNachrichtEncrypted( &ret, 1 );
  905. bool erf = ret == 1;
  906. k->sendeEncrypted( "\3", 1 );
  907. k->getNachrichtEncrypted( &ret, 1 );
  908. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  909. es->addGesendet( k->getUploadBytes( 1 ) );
  910. k->trenne();
  911. k->release();
  912. return erf;
  913. }
  914. bool ESGWeiterleitung::chatServerKlientAbsturz( int klientId )
  915. {
  916. Text *ip = new Text();
  917. int port = 0;
  918. if( !es->zDB()->getChatServer( klientId, ip, &port ) )
  919. {
  920. ip->release();
  921. return 0;
  922. }
  923. Klient *k = new Klient();
  924. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  925. k->setSendeKey( (char *)key, 20 );
  926. k->setEmpfangKey( (char *)key, 20 );
  927. k->verbinde( (unsigned short)port, ip->getText() );
  928. ip->release();
  929. char ret = 0;
  930. k->sendeEncrypted( "\2\2", 2 );
  931. k->sendeEncrypted( (char *)& klientId, 4 );
  932. k->getNachrichtEncrypted( &ret, 1 );
  933. bool erf = ret == 1;
  934. k->sendeEncrypted( "\3", 1 );
  935. k->getNachrichtEncrypted( &ret, 1 );
  936. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  937. es->addGesendet( k->getUploadBytes( 1 ) );
  938. k->trenne();
  939. k->release();
  940. return erf;
  941. }
  942. bool ESGWeiterleitung::anmeldungServerKlientAbsturz( int klientId )
  943. {
  944. Text *ip = new Text();
  945. int port = 0;
  946. if( !es->zDB()->getAnmeldungServer( klientId, ip, &port ) )
  947. {
  948. ip->release();
  949. return 0;
  950. }
  951. Klient *k = new Klient();
  952. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  953. k->setSendeKey( (char *)key, 20 );
  954. k->setEmpfangKey( (char *)key, 20 );
  955. k->verbinde( (unsigned short)port, ip->getText() );
  956. ip->release();
  957. char ret = 0;
  958. k->sendeEncrypted( "\2\2", 2 );
  959. k->sendeEncrypted( (char *)& klientId, 4 );
  960. k->getNachrichtEncrypted( &ret, 1 );
  961. bool erf = ret == 1;
  962. k->sendeEncrypted( "\3", 1 );
  963. k->getNachrichtEncrypted( &ret, 1 );
  964. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  965. es->addGesendet( k->getUploadBytes( 1 ) );
  966. k->trenne();
  967. k->release();
  968. return erf;
  969. }
  970. bool ESGWeiterleitung::spielServerKlientAbsturz( int klientId )
  971. {
  972. Text *ip = new Text();
  973. int port = 0;
  974. if( !es->zDB()->getSpielServer( klientId, ip, &port ) )
  975. {
  976. ip->release();
  977. return 0;
  978. }
  979. Klient *k = new Klient();
  980. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  981. k->setSendeKey( (char *)key, 20 );
  982. k->setEmpfangKey( (char *)key, 20 );
  983. k->verbinde( (unsigned short)port, ip->getText() );
  984. ip->release();
  985. char ret = 0;
  986. k->sendeEncrypted( "\2\2", 2 );
  987. k->sendeEncrypted( (char *)& klientId, 4 );
  988. k->getNachrichtEncrypted( &ret, 1 );
  989. bool erf = ret == 1;
  990. k->sendeEncrypted( "\3", 1 );
  991. k->getNachrichtEncrypted( &ret, 1 );
  992. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  993. es->addGesendet( k->getUploadBytes( 1 ) );
  994. k->trenne();
  995. k->release();
  996. return erf;
  997. }
  998. bool ESGWeiterleitung::shopServerKlientAbsturz( int klientId )
  999. {
  1000. Text *ip = new Text();
  1001. int port = 0;
  1002. if( !es->zDB()->getShopServer( klientId, ip, &port ) )
  1003. {
  1004. ip->release();
  1005. return 0;
  1006. }
  1007. Klient *k = new Klient();
  1008. unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  1009. k->setSendeKey( (char *)key, 20 );
  1010. k->setEmpfangKey( (char *)key, 20 );
  1011. k->verbinde( (unsigned short)port, ip->getText() );
  1012. ip->release();
  1013. char ret = 0;
  1014. k->sendeEncrypted( "\2\2", 2 );
  1015. k->sendeEncrypted( (char *)& klientId, 4 );
  1016. k->getNachrichtEncrypted( &ret, 1 );
  1017. bool erf = ret == 1;
  1018. k->sendeEncrypted( "\3", 1 );
  1019. k->getNachrichtEncrypted( &ret, 1 );
  1020. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1021. es->addGesendet( k->getUploadBytes( 1 ) );
  1022. k->trenne();
  1023. k->release();
  1024. return erf;
  1025. }
  1026. bool ESGWeiterleitung::historieServerKlientAbsturz( int klientId )
  1027. {
  1028. Text *ip = new Text();
  1029. int port = 0;
  1030. if( !es->zDB()->getHistorieServer( klientId, ip, &port ) )
  1031. {
  1032. ip->release();
  1033. return 0;
  1034. }
  1035. Klient *k = new Klient();
  1036. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  1037. k->setSendeKey( (char *)key, 20 );
  1038. k->setEmpfangKey( (char *)key, 20 );
  1039. k->verbinde( (unsigned short)port, ip->getText() );
  1040. ip->release();
  1041. char ret = 0;
  1042. k->sendeEncrypted( "\2\2", 2 );
  1043. k->sendeEncrypted( (char *)& klientId, 4 );
  1044. k->getNachrichtEncrypted( &ret, 1 );
  1045. bool erf = ret == 1;
  1046. k->sendeEncrypted( "\3", 1 );
  1047. k->getNachrichtEncrypted( &ret, 1 );
  1048. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1049. es->addGesendet( k->getUploadBytes( 1 ) );
  1050. k->trenne();
  1051. k->release();
  1052. return erf;
  1053. }
  1054. bool ESGWeiterleitung::newsServerKlientAbsturz( int klientId )
  1055. {
  1056. Text *ip = new Text();
  1057. int port = 0;
  1058. if( !es->zDB()->getNewsServer( klientId, ip, &port ) )
  1059. {
  1060. ip->release();
  1061. return 0;
  1062. }
  1063. Klient *k = new Klient();
  1064. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  1065. k->setSendeKey( (char *)key, 20 );
  1066. k->setEmpfangKey( (char *)key, 20 );
  1067. k->verbinde( (unsigned short)port, ip->getText() );
  1068. ip->release();
  1069. char ret = 0;
  1070. k->sendeEncrypted( "\2\2", 2 );
  1071. k->sendeEncrypted( (char *)& klientId, 4 );
  1072. k->getNachrichtEncrypted( &ret, 1 );
  1073. bool erf = ret == 1;
  1074. k->sendeEncrypted( "\3", 1 );
  1075. k->getNachrichtEncrypted( &ret, 1 );
  1076. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1077. es->addGesendet( k->getUploadBytes( 1 ) );
  1078. k->trenne();
  1079. k->release();
  1080. return erf;
  1081. }
  1082. bool ESGWeiterleitung::kartenServerKlientAbsturz( int klientId )
  1083. {
  1084. Text *ip = new Text();
  1085. int port = 0;
  1086. if( !es->zDB()->getKartenServer( klientId, ip, &port ) )
  1087. {
  1088. ip->release();
  1089. return 0;
  1090. }
  1091. Klient *k = new Klient();
  1092. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  1093. k->setSendeKey( (char *)key, 20 );
  1094. k->setEmpfangKey( (char *)key, 20 );
  1095. k->verbinde( (unsigned short)port, ip->getText() );
  1096. ip->release();
  1097. char ret = 0;
  1098. k->sendeEncrypted( "\2\2", 2 );
  1099. k->sendeEncrypted( (char *)& klientId, 4 );
  1100. k->getNachrichtEncrypted( &ret, 1 );
  1101. bool erf = ret == 1;
  1102. k->sendeEncrypted( "\3", 1 );
  1103. k->getNachrichtEncrypted( &ret, 1 );
  1104. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1105. es->addGesendet( k->getUploadBytes( 1 ) );
  1106. k->trenne();
  1107. k->release();
  1108. return erf;
  1109. }
  1110. bool ESGWeiterleitung::editorServerKlientAbsturz( int klientId )
  1111. {
  1112. Text *ip = new Text();
  1113. int port = 0;
  1114. if( !es->zDB()->getEditorServer( klientId, ip, &port ) )
  1115. {
  1116. ip->release();
  1117. return 0;
  1118. }
  1119. Klient *k = new Klient();
  1120. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  1121. k->setSendeKey( (char *)key, 20 );
  1122. k->setEmpfangKey( (char *)key, 20 );
  1123. k->verbinde( (unsigned short)port, ip->getText() );
  1124. ip->release();
  1125. char ret = 0;
  1126. k->sendeEncrypted( "\2\2", 2 );
  1127. k->sendeEncrypted( (char *)& klientId, 4 );
  1128. k->getNachrichtEncrypted( &ret, 1 );
  1129. bool erf = ret == 1;
  1130. k->sendeEncrypted( "\3", 1 );
  1131. k->getNachrichtEncrypted( &ret, 1 );
  1132. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1133. es->addGesendet( k->getUploadBytes( 1 ) );
  1134. k->trenne();
  1135. k->release();
  1136. return erf;
  1137. }
  1138. bool ESGWeiterleitung::minigameServerKlientAbsturz( int klientId )
  1139. {
  1140. Text *ip = new Text();
  1141. int port = 0;
  1142. if( !es->zDB()->getMinigameServer( klientId, ip, &port ) )
  1143. {
  1144. ip->release();
  1145. return 0;
  1146. }
  1147. Klient *k = new Klient();
  1148. unsigned char key[ 20 ] = { 88, 103, 192, 232, 69, 54, 57, 3, 239, 138, 234, 172, 126, 72, 81, 55, 205, 97, 59, 255 };
  1149. k->setSendeKey( (char *)key, 20 );
  1150. k->setEmpfangKey( (char *)key, 20 );
  1151. k->verbinde( (unsigned short)port, ip->getText() );
  1152. ip->release();
  1153. char ret = 0;
  1154. k->sendeEncrypted( "\2\2", 2 );
  1155. k->sendeEncrypted( (char *)& klientId, 4 );
  1156. k->getNachrichtEncrypted( &ret, 1 );
  1157. bool erf = ret == 1;
  1158. k->sendeEncrypted( "\3", 1 );
  1159. k->getNachrichtEncrypted( &ret, 1 );
  1160. es->addEmpfangen( k->getDownloadBytes( 1 ) );
  1161. es->addGesendet( k->getUploadBytes( 1 ) );
  1162. k->trenne();
  1163. k->release();
  1164. return erf;
  1165. }
  1166. bool ESGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
  1167. {
  1168. bool ret = 1;
  1169. Text *ip = new Text( "" );
  1170. int port = 0;
  1171. ret = ret & es->zDB()->getSpielServer( spielErstelltId, ip, &port );
  1172. if( ip->getLength() )
  1173. {
  1174. Klient *klient = new Klient();
  1175. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1176. klient->setSendeKey( (char *)key, 20 );
  1177. klient->setEmpfangKey( (char *)key, 20 );
  1178. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1179. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  1180. char res = 0;
  1181. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1182. if( res )
  1183. {
  1184. ret = ret & klient->sendeEncrypted( (char *)& spielErstelltId, 4 );
  1185. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1186. }
  1187. ret = (char)ret & res;
  1188. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  1189. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1190. ret = (char)ret & res;
  1191. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1192. es->addGesendet( klient->getUploadBytes( 1 ) );
  1193. klient->trenne();
  1194. klient = klient->release();
  1195. ip->release();
  1196. }
  1197. return ret;
  1198. }
  1199. bool ESGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
  1200. {
  1201. bool ret = 1;
  1202. Array< int > *accId = new Array< int >();
  1203. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1204. for( int i = 0; i < anzahl; i++ )
  1205. {
  1206. int account = accId->get( i );
  1207. if( account == accountId )
  1208. continue;
  1209. Text * ip = new Text( "" );
  1210. int port = 0;
  1211. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1212. if( ip->getLength() )
  1213. {
  1214. Klient *klient = new Klient();
  1215. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1216. klient->setSendeKey( (char *)key, 20 );
  1217. klient->setEmpfangKey( (char *)key, 20 );
  1218. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1219. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1220. char res = 0;
  1221. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1222. if( res )
  1223. {
  1224. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1225. ret = ret & klient->sendeEncrypted( (char *)& accountId, 4 );
  1226. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1227. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1228. }
  1229. ret = (char)ret & res;
  1230. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1231. res = 0;
  1232. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1233. if( res )
  1234. {
  1235. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1236. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1237. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1238. }
  1239. ret = (char)ret & res;
  1240. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1241. es->addGesendet( klient->getUploadBytes( 1 ) );
  1242. klient->trenne();
  1243. klient = klient->release();
  1244. }
  1245. ip->release();
  1246. }
  1247. accId->release();
  1248. return ret;
  1249. }
  1250. bool ESGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
  1251. {
  1252. if( !adminId || !gruppeId )
  1253. return 0;
  1254. bool ret = 1;
  1255. Array< int > * accId = new Array< int >();
  1256. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1257. for( int i = 0; i < anzahl; i++ )
  1258. {
  1259. int account = accId->get( i );
  1260. Text *ip = new Text( "" );
  1261. int port = 0;
  1262. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1263. if( ip->getLength() )
  1264. {
  1265. Klient *klient = new Klient();
  1266. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1267. klient->setSendeKey( (char *)key, 20 );
  1268. klient->setEmpfangKey( (char *)key, 20 );
  1269. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1270. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1271. char res = 0;
  1272. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1273. if( res )
  1274. {
  1275. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1276. ret = ret & klient->sendeEncrypted( (char *)& adminId, 4 );
  1277. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1278. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1279. }
  1280. ret = (char)ret & res;
  1281. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1282. es->addGesendet( klient->getUploadBytes( 1 ) );
  1283. klient->trenne();
  1284. klient = klient->release();
  1285. }
  1286. ip->release();
  1287. }
  1288. accId->release();
  1289. return ret;
  1290. }
  1291. bool ESGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
  1292. {
  1293. bool ret = 1;
  1294. Array< int > *accId = new Array< int >();
  1295. int anzahl = es->zDB()->getSpielerAusChatroom( chatroomId, accId );
  1296. for( int i = 0; i < anzahl; i++ )
  1297. {
  1298. int account = accId->get( i );
  1299. if( account == accountId )
  1300. continue;
  1301. Text * ip = new Text( "" );
  1302. int port = 0;
  1303. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1304. if( ip->getLength() )
  1305. {
  1306. Klient *klient = new Klient();
  1307. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1308. klient->setSendeKey( (char *)key, 20 );
  1309. klient->setEmpfangKey( (char *)key, 20 );
  1310. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1311. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1312. char res = 0;
  1313. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1314. if( res )
  1315. {
  1316. ret = ret & klient->sendeEncrypted( (char *)& accountId, 4 );
  1317. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1318. ret = ret & klient->sendeEncrypted( (char *)& chatroomId, 4 );
  1319. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1320. }
  1321. ret = (char)ret & res;
  1322. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1323. es->addGesendet( klient->getUploadBytes( 1 ) );
  1324. klient->trenne();
  1325. klient = klient->release();
  1326. }
  1327. ip->release();
  1328. }
  1329. accId->release();
  1330. return ret;
  1331. }
  1332. bool ESGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
  1333. {
  1334. if( !adminId || !chatroomId )
  1335. return 0;
  1336. bool ret = 1;
  1337. Text * ip = new Text( "" );
  1338. int port = 0;
  1339. ret = ret & es->zDB()->getChatServer( adminId, ip, &port );
  1340. if( ip->getLength() )
  1341. {
  1342. Klient *klient = new Klient();
  1343. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1344. klient->setSendeKey( (char *)key, 20 );
  1345. klient->setEmpfangKey( (char *)key, 20 );
  1346. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1347. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1348. char res = 0;
  1349. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1350. if( res )
  1351. {
  1352. ret = ret & klient->sendeEncrypted( (char *)& adminId, 4 );
  1353. ret = ret & klient->sendeEncrypted( (char *)& chatroomId, 4 );
  1354. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1355. }
  1356. ret = (char)ret & res;
  1357. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1358. es->addGesendet( klient->getUploadBytes( 1 ) );
  1359. klient->trenne();
  1360. klient = klient->release();
  1361. }
  1362. ip->release();
  1363. return ret;
  1364. }
  1365. bool ESGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
  1366. {
  1367. if( !gruppeId )
  1368. return 0;
  1369. bool ret = 1;
  1370. Array< int > * accId = new Array< int >();
  1371. int anzahl = es->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1372. for( int i = 0; i < anzahl; i++ )
  1373. {
  1374. int account = accId->get( i );
  1375. Text *ip = new Text( "" );
  1376. int port = 0;
  1377. ret = ret & es->zDB()->getChatServer( account, ip, &port );
  1378. if( ip->getLength() )
  1379. {
  1380. Klient *klient = new Klient();
  1381. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1382. klient->setSendeKey( (char *)key, 20 );
  1383. klient->setEmpfangKey( (char *)key, 20 );
  1384. ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
  1385. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1386. char res = 0;
  1387. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1388. if( res )
  1389. {
  1390. ret = ret & klient->sendeEncrypted( (char *)& account, 4 );
  1391. ret = ret & klient->sendeEncrypted( (char *)& gruppeId, 4 );
  1392. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1393. }
  1394. ret = (char)ret & res;
  1395. es->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1396. es->addGesendet( klient->getUploadBytes( 1 ) );
  1397. klient->trenne();
  1398. klient = klient->release();
  1399. }
  1400. es->zDB()->kickSpielerAusGruppe( gruppeId, account );
  1401. ip->release();
  1402. }
  1403. accId->release();
  1404. return ret;
  1405. }
  1406. // constant
  1407. // Reference Counting
  1408. ESGWeiterleitung *ESGWeiterleitung::getThis()
  1409. {
  1410. ref++;
  1411. return this;
  1412. }
  1413. ESGWeiterleitung *ESGWeiterleitung::release()
  1414. {
  1415. ref--;
  1416. if( !ref )
  1417. delete this;
  1418. return 0;
  1419. }