LoginServer.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  1. #include "LoginServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der LoginServer Klasse aus LoginServer.h
  6. // Konstruktor
  7. LoginServer::LoginServer(InitDatei* zIni)
  8. : Thread()
  9. {
  10. Network::Start(100);
  11. std::cout << "LS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new LSDatenbank(zIni);
  13. klients = new RCArray< LSKlient >();
  14. empfangen = 0;
  15. gesendet = 0;
  16. fehler = new Text();
  17. ini = dynamic_cast<InitDatei*>(zIni->getThis());
  18. id = (int)*zIni->zWert("ServerId");
  19. server = new Server();
  20. aServer = new SSLServer();
  21. aServer->setPrivateKeyPassword(zIni->zWert("SSLPasswort")->getText());
  22. aServer->setCertificateFile(zIni->zWert("SSLCert")->getText());
  23. aServer->setPrivateKeyFile(zIni->zWert("SSLKey")->getText());
  24. std::cout << "LS: Starten des Admin Servers...\n";
  25. if (!aServer->verbinde((unsigned short)TextZuInt(ini->zWert("AdminServerPort")->getText(), 10), 10))
  26. {
  27. std::cout << "LS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  28. exit(1);
  29. }
  30. db->setServerStatus(id, 2);
  31. end = 0;
  32. nichtPausiert = 0;
  33. InitializeCriticalSection(&cs);
  34. if (zIni->zWert("Aktiv")->istGleich("TRUE"))
  35. {
  36. serverStarten();
  37. serverFortsetzen();
  38. }
  39. }
  40. // Destruktor
  41. LoginServer::~LoginServer()
  42. {
  43. fehler->release();
  44. server->trenne();
  45. server->release();
  46. aServer->trenne();
  47. aServer->release();
  48. if (klients)
  49. klients->release();
  50. ini->release();
  51. db->release();
  52. DeleteCriticalSection(&cs);
  53. }
  54. // nicht constant
  55. void LoginServer::runn()
  56. {
  57. while (!end && aServer->isConnected())
  58. {
  59. SSLSKlient* klient;
  60. klient = aServer->getKlient();
  61. if (end && klient)
  62. {
  63. klient->trenne();
  64. klient = (SSLSKlient*)klient->release();
  65. Sleep(1000);
  66. return;
  67. }
  68. if (!klient)
  69. continue;
  70. LSAKlient* clHandle = new LSAKlient(klient, dynamic_cast<LoginServer*>(getThis()));
  71. clHandle->start();
  72. }
  73. }
  74. void LoginServer::thread()
  75. {
  76. while (server->isConnected())
  77. {
  78. SKlient* klient;
  79. klient = server->getKlient();
  80. if (!klient)
  81. continue;
  82. Framework::getThreadRegister()->cleanUpClosedThreads();
  83. LSKlient* clHandle = new LSKlient(klient, dynamic_cast<LoginServer*>(getThis()));
  84. EnterCriticalSection(&cs);
  85. klients->add(clHandle);
  86. LeaveCriticalSection(&cs);
  87. clHandle->start();
  88. }
  89. }
  90. void LoginServer::close()
  91. {
  92. db->setServerStatus(id, 1);
  93. server->trenne();
  94. #ifdef WIN32
  95. warteAufThread(1000);
  96. #endif
  97. EnterCriticalSection(&cs);
  98. for (LSKlient* client : *klients)
  99. client->absturz();
  100. klients = (RCArray<LSKlient>*)klients->release();
  101. LeaveCriticalSection(&cs);
  102. ende();
  103. run = 0;
  104. end = 1;
  105. Klient* klient = new Klient();
  106. klient->verbinde(aServer->getPort(), "127.0.0.1");
  107. Sleep(500);
  108. aServer->trenne();
  109. klient->release();
  110. }
  111. bool LoginServer::serverStarten()
  112. {
  113. if (nichtPausiert)
  114. {
  115. fehler->setText("Der Server konnte nicht gestartet werden: Der Server läuft bereits.");
  116. return 0;
  117. }
  118. if (server)
  119. server->release();
  120. server = new Server();
  121. if (server->verbinde((unsigned short)TextZuInt(ini->zWert("ServerPort")->getText(), 10), 10))
  122. {
  123. nichtPausiert = 1;
  124. start();
  125. return 1;
  126. }
  127. else
  128. {
  129. serverBeenden();
  130. fehler->setText("Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung.");
  131. return 0;
  132. }
  133. }
  134. bool LoginServer::serverPause()
  135. {
  136. if (!nichtPausiert)
  137. {
  138. fehler->setText("Der Server konnte nicht pausiert werden: Der Server läuft nicht.");
  139. return 0;
  140. }
  141. if (!db->setServerStatus(id, 2))
  142. {
  143. fehler->setText("Der Server konnte nicht pausiert werden: ");
  144. fehler->append(db->getLetzterFehler());
  145. return 0;
  146. }
  147. return 1;
  148. }
  149. bool LoginServer::serverFortsetzen()
  150. {
  151. if (!nichtPausiert)
  152. {
  153. fehler->setText("Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht.");
  154. return 0;
  155. }
  156. if (!db->setServerStatus(id, 3))
  157. {
  158. fehler->setText("Der Server konnte nicht fortgesetzt werden: ");
  159. fehler->append(db->getLetzterFehler());
  160. return 0;
  161. }
  162. return 1;
  163. }
  164. bool LoginServer::serverBeenden()
  165. {
  166. if (!nichtPausiert)
  167. {
  168. fehler->setText("Der Server konnte nicht beendet werden: Der Server läuft nicht.");
  169. return 0;
  170. }
  171. if (db->serverIstNichtPausiert(id))
  172. {
  173. fehler->setText("Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden.");
  174. return 0;
  175. }
  176. nichtPausiert = 0;
  177. ende();
  178. if (server)
  179. server->trenne();
  180. return 1;
  181. }
  182. bool LoginServer::setMaxKlients(int mc)
  183. {
  184. if (!db->setMaxClients(id, mc))
  185. {
  186. fehler->setText("Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n");
  187. fehler->append(db->getLetzterFehler());
  188. return 0;
  189. }
  190. ini->setWert("MaxClients", Text() += mc);
  191. return 1;
  192. }
  193. bool LoginServer::absturzKlient(int klientId)
  194. {
  195. bool gefunden = 0;
  196. EnterCriticalSection(&cs);
  197. int index = 0;
  198. for (LSKlient* client : *klients)
  199. {
  200. if (client->getKlientNummer() == klientId)
  201. {
  202. client->absturz();
  203. klients->remove(index);
  204. gefunden = 1;
  205. break;
  206. }
  207. index++;
  208. }
  209. LeaveCriticalSection(&cs);
  210. return gefunden;
  211. }
  212. bool LoginServer::removeKlient(LSKlient* zKlient)
  213. {
  214. bool gefunden = 0;
  215. EnterCriticalSection(&cs);
  216. int index = 0;
  217. for (LSKlient* client : *klients)
  218. {
  219. if (client == zKlient)
  220. {
  221. klients->remove(index);
  222. gefunden = 1;
  223. break;
  224. }
  225. index++;
  226. }
  227. LeaveCriticalSection(&cs);
  228. return gefunden;
  229. }
  230. void LoginServer::addGesendet(int bytes)
  231. {
  232. gesendet += bytes;
  233. }
  234. void LoginServer::addEmpfangen(int bytes)
  235. {
  236. empfangen += bytes;
  237. }
  238. // constant
  239. bool LoginServer::istAn() const
  240. {
  241. return db->serverIstNichtPausiert(id);
  242. }
  243. Server* LoginServer::zServer() const
  244. {
  245. return server;
  246. }
  247. LSDatenbank* LoginServer::zDB() const
  248. {
  249. return db;
  250. }
  251. bool LoginServer::hatClients() const
  252. {
  253. return klients->hat(0);
  254. }
  255. int LoginServer::getId() const
  256. {
  257. return id;
  258. }
  259. const char* LoginServer::getLetzterFehler() const
  260. {
  261. return fehler->getText();
  262. }
  263. // Inhalt der LSAKlient Klasse aus LoginServer.h
  264. // Konstruktor
  265. LSAKlient::LSAKlient(SSLSKlient* klient, LoginServer* ls)
  266. : Thread()
  267. {
  268. this->klient = klient;
  269. name = new Text("");
  270. passwort = new Text("");
  271. adminId = 0;
  272. version = 0;
  273. this->ls = ls;
  274. }
  275. // Destruktor
  276. LSAKlient::~LSAKlient()
  277. {
  278. klient->trenne();
  279. klient->release();
  280. ls->release();
  281. name->release();
  282. passwort->release();
  283. }
  284. // nicht constant
  285. void LSAKlient::thread()
  286. {
  287. while (1)
  288. {
  289. char c = 0;
  290. if (!klient->getNachricht(&c, 1))
  291. break;
  292. else
  293. {
  294. bool br = 0;
  295. switch (c)
  296. {
  297. case 1: // Login
  298. if (1)
  299. {
  300. klient->sende("\1", 1);
  301. unsigned char nLen = 0;
  302. klient->getNachricht((char*)&nLen, 1);
  303. char* n = new char[nLen + 1];
  304. n[(int)nLen] = 0;
  305. if (nLen)
  306. klient->getNachricht(n, nLen);
  307. unsigned char pLen = 0;
  308. klient->getNachricht((char*)&pLen, 1);
  309. char* p = new char[pLen + 1];
  310. p[(int)pLen] = 0;
  311. if (pLen)
  312. klient->getNachricht(p, pLen);
  313. int adminId = ls->zDB()->istAdministrator(n, p);
  314. if (adminId)
  315. {
  316. klient->sende("\1", 1);
  317. name->setText(n);
  318. passwort->setText(p);
  319. this->adminId = adminId;
  320. }
  321. else
  322. errorZuKlient("Falsche Kombination aus Name und Passwort.");
  323. delete[] n;
  324. delete[] p;
  325. }
  326. break;
  327. case 2: // Logout
  328. adminId = 0;
  329. name->setText("");
  330. passwort->setText("");
  331. klient->sende("\1", 1);
  332. break;
  333. case 3: // Trennen
  334. br = 1;
  335. klient->sende("\1", 1);
  336. break;
  337. case 4: // Server starten
  338. if (!adminId)
  339. errorZuKlient("Du musst dich einloggen.");
  340. else
  341. {
  342. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSStarten))
  343. {
  344. if (!ls->serverStarten())
  345. {
  346. Text* err = new Text();
  347. err->append(ls->getLetzterFehler());
  348. errorZuKlient(err->getText());
  349. err->release();
  350. }
  351. else
  352. klient->sende("\1", 1);
  353. }
  354. else
  355. errorZuKlient("Du bist nicht berechtigt den Server zu starten.");
  356. }
  357. break;
  358. case 5: // Server beenden
  359. if (!adminId)
  360. errorZuKlient("Du musst dich einloggen.");
  361. else
  362. {
  363. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSBeenden))
  364. {
  365. if (ls->serverBeenden())
  366. klient->sende("\1", 1);
  367. else
  368. {
  369. Text* err = new Text();
  370. err->append(ls->getLetzterFehler());
  371. errorZuKlient(err->getText());
  372. err->release();
  373. }
  374. }
  375. else
  376. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  377. }
  378. break;
  379. case 6: // Programm Schließen
  380. if (!adminId)
  381. errorZuKlient("Du musst dich einloggen.");
  382. else
  383. {
  384. bool ok = 0;
  385. if (ls->isRunning())
  386. {
  387. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSBeenden))
  388. {
  389. if (ls->serverBeenden())
  390. ok = 1;
  391. else
  392. {
  393. Text* err = new Text();
  394. err->append(ls->getLetzterFehler());
  395. errorZuKlient(err->getText());
  396. err->release();
  397. }
  398. }
  399. else
  400. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  401. }
  402. else
  403. ok = 1;
  404. if (ok && ls->hatClients())
  405. {
  406. errorZuKlient("Es sind noch Klients Online. Bitte versuche es später erneut.");
  407. break;
  408. }
  409. if (ok)
  410. {
  411. klient->sende("\1", 1);
  412. std::cout << "LS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  413. ls->close();
  414. br = 1;
  415. }
  416. }
  417. break;
  418. case 7: // Progtamm abstürzen
  419. if (!adminId)
  420. errorZuKlient("Du musst dich einloggen.");
  421. else
  422. {
  423. bool ok = 0;
  424. if (ls->isRunning())
  425. {
  426. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSBeenden))
  427. {
  428. ls->serverBeenden();
  429. ok = 1;
  430. }
  431. else
  432. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  433. }
  434. else
  435. ok = 1;
  436. if (ok)
  437. {
  438. klient->sende("\1", 1);
  439. std::cout << "LS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  440. ls->close();
  441. br = 1;
  442. }
  443. }
  444. break;
  445. case 8: // Status Frage
  446. if (1)
  447. {
  448. char status = 0;
  449. if (ls->isRunning())
  450. {
  451. status = 1;
  452. if (ls->istAn())
  453. status = 2;
  454. }
  455. klient->sende("\1", 1);
  456. klient->sende(&status, 1);
  457. }
  458. break;
  459. case 9: // Server pausieren
  460. if (!adminId)
  461. errorZuKlient("Du musst dich einloggen.");
  462. else
  463. {
  464. klient->sende("\1", 1);
  465. char pause = 0;
  466. klient->getNachricht(&pause, 1);
  467. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSPausieren))
  468. {
  469. bool ok = 0;
  470. if (pause)
  471. ok = ls->serverPause();
  472. else
  473. ok = ls->serverFortsetzen();
  474. if (ok)
  475. klient->sende("\1", 1);
  476. else
  477. {
  478. Text* err = new Text();
  479. err->append(ls->getLetzterFehler());
  480. errorZuKlient(err->getText());
  481. err->release();
  482. }
  483. }
  484. else
  485. {
  486. if (pause)
  487. errorZuKlient("Du bist nicht berechtigt den Server zu pausieren.");
  488. else
  489. errorZuKlient("Du bist nicht berechtigt den Server fortzusetzen.");
  490. }
  491. }
  492. break;
  493. case 0xA: // maximale Anzahl der Clients setzen
  494. if (!adminId)
  495. errorZuKlient("Du musst dich einloggen.");
  496. else
  497. {
  498. klient->sende("\1", 1);
  499. int maxC = 0;
  500. klient->getNachricht((char*)&maxC, 4);
  501. if (ls->zDB()->adminHatRecht(adminId, Admin_Recht::LSMCChange))
  502. {
  503. if (ls->setMaxKlients(maxC))
  504. klient->sende("\1", 1);
  505. else
  506. {
  507. Text* err = new Text();
  508. err->append(ls->getLetzterFehler());
  509. errorZuKlient(err->getText());
  510. err->release();
  511. }
  512. }
  513. else
  514. errorZuKlient("Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern.");
  515. }
  516. break;
  517. case 0xC: // klient absturtz
  518. if (1)
  519. {
  520. klient->sende("\1", 1);
  521. int klientId = 0;
  522. klient->getNachricht((char*)&klientId, 4);
  523. if (klientId && ls->absturzKlient(klientId))
  524. klient->sende("\1", 1);
  525. else
  526. klient->sende("\0", 1);
  527. }
  528. break;
  529. default:
  530. errorZuKlient("Unbekannte Nachricht!");
  531. break;
  532. }
  533. if (br)
  534. break;
  535. ls->addEmpfangen(klient->getDownloadBytes(1));
  536. ls->addGesendet(klient->getUploadBytes(1));
  537. }
  538. }
  539. ls->addEmpfangen(klient->getDownloadBytes(1));
  540. ls->addGesendet(klient->getUploadBytes(1));
  541. delete this;
  542. }
  543. void LSAKlient::errorZuKlient(const char* nachricht) const // sendet eine Fehlernachricht zum Klient
  544. {
  545. klient->sende("\3", 1);
  546. char len = (char)textLength(nachricht);
  547. klient->sende(&len, 1);
  548. klient->sende(nachricht, len);
  549. }
  550. // Inhalt der LSKlient aus LoginServer.h
  551. // Konstruktor
  552. LSKlient::LSKlient(SKlient* klient, LoginServer* ls)
  553. : Thread()
  554. {
  555. this->klient = klient;
  556. unsigned char key[20] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  557. klient->setSendeKey((char*)key, 20);
  558. klient->setEmpfangKey((char*)key, 20);
  559. klientNummer = 0;
  560. this->ls = ls;
  561. }
  562. // Destruktor
  563. LSKlient::~LSKlient()
  564. {
  565. klient->release();
  566. ls->release();
  567. }
  568. // nicht constant
  569. void LSKlient::absturz()
  570. {
  571. ende();
  572. klient->trenne();
  573. ls->zDB()->unregisterKlient(klientNummer, ls->getId());
  574. }
  575. void LSKlient::thread()
  576. {
  577. while (1)
  578. {
  579. char c = 0;
  580. if (!klient->getNachrichtEncrypted(&c, 1))
  581. break;
  582. else
  583. {
  584. bool br = 0;
  585. switch (c)
  586. {
  587. case 1: // Klient identifikation
  588. klient->getNachrichtEncrypted((char*)&klientNummer, 4);
  589. if (!ls->zDB()->proveKlient(klientNummer, ls->getId()))
  590. {
  591. klientNummer = 0;
  592. errorZuKlient("Du bist nicht für diesen Server eingetragen");
  593. }
  594. else
  595. {
  596. Text* key = ls->zDB()->getKlientKey(klientNummer);
  597. if (!key)
  598. errorZuKlient("Es konnte kein Schlüssel ermittelt werden.");
  599. else
  600. {
  601. klient->sendeEncrypted("\1", 1);
  602. klient->setEmpfangKey(*key, key->getLength());
  603. klient->setSendeKey(*key, key->getLength());
  604. key->release();
  605. }
  606. }
  607. break;
  608. case 2: // Main / Erhaltung Server message
  609. if (1)
  610. {
  611. char befehl = 0;
  612. klient->getNachrichtEncrypted(&befehl, 1);
  613. switch (befehl)
  614. {
  615. case 2: // klient absturtz
  616. if (1)
  617. {
  618. int klientId = 0;
  619. klient->getNachrichtEncrypted((char*)&klientId, 4);
  620. if (klientId && ls->absturzKlient(klientId))
  621. klient->sendeEncrypted("\1", 1);
  622. else
  623. klient->sendeEncrypted("\0", 1);
  624. }
  625. break;
  626. default:
  627. errorZuKlient("Befehl nicht bekannt!");
  628. break;
  629. }
  630. }
  631. break;
  632. case 3: // Verbindungsende
  633. br = 1;
  634. klient->sendeEncrypted("\1", 1);
  635. break;
  636. case 4: // unregister Klient
  637. if (!klientNummer)
  638. {
  639. errorZuKlient("Du bist nicht Identifiziert.");
  640. break;
  641. }
  642. ls->zDB()->unregisterKlient(klientNummer, ls->getId());
  643. klient->sendeEncrypted("\1", 1);
  644. break;
  645. case 5: // Klient loggt sich ein
  646. if (1)
  647. {
  648. if (!klientNummer)
  649. {
  650. errorZuKlient("Du bist nicht Identifiziert.");
  651. break;
  652. }
  653. klient->sendeEncrypted("\1", 1);
  654. unsigned char byte = 0;
  655. klient->getNachrichtEncrypted((char*)&byte, 1);
  656. char* name = new char[byte + 1];
  657. name[byte] = 0;
  658. klient->getNachrichtEncrypted(name, byte);
  659. klient->getNachrichtEncrypted((char*)&byte, 1);
  660. char* passwort = new char[byte + 1];
  661. passwort[byte] = 0;
  662. klient->getNachrichtEncrypted(passwort, byte);
  663. int accountId = ls->zDB()->getAccountId(name, passwort);
  664. delete[]name;
  665. delete[]passwort;
  666. if (!accountId)
  667. errorZuKlient("Falsche Kombination von Name und Passwort.");
  668. else
  669. {
  670. int ok = ls->zDB()->loginKlient(klientNummer, accountId);
  671. if (ok != 1)
  672. {
  673. if (ok == 0)
  674. errorZuKlient("Falsche Kombination von Name und Passwort.");
  675. if (ok == -1)
  676. errorZuKlient("Du bist bereits eingeloggt.");
  677. if (ok == -2)
  678. {
  679. errorZuKlient("Der Account ist bereits online.");
  680. /*
  681. klient->sende( "\2", 1 );
  682. klient->getNachricht( (char*)&byte, 1 );
  683. if( byte )
  684. {
  685. char *geheim = new char[ byte + 1 ];
  686. geheim[ byte ] = 0;
  687. klient->getNachricht( geheim, byte );
  688. if( ls->zDB()->accountGeheim( accountId, geheim ) )
  689. {
  690. int *ret = ls->zDB()->kickKlient( accountId );
  691. if( ret[ 0 ] )
  692. {
  693. Text **chatServer = ls->zDB()->getChatServerIpPort( ret[ 0 ] );
  694. Klient *server = new Klient();
  695. if( server->verbinde( TextZuInt( chatServer[ 1 ]->getText(), 10 ), chatServer[ 0 ]->getText() ) )
  696. {
  697. server->sende( "\5\1", 2 );
  698. char serverReturn = 0;
  699. server->getNachricht( &serverReturn, 1 );
  700. if( serverReturn == 1 )
  701. {
  702. server->sende( (char*)&accountId, 4 );
  703. server->getNachricht( &serverReturn, 1 );
  704. }
  705. server->sende( "\3", 1 );
  706. server->getNachricht( &serverReturn, 1 );
  707. }
  708. chatServer[ 0 ]->release();
  709. chatServer[ 1 ]->release();
  710. delete[]chatServer;
  711. }
  712. delete[]ret;
  713. klient->sende( "\1", 1 );
  714. unsigned char klientLocIp[ 4 ];
  715. klient->getNachricht( (char*)klientLocIp, 4 );
  716. klient->getNachricht( (char*)&byte, 1 );
  717. char *pcName = new char[ byte + 1 ];
  718. pcName[ byte ] = 0;
  719. klient->getNachricht( pcName, byte );
  720. ls->zDB()->accountOnline( accountId, (char*)klient->getIp(), klientLocIp, pcName );
  721. delete[]pcName;
  722. klient->sende( (char*)&accountId, 4 );
  723. }
  724. else
  725. klient->sende( "\0", 1 );
  726. delete[]geheim;
  727. }*/
  728. }
  729. }
  730. else
  731. {
  732. klient->sendeEncrypted("\1", 1);
  733. unsigned char klientLocIp[4];
  734. klient->getNachrichtEncrypted((char*)klientLocIp, 4);
  735. klient->getNachrichtEncrypted((char*)&byte, 1);
  736. char* pcName = new char[byte + 1];
  737. pcName[byte] = 0;
  738. klient->getNachrichtEncrypted(pcName, byte);
  739. ls->zDB()->accountOnline(accountId, (char*)klient->getIp(), klientLocIp, pcName);
  740. delete[]pcName;
  741. klient->sendeEncrypted((char*)&accountId, 4);
  742. }
  743. }
  744. }
  745. break;
  746. case 6: // Klient loggt sich aus
  747. if (1)
  748. {
  749. if (!klientNummer)
  750. {
  751. errorZuKlient("Du bist nicht Identifiziert.");
  752. break;
  753. }
  754. klient->sendeEncrypted("\1", 1);
  755. int accountId = 0;
  756. klient->getNachrichtEncrypted((char*)&accountId, 4);
  757. Array< int >* ret = new Array< int >();
  758. int anzahl = ls->zDB()->logoutKlient(klientNummer, ret);
  759. if (anzahl > 0)
  760. {
  761. int jetzt = 0;
  762. int chAnz = ret->get(jetzt);
  763. jetzt++;
  764. for (int i = 0; i < chAnz; i++)
  765. {
  766. int chatroomId = ret->get(jetzt);
  767. jetzt++;
  768. if (chatroomId)
  769. {
  770. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  771. weiter->spielerLeavesChatroom(chatroomId, accountId);
  772. weiter->release();
  773. if (ret->get(jetzt))
  774. {
  775. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  776. weiter->setChatroomAdmin(chatroomId, ls->zDB()->getChatroomAdmin(chatroomId));
  777. weiter->release();
  778. }
  779. jetzt++;
  780. }
  781. }
  782. if (ret->get(jetzt) == 1)
  783. {
  784. jetzt++;
  785. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  786. weiter->spielErstelltAbbrechen(ret->get(jetzt));
  787. weiter->release();
  788. }
  789. jetzt++;
  790. if (ret->get(jetzt) == 1)
  791. {
  792. jetzt++;
  793. int gruppeId = ret->get(jetzt);
  794. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  795. weiter->spielerLeavesGruppe(gruppeId, accountId);
  796. weiter->release();
  797. jetzt++;
  798. if (ret->get(jetzt))
  799. {
  800. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  801. weiter->setGruppeAdmin(gruppeId, ls->zDB()->getGruppeAdmin(gruppeId));
  802. weiter->release();
  803. }
  804. }
  805. else if (ret->get(jetzt) == 2)
  806. {
  807. jetzt++;
  808. int gruppeId = ret->get(jetzt);
  809. MSGWeiterleitung* weiter = new MSGWeiterleitung(dynamic_cast<LoginServer*>(ls->getThis()));
  810. weiter->kickSpielerAusGruppe(gruppeId);
  811. weiter->release();
  812. }
  813. jetzt++;
  814. if (ret->get(jetzt) == 1)
  815. klient->sendeEncrypted("\1", 1);
  816. else
  817. errorZuKlient("Logout nicht erfolgreich.");
  818. }
  819. else
  820. errorZuKlient("Logout nicht erfolgreich.");
  821. ret->release();
  822. }
  823. break;
  824. case 0x7: // ping
  825. if (1)
  826. {
  827. if (!klientNummer)
  828. {
  829. errorZuKlient("Du bist nicht Identifiziert.");
  830. break;
  831. }
  832. klient->sendeEncrypted("\1", 1);
  833. }
  834. break;
  835. default:
  836. errorZuKlient("Unbekannte Nachricht!");
  837. break;
  838. }
  839. if (br)
  840. break;
  841. ls->addEmpfangen(klient->getDownloadBytes(1));
  842. ls->addGesendet(klient->getUploadBytes(1));
  843. }
  844. }
  845. ls->addEmpfangen(klient->getDownloadBytes(1));
  846. ls->addGesendet(klient->getUploadBytes(1));
  847. ls->removeKlient(this); // delete this
  848. }
  849. // constant
  850. void LSKlient::errorZuKlient(const char* nachricht) const // sendet eine Fehlernachricht zum Klient
  851. {
  852. klient->sendeEncrypted("\3", 1);
  853. char len = (char)textLength(nachricht);
  854. klient->sendeEncrypted(&len, 1);
  855. klient->sendeEncrypted(nachricht, len);
  856. }
  857. int LSKlient::getKlientNummer() const // gibt die KlientId zurück
  858. {
  859. return klientNummer;
  860. }
  861. // Inhalt der MSGWeiterleitung Klasse aus LoginServer.h
  862. // Konstruktor
  863. MSGWeiterleitung::MSGWeiterleitung(LoginServer* ls)
  864. : ReferenceCounter()
  865. {
  866. this->ls = ls;
  867. }
  868. // Destruktor
  869. MSGWeiterleitung::~MSGWeiterleitung()
  870. {
  871. ls->release();
  872. }
  873. // nicht constant
  874. bool MSGWeiterleitung::spielErstelltAbbrechen(int spielErstelltId)
  875. {
  876. bool ret = 1;
  877. Text* ip = new Text("");
  878. unsigned short port = 0;
  879. ret &= ls->zDB()->getSpielServerPortIp(spielErstelltId, &port, ip);
  880. if (ip->getLength())
  881. {
  882. Klient* klient = new Klient();
  883. unsigned char key[20] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  884. klient->setSendeKey((char*)key, 20);
  885. klient->setEmpfangKey((char*)key, 20);
  886. ret &= klient->verbinde(port, ip->getText());
  887. ret &= klient->sendeEncrypted("\x8\x1", 2);
  888. char res = 0;
  889. ret &= klient->getNachrichtEncrypted(&res, 1);
  890. if (res)
  891. {
  892. ret &= klient->sendeEncrypted((char*)&spielErstelltId, 4);
  893. ret &= klient->getNachrichtEncrypted(&res, 1);
  894. }
  895. ret = (char)ret & res;
  896. ret &= klient->sendeEncrypted("\x8\x0", 2);
  897. ret &= klient->getNachrichtEncrypted(&res, 1);
  898. ret = (char)ret & res;
  899. ls->addEmpfangen(klient->getDownloadBytes(1));
  900. ls->addGesendet(klient->getUploadBytes(1));
  901. klient->trenne();
  902. klient = (Klient*)klient->release();
  903. ip->release();
  904. }
  905. return ret;
  906. }
  907. bool MSGWeiterleitung::spielerLeavesGruppe(int gruppeId, int accountId)
  908. {
  909. bool ret = 1;
  910. Array< int >* accId = new Array< int >();
  911. int anzahl = ls->zDB()->getSpielerAusGruppe(gruppeId, accId);
  912. for (int i = 0; i < anzahl; i++)
  913. {
  914. int account = accId->get(i);
  915. if (account == accountId)
  916. continue;
  917. Text* ip = new Text("");
  918. unsigned short port = 0;
  919. ret &= ls->zDB()->getChatServerPortIp(account, &port, ip);
  920. if (ip->getLength())
  921. {
  922. Klient* klient = new Klient();
  923. unsigned char key[20] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  924. klient->setSendeKey((char*)key, 20);
  925. klient->setEmpfangKey((char*)key, 20);
  926. ret &= klient->verbinde(port, ip->getText());
  927. ret &= klient->sendeEncrypted("\5\x15", 2);
  928. char res = 0;
  929. ret &= klient->getNachrichtEncrypted(&res, 1);
  930. if (res)
  931. {
  932. ret &= klient->sendeEncrypted((char*)&account, 4);
  933. ret &= klient->sendeEncrypted((char*)&accountId, 4);
  934. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  935. ret &= klient->getNachrichtEncrypted(&res, 1);
  936. }
  937. ret = (char)ret & res;
  938. ret &= klient->sendeEncrypted("\5\x18", 2);
  939. res = 0;
  940. ret &= klient->getNachrichtEncrypted(&res, 1);
  941. if (res)
  942. {
  943. ret &= klient->sendeEncrypted((char*)&account, 4);
  944. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  945. ret &= klient->getNachrichtEncrypted(&res, 1);
  946. }
  947. ret = (char)ret & res;
  948. ls->addEmpfangen(klient->getDownloadBytes(1));
  949. ls->addGesendet(klient->getUploadBytes(1));
  950. klient->trenne();
  951. klient = (Klient*)klient->release();
  952. }
  953. ip->release();
  954. }
  955. accId->release();
  956. return ret;
  957. }
  958. bool MSGWeiterleitung::setGruppeAdmin(int gruppeId, int adminId)
  959. {
  960. if (!adminId || !gruppeId)
  961. return 0;
  962. bool ret = 1;
  963. Array< int >* accId = new Array< int >();
  964. int anzahl = ls->zDB()->getSpielerAusGruppe(gruppeId, accId);
  965. for (int i = 0; i < anzahl; i++)
  966. {
  967. int account = accId->get(i);
  968. Text* ip = new Text("");
  969. unsigned short port = 0;
  970. ret &= ls->zDB()->getChatServerPortIp(account, &port, ip);
  971. if (ip->getLength())
  972. {
  973. Klient* klient = new Klient();
  974. unsigned char key[20] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  975. klient->setSendeKey((char*)key, 20);
  976. klient->setEmpfangKey((char*)key, 20);
  977. ret &= klient->verbinde(port, ip->getText());
  978. ret &= klient->sendeEncrypted("\5\x1B", 2);
  979. char res = 0;
  980. ret &= klient->getNachrichtEncrypted(&res, 1);
  981. if (res)
  982. {
  983. ret &= klient->sendeEncrypted((char*)&account, 4);
  984. ret &= klient->sendeEncrypted((char*)&adminId, 4);
  985. ret &= klient->sendeEncrypted((char*)&gruppeId, 4);
  986. ret &= klient->getNachrichtEncrypted(&res, 1);
  987. }
  988. ret = (char)ret & res;
  989. ls->addEmpfangen(klient->getDownloadBytes(1));
  990. ls->addGesendet(klient->getUploadBytes(1));
  991. klient->trenne();
  992. klient = (Klient*)klient->release();
  993. }
  994. ip->release();
  995. }
  996. accId->release();
  997. return ret;
  998. }
  999. bool MSGWeiterleitung::spielerLeavesChatroom(int chatroomId, int accountId)
  1000. {
  1001. bool ret = 1;
  1002. Array< int >* accId = new Array< int >();
  1003. int anzahl = ls->zDB()->getSpielerAusChatroom(chatroomId, accId);
  1004. for (int i = 0; i < anzahl; i++)
  1005. {
  1006. int account = accId->get(i);
  1007. if (account == accountId)
  1008. continue;
  1009. Text* ip = new Text("");
  1010. unsigned short port = 0;
  1011. ret &= ls->zDB()->getChatServerPortIp(account, &port, ip);
  1012. if (ip->getLength())
  1013. {
  1014. Klient* klient = new Klient();
  1015. unsigned char key[20] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1016. klient->setSendeKey((char*)key, 20);
  1017. klient->setEmpfangKey((char*)key, 20);
  1018. ret &= klient->verbinde(port, ip->getText());
  1019. ret &= klient->sendeEncrypted("\5\xE", 2);
  1020. char res = 0;
  1021. ret &= klient->getNachrichtEncrypted(&res, 1);
  1022. if (res)
  1023. {
  1024. ret &= klient->sendeEncrypted((char*)&accountId, 4);
  1025. ret &= klient->sendeEncrypted((char*)&account, 4);
  1026. ret &= klient->sendeEncrypted((char*)&chatroomId, 4);
  1027. ret &= klient->getNachrichtEncrypted(&res, 1);
  1028. }
  1029. ret = (char)ret & res;
  1030. ls->addEmpfangen(klient->getDownloadBytes(1));
  1031. ls->addGesendet(klient->getUploadBytes(1));
  1032. klient->trenne();
  1033. klient = (Klient*)klient->release();
  1034. }
  1035. ip->release();
  1036. }
  1037. accId->release();
  1038. return ret;
  1039. }
  1040. bool MSGWeiterleitung::setChatroomAdmin(int chatroomId, int adminId)
  1041. {
  1042. if (!adminId || !chatroomId)
  1043. return 0;
  1044. bool ret = 1;
  1045. Text* ip = new Text("");
  1046. unsigned short port = 0;
  1047. ret &= ls->zDB()->getChatServerPortIp(adminId, &port, ip);
  1048. if (ip->getLength())
  1049. {
  1050. Klient* klient = new Klient();
  1051. unsigned char key[20] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1052. klient->setSendeKey((char*)key, 20);
  1053. klient->setEmpfangKey((char*)key, 20);
  1054. ret &= klient->verbinde(port, ip->getText());
  1055. ret &= klient->sendeEncrypted("\5\x12", 2);
  1056. char res = 0;
  1057. ret &= klient->getNachrichtEncrypted(&res, 1);
  1058. if (res)
  1059. {
  1060. ret &= klient->sendeEncrypted((char*)&adminId, 4);
  1061. ret &= klient->sendeEncrypted((char*)&chatroomId, 4);
  1062. ret &= klient->getNachrichtEncrypted(&res, 1);
  1063. }
  1064. ret = (char)ret & res;
  1065. ls->addEmpfangen(klient->getDownloadBytes(1));
  1066. ls->addGesendet(klient->getUploadBytes(1));
  1067. klient->trenne();
  1068. klient = (Klient*)klient->release();
  1069. }
  1070. ip->release();
  1071. return ret;
  1072. }
  1073. bool MSGWeiterleitung::kickSpielerAusGruppe(int gruppeId)
  1074. {
  1075. if (!gruppeId)
  1076. return 0;
  1077. bool ret = 1;
  1078. Array< int >* accId = new Array< int >();
  1079. int anzahl = ls->zDB()->getSpielerAusGruppe(gruppeId, accId);
  1080. for (int i = 0; i < anzahl; i++)
  1081. {
  1082. int account = accId->get(i);
  1083. Text* ip = new Text("");
  1084. unsigned short port = 0;
  1085. ret = ret && ls->zDB()->getChatServerPortIp(account, &port, ip);
  1086. if (ip->getLength())
  1087. {
  1088. Klient* klient = new Klient();
  1089. unsigned char key[20] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1090. klient->setSendeKey((char*)key, 20);
  1091. klient->setEmpfangKey((char*)key, 20);
  1092. ret = ret && klient->verbinde(port, ip->getText());
  1093. ret = ret && klient->sendeEncrypted("\5\x16", 2);
  1094. char res = 0;
  1095. ret = ret && klient->getNachrichtEncrypted(&res, 1);
  1096. if (res)
  1097. {
  1098. ret = ret && klient->sendeEncrypted((char*)&account, 4);
  1099. ret = ret && klient->sendeEncrypted((char*)&gruppeId, 4);
  1100. ret = ret && klient->getNachrichtEncrypted(&res, 1);
  1101. }
  1102. ret = (char)ret & res;
  1103. ls->addEmpfangen(klient->getDownloadBytes(1));
  1104. ls->addGesendet(klient->getUploadBytes(1));
  1105. klient->trenne();
  1106. klient = (Klient*)klient->release();
  1107. }
  1108. ls->zDB()->kickSpielerAusGruppe(gruppeId, account);
  1109. ip->release();
  1110. }
  1111. accId->release();
  1112. return ret;
  1113. }