MainServer.cpp 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747
  1. #include "MainServer.h"
  2. #include "Datenbank.h"
  3. #include <Text.h>
  4. #include <iostream>
  5. #include <Klient.h>
  6. #include <Globals.h>
  7. #include <AsynchronCall.h>
  8. // Inhalt der MainServer Klasse aus MainServer.h
  9. // Konstruktor
  10. MainServer::MainServer( InitDatei *zDat )
  11. : Thread()
  12. {
  13. Network::Start( 100 );
  14. std::cout << "MS: Verbindung mit Datenbank wird hergestellt...\n";
  15. db = new MSDatenbank( zDat );
  16. clients = 0;
  17. empfangen = 0;
  18. gesendet = 0;
  19. dat = zDat->getThis();
  20. serverSSL = new SSLServer();
  21. serverSSL->setPrivateKeyPassword( zDat->zWert( "SSLPasswort" )->getText() );
  22. serverSSL->setCertificateFile( zDat->zWert( "SSLCert" )->getText() );
  23. serverSSL->setPrivateKeyFile( zDat->zWert( "SSLKey" )->getText() );
  24. server = new Server();
  25. aServer = new SSLServer();
  26. aServer->setPrivateKeyPassword( zDat->zWert( "SSLPasswort" )->getText() );
  27. aServer->setCertificateFile( zDat->zWert( "SSLCert" )->getText() );
  28. aServer->setPrivateKeyFile( zDat->zWert( "SSLKey" )->getText() );
  29. std::cout << "MS: Starten des Admin Servers...\n";
  30. if( !aServer->verbinde( (unsigned short)TextZuInt( zDat->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  31. {
  32. std::cout << "MS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  33. exit( 1 );
  34. }
  35. end = 0;
  36. InitializeCriticalSection( &cs );
  37. ref = 1;
  38. if( zDat->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  39. serverStarten();
  40. }
  41. // Destruktor
  42. MainServer::~MainServer()
  43. {
  44. ende();
  45. serverSSL->trenne();
  46. serverSSL->release();
  47. server->trenne();
  48. server->release();
  49. aServer->trenne();
  50. aServer->release();
  51. dat->release();
  52. db->release();
  53. Network::Exit();
  54. DeleteCriticalSection( &cs );
  55. }
  56. // nicht constant
  57. void MainServer::runn()
  58. {
  59. while( !end && aServer->isConnected() )
  60. {
  61. SSLSKlient *klient;
  62. klient = aServer->getKlient();
  63. if( end && klient )
  64. {
  65. klient->trenne();
  66. klient = klient->release();
  67. Sleep( 1000 );
  68. return;
  69. }
  70. if( !klient )
  71. continue;
  72. MSAKlient *clHandle = new MSAKlient( klient, getThis() );
  73. clHandle->start();
  74. }
  75. }
  76. void MainServer::thread()
  77. {
  78. SSLServer *sslServer = serverSSL;
  79. int *cl = &clients;
  80. MainServer *ms = this;
  81. AsynchronCall( [ sslServer, cl, ms ]()
  82. {
  83. while( sslServer->isConnected() )
  84. {
  85. SSLSKlient *klient = sslServer->getKlient();
  86. if( !klient )
  87. continue;
  88. Framework::getThreadRegister()->cleanUpClosedThreads();
  89. MSKlientSSL *clHandle = new MSKlientSSL( klient, ms->getThis() );
  90. clHandle->start();
  91. (*cl)++;
  92. }
  93. } );
  94. while( server->isConnected() )
  95. {
  96. SKlient *klient;
  97. klient = server->getKlient();
  98. if( !klient )
  99. continue;
  100. Framework::getThreadRegister()->cleanUpClosedThreads();
  101. MSKlient *clHandle = new MSKlient( klient, getThis() );
  102. clHandle->start();
  103. clients++;
  104. }
  105. run = 0;
  106. }
  107. void MainServer::close()
  108. {
  109. serverSSL->trenne();
  110. server->trenne();
  111. #ifdef WIN32
  112. warteAufThread( 1000 );
  113. #endif
  114. ende();
  115. run = 0;
  116. end = 1;
  117. Klient *klient = new Klient();
  118. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  119. Sleep( 500 );
  120. aServer->trenne();
  121. klient->release();
  122. }
  123. bool MainServer::serverStarten()
  124. {
  125. if( run )
  126. return 1;
  127. bool ret = server->verbinde( (unsigned short)TextZuInt( dat->zWert( "ServerPort" )->getText(), 10 ), 10 );
  128. ret &= serverSSL->verbinde( (unsigned short)TextZuInt( dat->zWert( "SSLPort" )->getText(), 10 ), 10 );
  129. start();
  130. return ret;
  131. }
  132. void MainServer::serverBeenden()
  133. {
  134. if( !run )
  135. return;
  136. server->trenne();
  137. serverSSL->trenne();
  138. #ifdef WIN32
  139. warteAufThread( 1000 );
  140. #endif
  141. ende();
  142. server->release();
  143. server = new Server();
  144. run = 0;
  145. }
  146. void MainServer::addGesendet( int bytes )
  147. {
  148. gesendet += bytes;
  149. }
  150. void MainServer::addEmpfangen( int bytes )
  151. {
  152. empfangen += empfangen;
  153. }
  154. void MainServer::clientTrennung()
  155. {
  156. clients--;
  157. }
  158. // constant
  159. Server *MainServer::zServer() const
  160. {
  161. return server;
  162. }
  163. MSDatenbank *MainServer::zDB() const
  164. {
  165. return db;
  166. }
  167. bool MainServer::hatClients() const
  168. {
  169. return clients > 0;
  170. }
  171. InitDatei *MainServer::zInit() const
  172. {
  173. return dat;
  174. }
  175. // Reference Counting
  176. MainServer *MainServer::getThis()
  177. {
  178. EnterCriticalSection( &cs );
  179. ref++;
  180. LeaveCriticalSection( &cs );
  181. return this;
  182. }
  183. MainServer *MainServer::release()
  184. {
  185. EnterCriticalSection( &cs );
  186. ref--;
  187. LeaveCriticalSection( &cs );
  188. if( !ref )
  189. delete this;
  190. return 0;
  191. }
  192. // Inhalt der MSKlient Klasse aus MainServer.h
  193. // Konstruktor
  194. MSAKlient::MSAKlient( SSLSKlient *klient, MainServer *ms )
  195. : Thread()
  196. {
  197. this->klient = klient;
  198. name = new Text( "" );
  199. passwort = new Text( "" );
  200. adminId = 0;
  201. this->ms = ms;
  202. }
  203. // Destruktor
  204. MSAKlient::~MSAKlient()
  205. {
  206. klient->trenne();
  207. klient->release();
  208. ms->release();
  209. name->release();
  210. passwort->release();
  211. }
  212. // nicht constant
  213. void MSAKlient::thread()
  214. {
  215. while( 1 )
  216. {
  217. char c = 0;
  218. if( !klient->getNachricht( &c, 1 ) )
  219. break;
  220. else
  221. {
  222. bool br = 0;
  223. switch( c )
  224. {
  225. case 1: // Login
  226. if( 1 )
  227. {
  228. klient->sende( "\1", 1 );
  229. unsigned char nLen = 0;
  230. klient->getNachricht( (char*)&nLen, 1 );
  231. char *n = new char[ nLen + 1 ];
  232. n[ (int)nLen ] = 0;
  233. if( nLen )
  234. klient->getNachricht( n, nLen );
  235. unsigned char pLen = 0;
  236. klient->getNachricht( (char*)&pLen, 1 );
  237. char *p = new char[ pLen + 1 ];
  238. p[ (int)pLen ] = 0;
  239. if( pLen )
  240. klient->getNachricht( p, pLen );
  241. int adminId = ms->zDB()->istAdministrator( n, p );
  242. if( adminId )
  243. {
  244. klient->sende( "\1", 1 );
  245. name->setText( n );
  246. passwort->setText( p );
  247. this->adminId = adminId;
  248. }
  249. else
  250. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  251. delete[] n;
  252. delete[] p;
  253. }
  254. break;
  255. case 2: // Logout
  256. adminId = 0;
  257. name->setText( "" );
  258. passwort->setText( "" );
  259. klient->sende( "\1", 1 );
  260. break;
  261. case 3: // Trennen
  262. br = 1;
  263. klient->sende( "\1", 1 );
  264. break;
  265. case 4: // Server starten
  266. if( !adminId )
  267. errorZuKlient( "Du musst dich einloggen." );
  268. else
  269. {
  270. if( ms->zDB()->adminHatRecht( adminId, Admin_Recht::MSStarten ) )
  271. {
  272. if( !ms->serverStarten() )
  273. errorZuKlient( "Beim starten des Servers ist ein Fehler aufgetreten." );
  274. else
  275. klient->sende( "\1", 1 );
  276. }
  277. else
  278. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  279. }
  280. break;
  281. case 5: // Server beenden
  282. if( !adminId )
  283. errorZuKlient( "Du musst dich einloggen." );
  284. else
  285. {
  286. if( ms->zDB()->adminHatRecht( adminId, Admin_Recht::MSBeenden ) )
  287. {
  288. ms->serverBeenden();
  289. klient->sende( "\1", 1 );
  290. }
  291. else
  292. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  293. }
  294. break;
  295. case 6: // Programm Schließen
  296. if( !adminId )
  297. errorZuKlient( "Du musst dich einloggen." );
  298. else
  299. {
  300. bool ok = 0;
  301. if( ms->isRunning() )
  302. {
  303. if( ms->zDB()->adminHatRecht( adminId, Admin_Recht::MSBeenden ) )
  304. {
  305. ms->serverBeenden();
  306. ok = 1;
  307. }
  308. else
  309. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  310. }
  311. else
  312. ok = 1;
  313. if( ok && ms->hatClients() )
  314. {
  315. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  316. break;
  317. }
  318. if( ok )
  319. {
  320. klient->sende( "\1", 1 );
  321. std::cout << "MS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  322. ms->close();
  323. br = 1;
  324. }
  325. }
  326. break;
  327. case 7: // Progtamm abstürzen
  328. if( !adminId )
  329. errorZuKlient( "Du musst dich einloggen." );
  330. else
  331. {
  332. bool ok = 0;
  333. if( ms->isRunning() )
  334. {
  335. if( ms->zDB()->adminHatRecht( adminId, Admin_Recht::MSBeenden ) )
  336. {
  337. ms->serverBeenden();
  338. ok = 1;
  339. }
  340. else
  341. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  342. }
  343. else
  344. ok = 1;
  345. if( ok )
  346. {
  347. klient->sende( "\1", 1 );
  348. std::cout << "MS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  349. ms->close();
  350. br = 1;
  351. }
  352. }
  353. break;
  354. case 8: // Status Frage
  355. if( 1 )
  356. {
  357. klient->sende( "\1", 1 );
  358. char status = (int)ms->isRunning();
  359. klient->sende( &status, 1 );
  360. }
  361. break;
  362. case 9: // Patch Server Liste
  363. if( adminId )
  364. {
  365. Array< ServerData* > d;
  366. if( ms->zDB()->getPatchServerList( &d ) )
  367. klient->sende( "\1", 1 );
  368. else
  369. errorZuKlient( "Fehler beim Abruf der Patch Server Tabelle." );
  370. int anz = d.getEintragAnzahl();
  371. klient->sende( (char*)&anz, 4 );
  372. for( int i = 0; i < anz; i++ )
  373. {
  374. ServerData *s = d.get( i );
  375. klient->sende( (char*)&s->id, 4 );
  376. klient->sende( (char*)&s->port, 2 );
  377. klient->sende( (char*)&s->adminPort, 2 );
  378. unsigned char len = (unsigned char)s->name.getLength();
  379. klient->sende( (char*)&len, 1 );
  380. klient->sende( s->name, len );
  381. len = (unsigned char)s->ip.getLength();
  382. klient->sende( (char*)&len, 1 );
  383. klient->sende( s->ip, len );
  384. len = (unsigned char)s->status.getLength();
  385. klient->sende( (char*)&len, 1 );
  386. klient->sende( s->status, len );
  387. delete s;
  388. }
  389. }
  390. else
  391. errorZuKlient( "Du musst dich einloggen." );
  392. break;
  393. case 10: // get Patch Server Details
  394. {
  395. if( adminId )
  396. {
  397. klient->sende( "\1", 1 );
  398. int id = 0;
  399. klient->getNachricht( (char*)&id, 4 );
  400. ServerDetails d;
  401. if( ms->zDB()->getPatchServerDetails( id, &d ) )
  402. {
  403. klient->sende( "\1", 1 );
  404. unsigned char len = (unsigned char)d.name.getLength();
  405. klient->sende( (char*)&len, 1 );
  406. klient->sende( d.name, len );
  407. len = (unsigned char)d.ip.getLength();
  408. klient->sende( (char*)&len, 1 );
  409. klient->sende( d.ip, len );
  410. klient->sende( (char*)&d.port, 2 );
  411. klient->sende( (char*)&d.adminPort, 2 );
  412. klient->sende( (char*)&d.tasks, 4 );
  413. klient->sende( (char*)&d.maxTasks, 4 );
  414. }
  415. else
  416. errorZuKlient( "Fehler beim abrufen der Server Details." );
  417. }
  418. else
  419. errorZuKlient( "Du musst dich einloggen." );
  420. break;
  421. }
  422. default:
  423. errorZuKlient( "Unbekannte Nachricht!" );
  424. break;
  425. }
  426. if( br )
  427. break;
  428. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  429. ms->addGesendet( klient->getUploadBytes( 1 ) );
  430. }
  431. }
  432. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  433. ms->addGesendet( klient->getUploadBytes( 1 ) );
  434. delete this;
  435. }
  436. void MSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  437. {
  438. klient->sende( "\3", 1 );
  439. char len = (char)textLength( nachricht );
  440. klient->sende( &len, 1 );
  441. klient->sende( nachricht, len );
  442. }
  443. // Konstruktor
  444. MSKlientSSL::MSKlientSSL( SSLSKlient *klient, MainServer *ms )
  445. {
  446. this->klient = klient;
  447. klientNummer = 0;
  448. this->ms = ms;
  449. }
  450. // Destruktor
  451. MSKlientSSL::~MSKlientSSL()
  452. {
  453. ms->clientTrennung();
  454. ms->release();
  455. klient->release();
  456. }
  457. // nicht constant
  458. void MSKlientSSL::thread()
  459. {
  460. while( 1 )
  461. {
  462. char c = 0;
  463. if( !klient->getNachricht( &c, 1 ) )
  464. break;
  465. else
  466. {
  467. bool br = 0;
  468. switch( c )
  469. {
  470. case 1: // Client Identifikation
  471. if( !klientNummer )
  472. {
  473. klientNummer = ms->zDB()->getNextClientId();
  474. Text *key = ms->zDB()->getKlientKey( klientNummer );
  475. if( key )
  476. {
  477. int port = TextZuInt( ms->zInit()->zWert( "ServerPort" )->getText(), 10 );
  478. klient->sende( "\1", 1 );
  479. klient->sende( (char*)&port, 4 );
  480. klient->sende( (char*)&klientNummer, 4 );
  481. char len = (char)key->getLength();
  482. klient->sende( &len, 1 );
  483. if( len )
  484. klient->sende( key->getText(), len );
  485. key->release();
  486. }
  487. else
  488. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  489. }
  490. else
  491. errorZuKlient( "Du besitzt bereits eine Klient Nummer." );
  492. break;
  493. case 3: // Verbindungsende
  494. br = 1;
  495. klient->sende( "\1", 1 );
  496. break;
  497. default:
  498. errorZuKlient( "Unbekannte Nachricht!\0" );
  499. break;
  500. }
  501. if( br )
  502. break;
  503. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  504. ms->addGesendet( klient->getUploadBytes( 1 ) );
  505. }
  506. }
  507. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  508. ms->addGesendet( klient->getUploadBytes( 1 ) );
  509. delete this;
  510. }
  511. void MSKlientSSL::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  512. {
  513. klient->sende( "\3", 1 );
  514. char len = (char)textLength( nachricht );
  515. klient->sende( &len, 1 );
  516. klient->sende( nachricht, len );
  517. }
  518. // Inhalt der MSKlient Klasse aus MainServer.h
  519. // Konstruktor
  520. MSKlient::MSKlient( SKlient *klient, MainServer *ms )
  521. : Thread()
  522. {
  523. this->klient = klient;
  524. unsigned char key[ 20 ] = { 199, 164, 172, 55, 246, 16, 155, 8, 151, 176, 250, 181, 227, 133, 30, 41, 200, 26, 7, 151 };
  525. klient->setSendeKey( (char*)key, 20 );
  526. klient->setEmpfangKey( (char*)key, 20 );
  527. klientNummer = 0;
  528. this->ms = ms;
  529. encrypted = 0;
  530. }
  531. // Destruktor
  532. MSKlient::~MSKlient()
  533. {
  534. ms->clientTrennung();
  535. ms->release();
  536. klient->release();
  537. }
  538. // nicht constant
  539. void MSKlient::thread()
  540. {
  541. while( 1 )
  542. {
  543. char c = 0;
  544. if( ( !encrypted && !klient->getNachricht( &c, 1 ) ) || ( encrypted && !klient->getNachrichtEncrypted( &c, 1 ) ) )
  545. break;
  546. else
  547. {
  548. bool br = 0;
  549. switch( c )
  550. {
  551. case 0:
  552. encrypted = 1;
  553. break;
  554. case 1: // Client Identifikation
  555. if( 1 )
  556. {
  557. if( encrypted )
  558. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  559. else
  560. klient->getNachricht( (char*)&klientNummer, 4 );
  561. bool ret1 = 0;
  562. if( !klientNummer )
  563. {
  564. klientNummer = ms->zDB()->getNextClientId();
  565. if( encrypted )
  566. {
  567. Text *key = ms->zDB()->getKlientKey( klientNummer );
  568. if( key )
  569. {
  570. klient->sendeEncrypted( "\1", 1 );
  571. klient->sendeEncrypted( (char*)&klientNummer, 4 );
  572. char len = (char)key->getLength();
  573. klient->sendeEncrypted( &len, 1 );
  574. if( len )
  575. klient->sendeEncrypted( key->getText(), len );
  576. klient->setEmpfangKey( *key, len );
  577. klient->setSendeKey( *key, len );
  578. key->release();
  579. }
  580. else
  581. errorZuKlient( "Es konnte kein Schlüssel ermittelt werden." );
  582. }
  583. else
  584. {
  585. klient->sende( "\1", 1 );
  586. klient->sende( (char*)&klientNummer, 4 );
  587. }
  588. ret1 = 1;
  589. }
  590. if( !ms->zDB()->proveRegisteredClient( klientNummer ) )
  591. errorZuKlient( "Deine Client Nummer ist nicht aktiv!\0" );
  592. else if( !ret1 )
  593. {
  594. if( encrypted )
  595. {
  596. Text *key = ms->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. else
  608. klient->sende( "\1", 1 );
  609. }
  610. }
  611. break;
  612. case 3: // Verbindungsende
  613. br = 1;
  614. if( encrypted )
  615. klient->sendeEncrypted( "\1", 1 );
  616. else
  617. klient->sende( "\1", 1 );
  618. break;
  619. case 6: // frage nach Server
  620. if( 1 )
  621. {
  622. char serverTyp = 0;
  623. if( encrypted )
  624. klient->getNachrichtEncrypted( &serverTyp, 1 );
  625. else
  626. klient->getNachricht( &serverTyp, 1 );
  627. switch( serverTyp )
  628. {
  629. case 1: // Register Server
  630. if( klientNummer )
  631. {
  632. int sNum = ms->zDB()->suchRegisterServer( klientNummer );
  633. if( sNum )
  634. {
  635. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  636. if( msg )
  637. {
  638. if( encrypted )
  639. {
  640. klient->sendeEncrypted( "\2", 1 );
  641. klient->sendeEncrypted( (char*)msg, 6 );
  642. }
  643. else
  644. {
  645. klient->sende( "\2", 1 );
  646. klient->sende( (char*)msg, 6 );
  647. }
  648. }
  649. else
  650. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nRegistrierungsserver zugewiesen werden!\0" );
  651. delete[]msg;
  652. }
  653. else
  654. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  655. }
  656. else
  657. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  658. break;
  659. case 2: // Patch Server
  660. if( klientNummer )
  661. {
  662. int sNum = ms->zDB()->suchPatchServer( klientNummer );
  663. if( sNum )
  664. {
  665. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  666. if( msg )
  667. {
  668. if( encrypted )
  669. {
  670. klient->sendeEncrypted( "\2", 1 );
  671. klient->sendeEncrypted( (char*)msg, 6 );
  672. }
  673. else
  674. {
  675. klient->sende( "\2", 1 );
  676. klient->sende( (char*)msg, 6 );
  677. }
  678. }
  679. else
  680. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nPatchserver zugewiesen werden!\0" );
  681. delete[]msg;
  682. }
  683. else
  684. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  685. }
  686. else
  687. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  688. break;
  689. case 3: // Login Server
  690. if( klientNummer )
  691. {
  692. int sNum = ms->zDB()->suchLoginServer( klientNummer );
  693. if( sNum )
  694. {
  695. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  696. if( msg )
  697. {
  698. if( encrypted )
  699. {
  700. klient->sendeEncrypted( "\2", 1 );
  701. klient->sendeEncrypted( (char*)msg, 6 );
  702. }
  703. else
  704. {
  705. klient->sende( "\2", 1 );
  706. klient->sende( (char*)msg, 6 );
  707. }
  708. }
  709. else
  710. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nLoginserver zugewiesen werden!\0" );
  711. delete[]msg;
  712. }
  713. else
  714. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  715. }
  716. else
  717. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  718. break;
  719. case 4: // Informations Server
  720. if( klientNummer )
  721. {
  722. int sNum = ms->zDB()->suchInformationServer( klientNummer );
  723. if( sNum )
  724. {
  725. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  726. if( msg )
  727. {
  728. if( encrypted )
  729. {
  730. klient->sendeEncrypted( "\2", 1 );
  731. klient->sendeEncrypted( (char*)msg, 6 );
  732. }
  733. else
  734. {
  735. klient->sende( "\2", 1 );
  736. klient->sende( (char*)msg, 6 );
  737. }
  738. }
  739. else
  740. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nInformationserver zugewiesen werden!\0" );
  741. delete[]msg;
  742. }
  743. else
  744. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  745. }
  746. else
  747. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  748. break;
  749. case 5: // Chat Server
  750. if( klientNummer )
  751. {
  752. int sNum = ms->zDB()->suchChatServer( klientNummer );
  753. if( sNum )
  754. {
  755. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  756. if( msg )
  757. {
  758. if( encrypted )
  759. {
  760. klient->sendeEncrypted( "\2", 1 );
  761. klient->sendeEncrypted( (char*)msg, 6 );
  762. }
  763. else
  764. {
  765. klient->sende( "\2", 1 );
  766. klient->sende( (char*)msg, 6 );
  767. }
  768. }
  769. else
  770. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nChatserver zugewiesen werden!\0" );
  771. delete[]msg;
  772. }
  773. else
  774. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  775. }
  776. else
  777. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  778. break;
  779. case 6: // Anmeldung Server
  780. if( klientNummer )
  781. {
  782. int sNum = ms->zDB()->suchAnmeldungServer( klientNummer );
  783. if( sNum )
  784. {
  785. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  786. if( msg )
  787. {
  788. if( encrypted )
  789. {
  790. klient->sendeEncrypted( "\2", 1 );
  791. klient->sendeEncrypted( (char*)msg, 6 );
  792. }
  793. else
  794. {
  795. klient->sende( "\2", 1 );
  796. klient->sende( (char*)msg, 6 );
  797. }
  798. }
  799. else
  800. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nAnmeldungserver zugewiesen werden!\0" );
  801. delete[]msg;
  802. }
  803. else
  804. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  805. }
  806. else
  807. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  808. break;
  809. case 7: // Shop Server
  810. if( klientNummer )
  811. {
  812. int sNum = ms->zDB()->suchShopServer( klientNummer );
  813. if( sNum )
  814. {
  815. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  816. if( msg )
  817. {
  818. if( encrypted )
  819. {
  820. klient->sendeEncrypted( "\2", 1 );
  821. klient->sendeEncrypted( (char*)msg, 6 );
  822. }
  823. else
  824. {
  825. klient->sende( "\2", 1 );
  826. klient->sende( (char*)msg, 6 );
  827. }
  828. }
  829. else
  830. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nShopserver zugewiesen werden!\0" );
  831. delete[]msg;
  832. }
  833. else
  834. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  835. }
  836. else
  837. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  838. break;
  839. case 8: // Erhaltung Server
  840. if( klientNummer )
  841. {
  842. int sNum = ms->zDB()->suchErhaltungServer( klientNummer );
  843. if( sNum )
  844. {
  845. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  846. if( msg )
  847. {
  848. if( encrypted )
  849. {
  850. klient->sendeEncrypted( "\2", 1 );
  851. klient->sendeEncrypted( (char*)msg, 6 );
  852. }
  853. else
  854. {
  855. klient->sende( "\2", 1 );
  856. klient->sende( (char*)msg, 6 );
  857. }
  858. }
  859. else
  860. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nPatchserver zugewiesen werden!\0" );
  861. delete[]msg;
  862. }
  863. else
  864. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  865. }
  866. else
  867. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  868. break;
  869. case 9: // News Server
  870. if( klientNummer )
  871. {
  872. int sNum = ms->zDB()->suchNewsServer( klientNummer );
  873. if( sNum )
  874. {
  875. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  876. if( msg )
  877. {
  878. if( encrypted )
  879. {
  880. klient->sendeEncrypted( "\2", 1 );
  881. klient->sendeEncrypted( (char*)msg, 6 );
  882. }
  883. else
  884. {
  885. klient->sende( "\2", 1 );
  886. klient->sende( (char*)msg, 6 );
  887. }
  888. }
  889. else
  890. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nNewsserver zugewiesen werden!\0" );
  891. delete[]msg;
  892. }
  893. else
  894. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  895. }
  896. else
  897. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  898. break;
  899. case 0xA: // Minigame Server
  900. if( klientNummer )
  901. {
  902. int sNum = ms->zDB()->suchMinigameServer( klientNummer );
  903. if( sNum )
  904. {
  905. unsigned char *msg = ms->zDB()->getServerPortIp( sNum );
  906. if( msg )
  907. {
  908. if( encrypted )
  909. {
  910. klient->sendeEncrypted( "\2", 1 );
  911. klient->sendeEncrypted( (char*)msg, 6 );
  912. }
  913. else
  914. {
  915. klient->sende( "\2", 1 );
  916. klient->sende( (char*)msg, 6 );
  917. }
  918. }
  919. else
  920. errorZuKlient( "Aufgrund eines unerwarteten Fehlers konnte dir kein\nMinigameserver zugewiesen werden!\0" );
  921. delete[]msg;
  922. }
  923. else
  924. errorZuKlient( "Der Server ist derzeit ausgelastet!\0" );
  925. }
  926. else
  927. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  928. break;
  929. default:
  930. errorZuKlient( "Die Art des Servers ist nicht bekannt!\0" );
  931. break;
  932. }
  933. }
  934. break;
  935. case 7: // client unregistrierung
  936. if( klientNummer )
  937. {
  938. int accountId = ms->zDB()->clientistEingeloggt( klientNummer );
  939. if( accountId )
  940. {
  941. Array< int > *ret = new Array< int >();
  942. int anzahl = ms->zDB()->logoutKlient( klientNummer, ret );
  943. if( anzahl > 0 )
  944. {
  945. int jetzt = 0;
  946. int chAnz = ret->get( jetzt );
  947. jetzt++;
  948. for( int i = 0; i < chAnz; i++ )
  949. {
  950. int chatroomId = ret->get( jetzt );
  951. jetzt++;
  952. if( chatroomId )
  953. {
  954. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  955. weiter->spielerLeavesChatroom( chatroomId, accountId );
  956. weiter->release();
  957. if( ret->get( jetzt ) )
  958. {
  959. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  960. weiter->setChatroomAdmin( chatroomId, ms->zDB()->getChatroomAdmin( chatroomId ) );
  961. weiter->release();
  962. }
  963. jetzt++;
  964. }
  965. }
  966. if( ret->get( jetzt ) == 1 )
  967. {
  968. jetzt++;
  969. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  970. weiter->spielErstelltAbbrechen( ret->get( jetzt ) );
  971. weiter->release();
  972. }
  973. jetzt++;
  974. if( ret->get( jetzt ) == 1 )
  975. {
  976. jetzt++;
  977. int gruppeId = ret->get( jetzt );
  978. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  979. weiter->spielerLeavesGruppe( gruppeId, accountId );
  980. weiter->release();
  981. jetzt++;
  982. if( ret->get( jetzt ) )
  983. {
  984. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  985. weiter->setGruppeAdmin( gruppeId, ms->zDB()->getGruppeAdmin( gruppeId ) );
  986. weiter->release();
  987. }
  988. }
  989. else if( ret->get( jetzt ) == 2 )
  990. {
  991. jetzt++;
  992. int gruppeId = ret->get( jetzt );
  993. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  994. weiter->kickSpielerAusGruppe( gruppeId );
  995. weiter->release();
  996. }
  997. }
  998. }
  999. MSGWeiterleitung *weiter = new MSGWeiterleitung( ms->getThis() );
  1000. weiter->patchServerKlientAbsturz( klientNummer );
  1001. weiter->registerServerKlientAbsturz( klientNummer );
  1002. weiter->loginServerKlientAbsturz( klientNummer );
  1003. weiter->informationServerKlientAbsturz( klientNummer );
  1004. weiter->chatServerKlientAbsturz( klientNummer );
  1005. weiter->anmeldungServerKlientAbsturz( klientNummer );
  1006. weiter->spielServerKlientAbsturz( klientNummer );
  1007. weiter->shopServerKlientAbsturz( klientNummer );
  1008. weiter->newsServerKlientAbsturz( klientNummer );
  1009. weiter->historieServerKlientAbsturz( klientNummer );
  1010. weiter->kartenServerKlientAbsturz( klientNummer );
  1011. weiter->editorServerKlientAbsturz( klientNummer );
  1012. weiter->minigameServerKlientAbsturz( klientNummer );
  1013. weiter->release();
  1014. int *treffer = ms->zDB()->unregisterClient( klientNummer, 0 );
  1015. if( !treffer )
  1016. errorZuKlient( "Du bist nicht registriert!\0" );
  1017. else
  1018. {
  1019. if( encrypted )
  1020. klient->sendeEncrypted( "\1", 1 );
  1021. else
  1022. klient->sende( "\1", 1 );
  1023. }
  1024. delete[]treffer;
  1025. }
  1026. else
  1027. errorZuKlient( "Du besitzt noch keine Client Nummer!\0" );
  1028. break;
  1029. default:
  1030. errorZuKlient( "Unbekannte Nachricht!\0" );
  1031. break;
  1032. }
  1033. if( br )
  1034. break;
  1035. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1036. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1037. }
  1038. }
  1039. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1040. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1041. delete this;
  1042. }
  1043. void MSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  1044. {
  1045. if( encrypted )
  1046. {
  1047. klient->sendeEncrypted( "\3", 1 );
  1048. char len = (char)textLength( nachricht );
  1049. klient->sendeEncrypted( &len, 1 );
  1050. klient->sendeEncrypted( nachricht, len );
  1051. }
  1052. else
  1053. {
  1054. klient->sende( "\3", 1 );
  1055. char len = (char)textLength( nachricht );
  1056. klient->sende( &len, 1 );
  1057. klient->sende( nachricht, len );
  1058. }
  1059. }
  1060. // Inhalt der MSGWeiterleitung Klasse aus LoginServer.h
  1061. // Konstruktor
  1062. MSGWeiterleitung::MSGWeiterleitung( MainServer *ms )
  1063. {
  1064. this->ms = ms;
  1065. ref = 1;
  1066. }
  1067. // Destruktor
  1068. MSGWeiterleitung::~MSGWeiterleitung()
  1069. {
  1070. ms->release();
  1071. }
  1072. // nicht constant
  1073. bool MSGWeiterleitung::patchServerKlientAbsturz( int klientId )
  1074. {
  1075. Text *ip = new Text();
  1076. int port = 0;
  1077. if( !ms->zDB()->getPatchServer( klientId, ip, &port ) )
  1078. {
  1079. ip->release();
  1080. return 0;
  1081. }
  1082. Klient *k = new Klient();
  1083. unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
  1084. k->setSendeKey( (char*)key, 20 );
  1085. k->setEmpfangKey( (char*)key, 20 );
  1086. k->verbinde( (unsigned short)port, ip->getText() );
  1087. ip->release();
  1088. char ret = 0;
  1089. k->sende( "\0", 1 ); // Verkeyung aktivieren
  1090. k->sendeEncrypted( "\2\2", 2 );
  1091. k->sendeEncrypted( (char*)&klientId, 4 );
  1092. k->getNachrichtEncrypted( &ret, 1 );
  1093. bool erf = ret == 1;
  1094. k->sendeEncrypted( "\3", 1 );
  1095. k->getNachrichtEncrypted( &ret, 1 );
  1096. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1097. ms->addGesendet( k->getUploadBytes( 1 ) );
  1098. k->trenne();
  1099. k->release();
  1100. return erf;
  1101. }
  1102. bool MSGWeiterleitung::registerServerKlientAbsturz( int klientId )
  1103. {
  1104. Text *ip = new Text();
  1105. int port = 0;
  1106. if( !ms->zDB()->getRegisterServer( klientId, ip, &port ) )
  1107. {
  1108. ip->release();
  1109. return 0;
  1110. }
  1111. Klient *k = new Klient();
  1112. unsigned char key[ 20 ] = { 186, 186, 179, 126, 216, 207, 123, 154, 168, 149, 51, 221, 6, 193, 160, 141, 164, 126, 44, 242 };
  1113. k->setSendeKey( (char*)key, 20 );
  1114. k->setEmpfangKey( (char*)key, 20 );
  1115. k->verbinde( (unsigned short)port, ip->getText() );
  1116. ip->release();
  1117. char ret = 0;
  1118. k->sendeEncrypted( "\2\2", 2 );
  1119. k->sendeEncrypted( (char*)&klientId, 4 );
  1120. k->getNachrichtEncrypted( &ret, 1 );
  1121. bool erf = ret == 1;
  1122. k->sendeEncrypted( "\3", 1 );
  1123. k->getNachrichtEncrypted( &ret, 1 );
  1124. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1125. ms->addGesendet( k->getUploadBytes( 1 ) );
  1126. k->trenne();
  1127. k->release();
  1128. return erf;
  1129. }
  1130. bool MSGWeiterleitung::loginServerKlientAbsturz( int klientId )
  1131. {
  1132. Text *ip = new Text();
  1133. int port = 0;
  1134. if( !ms->zDB()->getLoginServer( klientId, ip, &port ) )
  1135. {
  1136. ip->release();
  1137. return 0;
  1138. }
  1139. Klient *k = new Klient();
  1140. unsigned char key[ 20 ] = { 143, 166, 245, 235, 76, 75, 116, 80, 26, 178, 142, 176, 109, 53, 106, 222, 223, 55, 139, 111 };
  1141. k->setSendeKey( (char*)key, 20 );
  1142. k->setEmpfangKey( (char*)key, 20 );
  1143. k->verbinde( (unsigned short)port, ip->getText() );
  1144. ip->release();
  1145. char ret = 0;
  1146. k->sendeEncrypted( "\2\2", 2 );
  1147. k->sendeEncrypted( (char*)&klientId, 4 );
  1148. k->getNachrichtEncrypted( &ret, 1 );
  1149. bool erf = ret == 1;
  1150. k->sendeEncrypted( "\3", 1 );
  1151. k->getNachrichtEncrypted( &ret, 1 );
  1152. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1153. ms->addGesendet( k->getUploadBytes( 1 ) );
  1154. k->trenne();
  1155. k->release();
  1156. return erf;
  1157. }
  1158. bool MSGWeiterleitung::informationServerKlientAbsturz( int klientId )
  1159. {
  1160. Text *ip = new Text();
  1161. int port = 0;
  1162. if( !ms->zDB()->getInformationServer( klientId, ip, &port ) )
  1163. {
  1164. ip->release();
  1165. return 0;
  1166. }
  1167. Klient *k = new Klient();
  1168. unsigned char key[ 20 ] = { 231, 246, 125, 32, 88, 172, 229, 223, 246, 138, 74, 64, 142, 245, 217, 218, 162, 62, 103, 50 };
  1169. k->setSendeKey( (char*)key, 20 );
  1170. k->setEmpfangKey( (char*)key, 20 );
  1171. k->verbinde( (unsigned short)port, ip->getText() );
  1172. ip->release();
  1173. char ret = 0;
  1174. k->sendeEncrypted( "\2\2", 2 );
  1175. k->sendeEncrypted( (char*)&klientId, 4 );
  1176. k->getNachrichtEncrypted( &ret, 1 );
  1177. bool erf = ret == 1;
  1178. k->sendeEncrypted( "\3", 1 );
  1179. k->getNachrichtEncrypted( &ret, 1 );
  1180. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1181. ms->addGesendet( k->getUploadBytes( 1 ) );
  1182. k->trenne();
  1183. k->release();
  1184. return erf;
  1185. }
  1186. bool MSGWeiterleitung::chatServerKlientAbsturz( int klientId )
  1187. {
  1188. Text *ip = new Text();
  1189. int port = 0;
  1190. if( !ms->zDB()->getChatServer( klientId, ip, &port ) )
  1191. {
  1192. ip->release();
  1193. return 0;
  1194. }
  1195. Klient *k = new Klient();
  1196. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1197. k->setSendeKey( (char*)key, 20 );
  1198. k->setEmpfangKey( (char*)key, 20 );
  1199. k->verbinde( (unsigned short)port, ip->getText() );
  1200. ip->release();
  1201. char ret = 0;
  1202. k->sendeEncrypted( "\2\2", 2 );
  1203. k->sendeEncrypted( (char*)&klientId, 4 );
  1204. k->getNachrichtEncrypted( &ret, 1 );
  1205. bool erf = ret == 1;
  1206. k->sendeEncrypted( "\3", 1 );
  1207. k->getNachrichtEncrypted( &ret, 1 );
  1208. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1209. ms->addGesendet( k->getUploadBytes( 1 ) );
  1210. k->trenne();
  1211. k->release();
  1212. return erf;
  1213. }
  1214. bool MSGWeiterleitung::anmeldungServerKlientAbsturz( int klientId )
  1215. {
  1216. Text *ip = new Text();
  1217. int port = 0;
  1218. if( !ms->zDB()->getAnmeldungServer( klientId, ip, &port ) )
  1219. {
  1220. ip->release();
  1221. return 0;
  1222. }
  1223. Klient *k = new Klient();
  1224. unsigned char key[ 20 ] = { 158, 10, 37, 155, 117, 58, 28, 197, 132, 76, 252, 83, 84, 222, 11, 125, 240, 218, 25, 201 };
  1225. k->setSendeKey( (char*)key, 20 );
  1226. k->setEmpfangKey( (char*)key, 20 );
  1227. k->verbinde( (unsigned short)port, ip->getText() );
  1228. ip->release();
  1229. char ret = 0;
  1230. k->sendeEncrypted( "\2\2", 2 );
  1231. k->sendeEncrypted( (char*)&klientId, 4 );
  1232. k->getNachrichtEncrypted( &ret, 1 );
  1233. bool erf = ret == 1;
  1234. k->sendeEncrypted( "\3", 1 );
  1235. k->getNachrichtEncrypted( &ret, 1 );
  1236. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1237. ms->addGesendet( k->getUploadBytes( 1 ) );
  1238. k->trenne();
  1239. k->release();
  1240. return erf;
  1241. }
  1242. bool MSGWeiterleitung::spielServerKlientAbsturz( int klientId )
  1243. {
  1244. Text *ip = new Text();
  1245. int port = 0;
  1246. if( !ms->zDB()->getSpielServer( klientId, ip, &port ) )
  1247. {
  1248. ip->release();
  1249. return 0;
  1250. }
  1251. Klient *k = new Klient();
  1252. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1253. k->setSendeKey( (char*)key, 20 );
  1254. k->setEmpfangKey( (char*)key, 20 );
  1255. k->verbinde( (unsigned short)port, ip->getText() );
  1256. ip->release();
  1257. char ret = 0;
  1258. k->sendeEncrypted( "\2\2", 2 );
  1259. k->sendeEncrypted( (char*)&klientId, 4 );
  1260. k->getNachrichtEncrypted( &ret, 1 );
  1261. bool erf = ret == 1;
  1262. k->sendeEncrypted( "\3", 1 );
  1263. k->getNachrichtEncrypted( &ret, 1 );
  1264. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1265. ms->addGesendet( k->getUploadBytes( 1 ) );
  1266. k->trenne();
  1267. k->release();
  1268. return erf;
  1269. }
  1270. bool MSGWeiterleitung::shopServerKlientAbsturz( int klientId )
  1271. {
  1272. Text *ip = new Text();
  1273. int port = 0;
  1274. if( !ms->zDB()->getShopServer( klientId, ip, &port ) )
  1275. {
  1276. ip->release();
  1277. return 0;
  1278. }
  1279. Klient *k = new Klient();
  1280. unsigned char key[ 20 ] = { 218, 226, 231, 216, 68, 63, 132, 155, 49, 235, 239, 0, 19, 23, 116, 244, 235, 21, 189, 53 };
  1281. k->setSendeKey( (char*)key, 20 );
  1282. k->setEmpfangKey( (char*)key, 20 );
  1283. k->verbinde( (unsigned short)port, ip->getText() );
  1284. ip->release();
  1285. char ret = 0;
  1286. k->sendeEncrypted( "\2\2", 2 );
  1287. k->sendeEncrypted( (char*)&klientId, 4 );
  1288. k->getNachrichtEncrypted( &ret, 1 );
  1289. bool erf = ret == 1;
  1290. k->sendeEncrypted( "\3", 1 );
  1291. k->getNachrichtEncrypted( &ret, 1 );
  1292. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1293. ms->addGesendet( k->getUploadBytes( 1 ) );
  1294. k->trenne();
  1295. k->release();
  1296. return erf;
  1297. }
  1298. bool MSGWeiterleitung::newsServerKlientAbsturz( int klientId )
  1299. {
  1300. Text *ip = new Text();
  1301. int port = 0;
  1302. if( !ms->zDB()->getNewsServer( klientId, ip, &port ) )
  1303. {
  1304. ip->release();
  1305. return 0;
  1306. }
  1307. Klient *k = new Klient();
  1308. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  1309. k->setSendeKey( (char*)key, 20 );
  1310. k->setEmpfangKey( (char*)key, 20 );
  1311. k->verbinde( (unsigned short)port, ip->getText() );
  1312. ip->release();
  1313. char ret = 0;
  1314. k->sendeEncrypted( "\2\2", 2 );
  1315. k->sendeEncrypted( (char*)&klientId, 4 );
  1316. k->getNachrichtEncrypted( &ret, 1 );
  1317. bool erf = ret == 1;
  1318. k->sendeEncrypted( "\3", 1 );
  1319. k->getNachrichtEncrypted( &ret, 1 );
  1320. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1321. ms->addGesendet( k->getUploadBytes( 1 ) );
  1322. k->trenne();
  1323. k->release();
  1324. return erf;
  1325. }
  1326. bool MSGWeiterleitung::historieServerKlientAbsturz( int klientId )
  1327. {
  1328. Text *ip = new Text();
  1329. int port = 0;
  1330. if( !ms->zDB()->getHistorieServer( klientId, ip, &port ) )
  1331. {
  1332. ip->release();
  1333. return 0;
  1334. }
  1335. Klient *k = new Klient();
  1336. unsigned char key[ 20 ] = { 207, 30, 72, 46, 30, 50, 56, 213, 82, 107, 14, 201, 149, 58, 110, 138, 228, 241, 52, 54 };
  1337. k->setSendeKey( (char*)key, 20 );
  1338. k->setEmpfangKey( (char*)key, 20 );
  1339. k->verbinde( (unsigned short)port, ip->getText() );
  1340. ip->release();
  1341. char ret = 0;
  1342. k->sendeEncrypted( "\2\2", 2 );
  1343. k->sendeEncrypted( (char*)&klientId, 4 );
  1344. k->getNachrichtEncrypted( &ret, 1 );
  1345. bool erf = ret == 1;
  1346. k->sendeEncrypted( "\3", 1 );
  1347. k->getNachrichtEncrypted( &ret, 1 );
  1348. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1349. ms->addGesendet( k->getUploadBytes( 1 ) );
  1350. k->trenne();
  1351. k->release();
  1352. return erf;
  1353. }
  1354. bool MSGWeiterleitung::kartenServerKlientAbsturz( int klientId )
  1355. {
  1356. Text *ip = new Text();
  1357. int port = 0;
  1358. if( !ms->zDB()->getKartenServer( klientId, ip, &port ) )
  1359. {
  1360. ip->release();
  1361. return 0;
  1362. }
  1363. Klient *k = new Klient();
  1364. unsigned char key[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
  1365. k->setSendeKey( (char*)key, 20 );
  1366. k->setEmpfangKey( (char*)key, 20 );
  1367. k->verbinde( (unsigned short)port, ip->getText() );
  1368. ip->release();
  1369. char ret = 0;
  1370. k->sendeEncrypted( "\2\2", 2 );
  1371. k->sendeEncrypted( (char*)&klientId, 4 );
  1372. k->getNachrichtEncrypted( &ret, 1 );
  1373. bool erf = ret == 1;
  1374. k->sendeEncrypted( "\3", 1 );
  1375. k->getNachrichtEncrypted( &ret, 1 );
  1376. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1377. ms->addGesendet( k->getUploadBytes( 1 ) );
  1378. k->trenne();
  1379. k->release();
  1380. return erf;
  1381. }
  1382. bool MSGWeiterleitung::editorServerKlientAbsturz( int klientId )
  1383. {
  1384. Text *ip = new Text();
  1385. int port = 0;
  1386. if( !ms->zDB()->getEditorServer( klientId, ip, &port ) )
  1387. {
  1388. ip->release();
  1389. return 0;
  1390. }
  1391. Klient *k = new Klient();
  1392. unsigned char key[ 20 ] = { 55, 124, 19, 204, 23, 5, 59, 75, 247, 138, 119, 111, 57, 250, 206, 187, 165, 6, 247, 151 };
  1393. k->setSendeKey( (char*)key, 20 );
  1394. k->setEmpfangKey( (char*)key, 20 );
  1395. k->verbinde( (unsigned short)port, ip->getText() );
  1396. ip->release();
  1397. char ret = 0;
  1398. k->sendeEncrypted( "\2\2", 2 );
  1399. k->sendeEncrypted( (char*)&klientId, 4 );
  1400. k->getNachrichtEncrypted( &ret, 1 );
  1401. bool erf = ret == 1;
  1402. k->sendeEncrypted( "\3", 1 );
  1403. k->getNachrichtEncrypted( &ret, 1 );
  1404. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1405. ms->addGesendet( k->getUploadBytes( 1 ) );
  1406. k->trenne();
  1407. k->release();
  1408. return erf;
  1409. }
  1410. bool MSGWeiterleitung::minigameServerKlientAbsturz( int klientId )
  1411. {
  1412. Text *ip = new Text();
  1413. int port = 0;
  1414. if( !ms->zDB()->getMinigameServer( klientId, ip, &port ) )
  1415. {
  1416. ip->release();
  1417. return 0;
  1418. }
  1419. Klient *k = new Klient();
  1420. unsigned char key[ 20 ] = { 88, 103, 192, 232, 69, 54, 57, 3, 239, 138, 234, 172, 126, 72, 81, 55, 205, 97, 59, 255 };
  1421. k->setSendeKey( (char*)key, 20 );
  1422. k->setEmpfangKey( (char*)key, 20 );
  1423. k->verbinde( (unsigned short)port, ip->getText() );
  1424. ip->release();
  1425. char ret = 0;
  1426. k->sendeEncrypted( "\2\2", 2 );
  1427. k->sendeEncrypted( (char*)&klientId, 4 );
  1428. k->getNachrichtEncrypted( &ret, 1 );
  1429. bool erf = ret == 1;
  1430. k->sendeEncrypted( "\3", 1 );
  1431. k->getNachrichtEncrypted( &ret, 1 );
  1432. ms->addEmpfangen( k->getDownloadBytes( 1 ) );
  1433. ms->addGesendet( k->getUploadBytes( 1 ) );
  1434. k->trenne();
  1435. k->release();
  1436. return erf;
  1437. }
  1438. bool MSGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
  1439. {
  1440. bool ret = 1;
  1441. Text *ip = new Text( "" );
  1442. unsigned short port = 0;
  1443. ret = ret & ms->zDB()->getSpielServerPortIp( spielErstelltId, &port, ip );
  1444. if( ip->getLength() )
  1445. {
  1446. Klient *klient = new Klient();
  1447. unsigned char key[ 20 ] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  1448. klient->setSendeKey( (char*)key, 20 );
  1449. klient->setEmpfangKey( (char*)key, 20 );
  1450. ret = ret & klient->verbinde( port, ip->getText() );
  1451. ret = ret & klient->sendeEncrypted( "\x8\x1", 2 );
  1452. char res = 0;
  1453. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1454. if( res )
  1455. {
  1456. ret = ret & klient->sendeEncrypted( (char*)&spielErstelltId, 4 );
  1457. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1458. }
  1459. ret = (char)ret & res;
  1460. ret = ret & klient->sendeEncrypted( "\x8\x0", 2 );
  1461. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1462. ret = (char)ret & res;
  1463. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1464. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1465. klient->trenne();
  1466. klient = klient->release();
  1467. ip->release();
  1468. }
  1469. return ret;
  1470. }
  1471. bool MSGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
  1472. {
  1473. bool ret = 1;
  1474. Array< int > *accId = new Array< int >();
  1475. int anzahl = ms->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1476. for( int i = 0; i < anzahl; i++ )
  1477. {
  1478. int account = accId->get( i );
  1479. if( account == accountId )
  1480. continue;
  1481. Text *ip = new Text( "" );
  1482. unsigned short port = 0;
  1483. ret = ret & ms->zDB()->getChatServerPortIp( account, &port, ip );
  1484. if( ip->getLength() )
  1485. {
  1486. Klient *klient = new Klient();
  1487. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1488. klient->setSendeKey( (char*)key, 20 );
  1489. klient->setEmpfangKey( (char*)key, 20 );
  1490. ret = ret & klient->verbinde( port, ip->getText() );
  1491. ret = ret & klient->sendeEncrypted( "\5\x15", 2 );
  1492. char res = 0;
  1493. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1494. if( res )
  1495. {
  1496. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1497. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1498. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1499. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1500. }
  1501. ret = (char)ret & res;
  1502. ret = ret & klient->sendeEncrypted( "\5\x18", 2 );
  1503. res = 0;
  1504. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1505. if( res )
  1506. {
  1507. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1508. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1509. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1510. }
  1511. ret = (char)ret & res;
  1512. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1513. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1514. klient->trenne();
  1515. klient = klient->release();
  1516. }
  1517. ip->release();
  1518. }
  1519. accId->release();
  1520. return ret;
  1521. }
  1522. bool MSGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
  1523. {
  1524. if( !adminId || !gruppeId )
  1525. return 0;
  1526. bool ret = 1;
  1527. Array< int > *accId = new Array< int >();
  1528. int anzahl = ms->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1529. for( int i = 0; i < anzahl; i++ )
  1530. {
  1531. int account = accId->get( i );
  1532. Text *ip = new Text( "" );
  1533. unsigned short port = 0;
  1534. ret = ret & ms->zDB()->getChatServerPortIp( account, &port, ip );
  1535. if( ip->getLength() )
  1536. {
  1537. Klient *klient = new Klient();
  1538. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1539. klient->setSendeKey( (char*)key, 20 );
  1540. klient->setEmpfangKey( (char*)key, 20 );
  1541. ret = ret & klient->verbinde( port, ip->getText() );
  1542. ret = ret & klient->sendeEncrypted( "\5\x1B", 2 );
  1543. char res = 0;
  1544. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1545. if( res )
  1546. {
  1547. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1548. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1549. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1550. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1551. }
  1552. ret = (char)ret & res;
  1553. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1554. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1555. klient->trenne();
  1556. klient = klient->release();
  1557. }
  1558. ip->release();
  1559. }
  1560. accId->release();
  1561. return ret;
  1562. }
  1563. bool MSGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
  1564. {
  1565. bool ret = 1;
  1566. Array< int > *accId = new Array< int >();
  1567. int anzahl = ms->zDB()->getSpielerAusChatroom( chatroomId, accId );
  1568. for( int i = 0; i < anzahl; i++ )
  1569. {
  1570. int account = accId->get( i );
  1571. if( account == accountId )
  1572. continue;
  1573. Text *ip = new Text( "" );
  1574. unsigned short port = 0;
  1575. ret = ret & ms->zDB()->getChatServerPortIp( account, &port, ip );
  1576. if( ip->getLength() )
  1577. {
  1578. Klient *klient = new Klient();
  1579. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1580. klient->setSendeKey( (char*)key, 20 );
  1581. klient->setEmpfangKey( (char*)key, 20 );
  1582. ret = ret & klient->verbinde( port, ip->getText() );
  1583. ret = ret & klient->sendeEncrypted( "\5\xE", 2 );
  1584. char res = 0;
  1585. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1586. if( res )
  1587. {
  1588. ret = ret & klient->sendeEncrypted( (char*)&accountId, 4 );
  1589. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1590. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1591. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1592. }
  1593. ret = (char)ret & res;
  1594. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1595. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1596. klient->trenne();
  1597. klient = klient->release();
  1598. }
  1599. ip->release();
  1600. }
  1601. accId->release();
  1602. return ret;
  1603. }
  1604. bool MSGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
  1605. {
  1606. if( !adminId || !chatroomId )
  1607. return 0;
  1608. bool ret = 1;
  1609. Text *ip = new Text( "" );
  1610. unsigned short port = 0;
  1611. ret = ret & ms->zDB()->getChatServerPortIp( adminId, &port, ip );
  1612. if( ip->getLength() )
  1613. {
  1614. Klient *klient = new Klient();
  1615. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1616. klient->setSendeKey( (char*)key, 20 );
  1617. klient->setEmpfangKey( (char*)key, 20 );
  1618. ret = ret & klient->verbinde( port, ip->getText() );
  1619. ret = ret & klient->sendeEncrypted( "\5\x12", 2 );
  1620. char res = 0;
  1621. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1622. if( res )
  1623. {
  1624. ret = ret & klient->sendeEncrypted( (char*)&adminId, 4 );
  1625. ret = ret & klient->sendeEncrypted( (char*)&chatroomId, 4 );
  1626. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1627. }
  1628. ret = (char)ret & res;
  1629. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1630. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1631. klient->trenne();
  1632. klient = klient->release();
  1633. }
  1634. ip->release();
  1635. return ret;
  1636. }
  1637. bool MSGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
  1638. {
  1639. if( !gruppeId )
  1640. return 0;
  1641. bool ret = 1;
  1642. Array< int > *accId = new Array< int >();
  1643. int anzahl = ms->zDB()->getSpielerAusGruppe( gruppeId, accId );
  1644. for( int i = 0; i < anzahl; i++ )
  1645. {
  1646. int account = accId->get( i );
  1647. Text *ip = new Text( "" );
  1648. unsigned short port = 0;
  1649. ret = ret & ms->zDB()->getChatServerPortIp( account, &port, ip );
  1650. if( ip->getLength() )
  1651. {
  1652. Klient *klient = new Klient();
  1653. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  1654. klient->setSendeKey( (char*)key, 20 );
  1655. klient->setEmpfangKey( (char*)key, 20 );
  1656. ret = ret & klient->verbinde( port, ip->getText() );
  1657. ret = ret & klient->sendeEncrypted( "\5\x16", 2 );
  1658. char res = 0;
  1659. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1660. if( res )
  1661. {
  1662. ret = ret & klient->sendeEncrypted( (char*)&account, 4 );
  1663. ret = ret & klient->sendeEncrypted( (char*)&gruppeId, 4 );
  1664. ret = ret & klient->getNachrichtEncrypted( &res, 1 );
  1665. }
  1666. ret = (char)ret & res;
  1667. ms->addEmpfangen( klient->getDownloadBytes( 1 ) );
  1668. ms->addGesendet( klient->getUploadBytes( 1 ) );
  1669. klient->trenne();
  1670. klient = klient->release();
  1671. }
  1672. ms->zDB()->kickSpielerAusGruppe( gruppeId, account );
  1673. ip->release();
  1674. }
  1675. accId->release();
  1676. return ret;
  1677. }
  1678. // constant
  1679. // Reference Counting
  1680. MSGWeiterleitung *MSGWeiterleitung::getThis()
  1681. {
  1682. ref++;
  1683. return this;
  1684. }
  1685. MSGWeiterleitung *MSGWeiterleitung::release()
  1686. {
  1687. ref--;
  1688. if( !ref )
  1689. delete this;
  1690. return 0;
  1691. }