LoginServer.cpp 41 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 = *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. 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 = 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 = ret & klient->verbinde( port, ip->getText() );
  887. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  888. char res = 0;
  889. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  890. if( res )
  891. {
  892. ret = ret & klient->sendeEncrypted( (char *)&spielErstelltId, 4 );
  893. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  894. }
  895. ret = (char)ret & res;
  896. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  897. ret = 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 = 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 = ret & klient->verbinde( port, ip->getText() );
  927. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  928. char res = 0;
  929. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  930. if( res )
  931. {
  932. ret = ret & klient->sendeEncrypted( (char *)&account, 4 );
  933. ret = ret & klient->sendeEncrypted( (char *)&accountId, 4 );
  934. ret = ret & klient->sendeEncrypted( (char *)&gruppeId, 4 );
  935. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  936. }
  937. ret = (char)ret & res;
  938. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  939. res = 0;
  940. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  941. if( res )
  942. {
  943. ret = ret & klient->sendeEncrypted( (char *)&account, 4 );
  944. ret = ret & klient->sendeEncrypted( (char *)&gruppeId, 4 );
  945. ret = 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 = 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 = ret & klient->verbinde( port, ip->getText() );
  978. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  979. char res = 0;
  980. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  981. if( res )
  982. {
  983. ret = ret & klient->sendeEncrypted( (char *)&account, 4 );
  984. ret = ret & klient->sendeEncrypted( (char *)&adminId, 4 );
  985. ret = ret & klient->sendeEncrypted( (char *)&gruppeId, 4 );
  986. ret = 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 = 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 = ret & klient->verbinde( port, ip->getText() );
  1019. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1020. char res = 0;
  1021. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1022. if( res )
  1023. {
  1024. ret = ret & klient->sendeEncrypted( (char *)&accountId, 4 );
  1025. ret = ret & klient->sendeEncrypted( (char *)&account, 4 );
  1026. ret = ret & klient->sendeEncrypted( (char *)&chatroomId, 4 );
  1027. ret = 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 = 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 = ret & klient->verbinde( port, ip->getText() );
  1055. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1056. char res = 0;
  1057. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1058. if( res )
  1059. {
  1060. ret = ret & klient->sendeEncrypted( (char *)&adminId, 4 );
  1061. ret = ret & klient->sendeEncrypted( (char *)&chatroomId, 4 );
  1062. ret = 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. }