AnmeldungServer.cpp 64 KB

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