LoginServer.cpp 30 KB

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