ErhaltungServer.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  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 = dynamic_cast<InitDatei*>(zIni->getThis());
  22. id = (int)*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 = (SSLSKlient*)klient->release();
  64. Sleep(1000);
  65. return;
  66. }
  67. if (!klient)
  68. continue;
  69. ESAKlient* clHandle = new ESAKlient(klient, dynamic_cast<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, dynamic_cast<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. const 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(dynamic_cast<ErhaltungServer*>(es->getThis()));
  681. weiter->spielerLeavesChatroom(chatroomId, accountId);
  682. weiter->release();
  683. if (ret->get(jetzt))
  684. {
  685. ESGWeiterleitung* weiter = new ESGWeiterleitung(dynamic_cast<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(dynamic_cast<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(dynamic_cast<ErhaltungServer*>(es->getThis()));
  705. weiter->spielerLeavesGruppe(gruppeId, accountId);
  706. weiter->release();
  707. jetzt++;
  708. if (ret->get(jetzt))
  709. {
  710. ESGWeiterleitung* weiter = new ESGWeiterleitung(dynamic_cast<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(dynamic_cast<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(dynamic_cast<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(dynamic_cast<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. : ReferenceCounter()
  793. {
  794. this->es = es;
  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 &= 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 &= klient->verbinde((unsigned short)port, ip->getText());
  1180. ret &= klient->sendeEncrypted("\x8\x1", 2);
  1181. char res = 0;
  1182. ret &= klient->getNachrichtEncrypted(&res, 1);
  1183. if (res)
  1184. {
  1185. ret &= klient->sendeEncrypted((char*)&spielErstelltId, 4);
  1186. ret &= klient->getNachrichtEncrypted(&res, 1);
  1187. }
  1188. ret = (char)ret & res;
  1189. ret &= klient->sendeEncrypted("\x8\x0", 2);
  1190. 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*)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 &= klient->verbinde((unsigned short)port, ip->getText());
  1220. ret &= klient->sendeEncrypted("\5\x15", 2);
  1221. char res = 0;
  1222. ret &= klient->getNachrichtEncrypted(&res, 1);
  1223. if (res)
  1224. {
  1225. ret &= klient->sendeEncrypted((char*)&account, 4);
  1226. ret &= klient->sendeEncrypted((char*)&accountId, 4);
  1227. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  1228. ret &= klient->getNachrichtEncrypted(&res, 1);
  1229. }
  1230. ret = (char)ret & res;
  1231. ret &= klient->sendeEncrypted("\5\x18", 2);
  1232. res = 0;
  1233. ret &= klient->getNachrichtEncrypted(&res, 1);
  1234. if (res)
  1235. {
  1236. ret &= klient->sendeEncrypted((char*)&account, 4);
  1237. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  1238. 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*)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 &= 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 &= klient->verbinde((unsigned short)port, ip->getText());
  1271. ret &= klient->sendeEncrypted("\5\x1B", 2);
  1272. char res = 0;
  1273. ret &= klient->getNachrichtEncrypted(&res, 1);
  1274. if (res)
  1275. {
  1276. ret &= klient->sendeEncrypted((char*)&account, 4);
  1277. ret &= klient->sendeEncrypted((char*)&adminId, 4);
  1278. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  1279. 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*)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 &= 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 &= klient->verbinde((unsigned short)port, ip->getText());
  1312. ret &= klient->sendeEncrypted("\5\xE", 2);
  1313. char res = 0;
  1314. ret &= klient->getNachrichtEncrypted(&res, 1);
  1315. if (res)
  1316. {
  1317. ret &= klient->sendeEncrypted((char*)&accountId, 4);
  1318. ret &= klient->sendeEncrypted((char*)&account, 4);
  1319. ret &= klient->sendeEncrypted((char*)&chatroomId, 4);
  1320. 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*)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 &= 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 &= klient->verbinde((unsigned short)port, ip->getText());
  1348. ret &= klient->sendeEncrypted("\5\x12", 2);
  1349. char res = 0;
  1350. ret &= klient->getNachrichtEncrypted(&res, 1);
  1351. if (res)
  1352. {
  1353. ret &= klient->sendeEncrypted((char*)&adminId, 4);
  1354. ret &= klient->sendeEncrypted((char*)&chatroomId, 4);
  1355. 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*)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 &= 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 &= klient->verbinde((unsigned short)port, ip->getText());
  1386. ret &= klient->sendeEncrypted("\5\x16", 2);
  1387. char res = 0;
  1388. ret &= klient->getNachrichtEncrypted(&res, 1);
  1389. if (res)
  1390. {
  1391. ret &= klient->sendeEncrypted((char*)&account, 4);
  1392. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  1393. 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*)klient->release();
  1400. }
  1401. es->zDB()->kickSpielerAusGruppe(gruppeId, account);
  1402. ip->release();
  1403. }
  1404. accId->release();
  1405. return ret;
  1406. }