LoginK.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. #include "../KSGKlient.h"
  2. #include "../KSGServer.h"
  3. #include "../Keys.h"
  4. #include <Globals.h>
  5. // Inhalt der LoginKlient Klase aus KSGKlient.h
  6. // Konstruktor
  7. LoginKlient::LoginKlient()
  8. {
  9. verbunden = 0;
  10. fehler = 0;
  11. brauchKick = 0;
  12. klient = 0;
  13. klientId = getKlientId();
  14. accountId = 0;
  15. ref = 1;
  16. }
  17. // Destruktor
  18. LoginKlient::~LoginKlient() // wenn verbunden, dann trennen
  19. {
  20. cs.lock();
  21. if( klient )
  22. {
  23. char serverReturn = 0;
  24. if( verbunden )
  25. {
  26. if( brauchKick )
  27. klient->sendeEncrypted( "\0", 1 );
  28. klient->sendeEncrypted( "\4", 1 );
  29. klient->getNachrichtEncrypted( &serverReturn, 1 );
  30. if( serverReturn == 3 )
  31. {
  32. char län = 0;
  33. klient->getNachrichtEncrypted( &län, 1 );
  34. char *nachricht = new char[ län + 1 ];
  35. nachricht[ län ] = 0;
  36. klient->getNachrichtEncrypted( nachricht, län );
  37. delete[]nachricht;
  38. }
  39. klient->sendeEncrypted( "\3", 1 );
  40. klient->getNachrichtEncrypted( &serverReturn, 1 );
  41. klient->trenne();
  42. }
  43. else
  44. {
  45. int keyLen = 0;
  46. char *key = 0;
  47. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN );
  48. klient->setSendeKey( key, keyLen );
  49. delete[] key;
  50. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN );
  51. klient->setEmpfangKey( key, keyLen );
  52. delete[] key;
  53. klient->verbinde( klient->getServerPort(), klient->getServerIp() );
  54. klient->sendeEncrypted( "\1", 1 );
  55. klient->sendeEncrypted( (char*)&klientId, 4 );
  56. klient->getNachrichtEncrypted( &serverReturn, 1 );
  57. if( serverReturn == 3 )
  58. {
  59. char län = 0;
  60. klient->getNachrichtEncrypted( &län, 1 );
  61. char *nachricht = new char[ län + 1 ];
  62. nachricht[ län ] = 0;
  63. klient->getNachrichtEncrypted( nachricht, län );
  64. delete[]nachricht;
  65. }
  66. else
  67. {
  68. char *sl = 0;
  69. char slLän = getSchlüssel( &sl );
  70. klient->setSendeKey( sl, slLän );
  71. klient->setEmpfangKey( sl, slLän );
  72. delete[] sl;
  73. klient->sendeEncrypted( "\4", 1 );
  74. klient->getNachrichtEncrypted( &serverReturn, 1 );
  75. if( serverReturn == 3 )
  76. {
  77. char län = 0;
  78. klient->getNachrichtEncrypted( &län, 1 );
  79. char *nachricht = new char[ län + 1 ];
  80. nachricht[ län ] = 0;
  81. klient->getNachrichtEncrypted( nachricht, län );
  82. delete[]nachricht;
  83. }
  84. }
  85. klient->sendeEncrypted( "\3", 1 );
  86. klient->getNachrichtEncrypted( &serverReturn, 1 );
  87. klient->trenne();
  88. }
  89. klient = klient->release();
  90. }
  91. delete[]fehler;
  92. cs.unlock();
  93. }
  94. // nicht constant
  95. bool LoginKlient::verbinde() // verbindet sich mit dem Login Server
  96. {
  97. cs.lock();
  98. if( verbunden )
  99. {
  100. cs.unlock();
  101. return 1;
  102. }
  103. brauchKick = 0;
  104. if( !klient )
  105. {
  106. char *msIp = getMainServerIp();
  107. unsigned short msPort = getMainServerPort();
  108. Framework::logLine( "Verbinung mit Main Server wird hergestellt..." );
  109. klient = new Klient();
  110. int keyLen = 0;
  111. char *key = 0;
  112. Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::SENDEN );
  113. klient->setSendeKey( key, keyLen );
  114. delete[] key;
  115. Keys::getServerKey( &key, keyLen, Keys::MAIN, Keys::EMPFANGEN );
  116. klient->setEmpfangKey( key, keyLen );
  117. delete[] key;
  118. if( !klient->verbinde( msPort, msIp ) )
  119. {
  120. Framework::logLine( "ERROR: Server nicht erreichbar." );
  121. char *err = "Fehler beim verbinden mit dem Main Server. Bitte versuche es Später erneut.";
  122. delete[]fehler;
  123. fehler = new char[ textLength( err ) + 1 ];
  124. fehler[ textLength( err ) ] = 0;
  125. memcpy( fehler, err, textLength( err ) );
  126. klient = klient->release();
  127. delete[]msIp;
  128. cs.unlock();
  129. return 0;
  130. }
  131. delete[]msIp;
  132. klient->sende( "\0", 1 ); // verschlüsselung aktivieren
  133. klient->sendeEncrypted( "\1", 1 );
  134. klient->sendeEncrypted( (char*)&klientId, 4 );
  135. char serverReturn = 0;
  136. klient->getNachrichtEncrypted( &serverReturn, 1 );
  137. if( serverReturn == 3 )
  138. {
  139. char byte = 0;
  140. klient->getNachrichtEncrypted( &byte, 1 );
  141. delete[]fehler;
  142. fehler = new char[ byte + 1 ];
  143. fehler[ byte ] = 0;
  144. klient->getNachrichtEncrypted( fehler, byte );
  145. Framework::logLine( Text( "ERROR: " ) += fehler );
  146. klient->sendeEncrypted( "\3", 1 );
  147. klient->getNachrichtEncrypted( &serverReturn, 1 );
  148. klient->trenne();
  149. klient = klient->release();
  150. cs.unlock();
  151. return 0;
  152. }
  153. char *sl = 0;
  154. char slLän = getSchlüssel( &sl );
  155. klient->setSendeKey( sl, slLän );
  156. klient->setEmpfangKey( sl, slLän );
  157. delete[] sl;
  158. klient->sendeEncrypted( "\6\3", 2 );
  159. char byte = 0;
  160. klient->getNachrichtEncrypted( &byte, 1 );
  161. if( byte == 2 )
  162. {
  163. unsigned char lsIp[ 4 ];
  164. klient->getNachrichtEncrypted( (char *)lsIp, 4 );
  165. unsigned short lsPort = 0;
  166. klient->getNachrichtEncrypted( (char*)&lsPort, 2 );
  167. klient->sendeEncrypted( "\3", 1 );
  168. klient->getNachrichtEncrypted( &serverReturn, 1 );
  169. klient->trenne();
  170. Text *lsIpT = new Text( "" );
  171. lsIpT->append( (int)lsIp[ 0 ] );
  172. lsIpT->append( "." );
  173. lsIpT->append( (int)lsIp[ 1 ] );
  174. lsIpT->append( "." );
  175. lsIpT->append( (int)lsIp[ 2 ] );
  176. lsIpT->append( "." );
  177. lsIpT->append( (int)lsIp[ 3 ] );
  178. Framework::logLine( ( ( Text( "Zugeteilter Login Server:" ) += lsIpT->getText() ) += ":" ) += lsPort );
  179. int keyLen = 0;
  180. char *key = 0;
  181. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN );
  182. klient->setSendeKey( key, keyLen );
  183. delete[] key;
  184. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN );
  185. klient->setEmpfangKey( key, keyLen );
  186. delete[] key;
  187. klient->verbinde( lsPort, lsIpT->getText() );
  188. lsIpT = lsIpT->release();
  189. klient->sendeEncrypted( "\3", 1 );
  190. klient->getNachrichtEncrypted( &serverReturn, 1 );
  191. klient->trenne();
  192. }
  193. if( byte == 3 )
  194. {
  195. klient->getNachrichtEncrypted( &byte, 1 );
  196. delete[]fehler;
  197. fehler = new char[ byte + 1 ];
  198. fehler[ byte ] = 0;
  199. klient->getNachrichtEncrypted( fehler, byte );
  200. Framework::logLine( Text( "ERROR: " ) += fehler );
  201. klient->sendeEncrypted( "\3", 1 );
  202. klient->getNachrichtEncrypted( &serverReturn, 1 );
  203. klient->trenne();
  204. klient = klient->release();
  205. cs.unlock();
  206. return 0;
  207. }
  208. }
  209. Framework::logLine( "Verbinung mit Login Server wird hergestellt..." );
  210. int keyLen = 0;
  211. char *key = 0;
  212. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::SENDEN );
  213. klient->setSendeKey( key, keyLen );
  214. delete[] key;
  215. Keys::getServerKey( &key, keyLen, Keys::LOGIN, Keys::EMPFANGEN );
  216. klient->setEmpfangKey( key, keyLen );
  217. delete[] key;
  218. if( klient->verbinde( klient->getServerPort(), klient->getServerIp() ) )
  219. {
  220. if( klient->sendeEncrypted( "\1", 1 ) )
  221. {
  222. klient->sendeEncrypted( (char*)&klientId, 4 );
  223. char serverReturn = 0;
  224. klient->getNachrichtEncrypted( &serverReturn, 1 );
  225. if( serverReturn == 3 )
  226. {
  227. char byte = 0;
  228. klient->getNachrichtEncrypted( &byte, 1 );
  229. delete[]fehler;
  230. fehler = new char[ byte + 1 ];
  231. fehler[ byte ] = 0;
  232. klient->getNachrichtEncrypted( fehler, byte );
  233. Framework::logLine( Text( "ERROR: " ) += fehler );
  234. klient->sendeEncrypted( "\3", 1 );
  235. klient->getNachrichtEncrypted( &serverReturn, 1 );
  236. klient->trenne();
  237. cs.unlock();
  238. return 0;
  239. }
  240. char *sl = 0;
  241. char slLän = getSchlüssel( &sl );
  242. klient->setSendeKey( sl, slLän );
  243. klient->setEmpfangKey( sl, slLän );
  244. delete[] sl;
  245. verbunden = 1;
  246. cs.unlock();
  247. Framework::logLine( "Erfolgreich mit Login Server verbunden." );
  248. return 1;
  249. }
  250. else
  251. {
  252. Framework::logLine( "ERROR: Senden zum Server nicht erfolgreich." );
  253. char *err = "Der dir zugewiesene Login Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut.";
  254. delete[]fehler;
  255. fehler = new char[ textLength( err ) + 1 ];
  256. fehler[ textLength( err ) ] = 0;
  257. memcpy( fehler, err, textLength( err ) );
  258. klient = klient->release();
  259. }
  260. }
  261. else
  262. {
  263. Framework::logLine( "ERROR: Server nicht erreichbar." );
  264. char *err = "Der dir zugewiesene Login Server antwortet nicht. Bitte versuche es Später erneut.";
  265. delete[]fehler;
  266. fehler = new char[ textLength( err ) + 1 ];
  267. fehler[ textLength( err ) ] = 0;
  268. memcpy( fehler, err, textLength( err ) );
  269. klient = klient->release();
  270. }
  271. cs.unlock();
  272. return 0;
  273. }
  274. int LoginKlient::login( const char *name, const char *pass ) // gibt bei Erfolg 1 zurück
  275. {
  276. cs.lock();
  277. if( !verbunden )
  278. verbinde();
  279. if( !verbunden )
  280. {
  281. cs.unlock();
  282. return 0;
  283. }
  284. if( brauchKick )
  285. klient->sendeEncrypted( "\0", 1 );
  286. brauchKick = 0;
  287. klient->sendeEncrypted( "\5", 1 );
  288. char serverReturn = 0;
  289. klient->getNachrichtEncrypted( &serverReturn, 1 );
  290. if( serverReturn == 3 )
  291. {
  292. char byte = 0;
  293. klient->getNachrichtEncrypted( &byte, 1 );
  294. delete[]fehler;
  295. fehler = new char[ byte + 1 ];
  296. fehler[ byte ] = 0;
  297. klient->getNachrichtEncrypted( fehler, byte );
  298. cs.unlock();
  299. return 0;
  300. }
  301. unsigned char byte = (unsigned char)textLength( name );
  302. klient->sendeEncrypted( (char*)&byte, 1 );
  303. klient->sendeEncrypted( name, byte );
  304. byte = (unsigned char)textLength( pass );
  305. klient->sendeEncrypted( (char*)&byte, 1 );
  306. klient->sendeEncrypted( pass, byte );
  307. klient->getNachrichtEncrypted( (char*)&byte, 1 );
  308. if( byte == 1 )
  309. {
  310. char host[ 255 ] = "";
  311. getHostName( host, 255 );
  312. Text *addresse = new Text( getHostAddresse() );
  313. unsigned char localIp[ 4 ];
  314. localIp[ 0 ] = TextZuInt( addresse->getText(), 10 );
  315. localIp[ 1 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 0 ) + 1, 10 );
  316. localIp[ 2 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 1 ) + 1, 10 );
  317. localIp[ 3 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 2 ) + 1, 10 );
  318. addresse = addresse->release();
  319. klient->sendeEncrypted( (char*)&localIp, 4 );
  320. byte = textLength( host );
  321. klient->sendeEncrypted( (char*)&byte, 1 );
  322. klient->sendeEncrypted( host, byte );
  323. klient->getNachrichtEncrypted( (char*)&accountId, 4 );
  324. cs.unlock();
  325. return 1;
  326. }
  327. else if( byte == 2 )
  328. {
  329. brauchKick = 1;
  330. cs.unlock();
  331. return 2;
  332. }
  333. else if( byte == 3 )
  334. {
  335. klient->getNachrichtEncrypted( (char*)&byte, 1 );
  336. delete[]fehler;
  337. fehler = new char[ byte + 1 ];
  338. fehler[ byte ] = 0;
  339. klient->getNachrichtEncrypted( fehler, byte );
  340. }
  341. cs.unlock();
  342. return 0;
  343. }
  344. bool LoginKlient::kick( const char *geheim )
  345. {
  346. if( !brauchKick )
  347. return 1;
  348. cs.lock();
  349. brauchKick = 0;
  350. unsigned char byte = (unsigned char)textLength( geheim );
  351. klient->sendeEncrypted( (char*)&byte, 1 );
  352. klient->sendeEncrypted( geheim, byte );
  353. klient->getNachrichtEncrypted( (char*)&byte, 1 );
  354. if( !byte )
  355. {
  356. cs.unlock();
  357. return 0;
  358. }
  359. char host[ 255 ];
  360. getHostName( host, 255 );
  361. Text *addresse = new Text( getHostAddresse() );
  362. unsigned char localIp[ 4 ];
  363. localIp[ 0 ] = TextZuInt( addresse->getText(), 10 );
  364. localIp[ 1 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 0 ) + 1, 10 );
  365. localIp[ 2 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 1 ) + 1, 10 );
  366. localIp[ 3 ] = TextZuInt( addresse->getText() + addresse->positionVon( '.', 2 ) + 1, 10 );
  367. addresse = addresse->release();
  368. klient->sendeEncrypted( (char*)&localIp, 4 );
  369. byte = textLength( host );
  370. klient->sendeEncrypted( (char*)&byte, 1 );
  371. klient->sendeEncrypted( host, byte );
  372. klient->getNachrichtEncrypted( (char*)&accountId, 4 );
  373. cs.unlock();
  374. return 1;
  375. }
  376. bool LoginKlient::logout() // logt den Account aus
  377. {
  378. cs.lock();
  379. if( !verbunden )
  380. verbinde();
  381. if( !verbunden )
  382. {
  383. cs.unlock();
  384. return 0;
  385. }
  386. if( brauchKick )
  387. klient->sendeEncrypted( "\0", 1 );
  388. brauchKick = 0;
  389. klient->sendeEncrypted( "\6", 1 );
  390. char serverReturn = 0;
  391. klient->getNachrichtEncrypted( &serverReturn, 1 );
  392. if( serverReturn == 3 )
  393. {
  394. char byte = 0;
  395. klient->getNachrichtEncrypted( &byte, 1 );
  396. delete[]fehler;
  397. fehler = new char[ byte + 1 ];
  398. fehler[ byte ] = 0;
  399. klient->getNachrichtEncrypted( fehler, byte );
  400. cs.unlock();
  401. return 0;
  402. }
  403. klient->sendeEncrypted( (char*)&accountId, 4 );
  404. klient->getNachrichtEncrypted( &serverReturn, 1 );
  405. if( serverReturn == 3 )
  406. {
  407. char byte = 0;
  408. klient->getNachrichtEncrypted( &byte, 1 );
  409. delete[]fehler;
  410. fehler = new char[ byte + 1 ];
  411. fehler[ byte ] = 0;
  412. klient->getNachrichtEncrypted( fehler, byte );
  413. cs.unlock();
  414. return 0;
  415. }
  416. cs.unlock();
  417. return 1;
  418. }
  419. bool LoginKlient::keepAlive() // Erhält die Verbindung aufrecht
  420. {
  421. if( !verbunden )
  422. return 0;
  423. char res = 0;
  424. if( !cs.tryLock() )
  425. return 1;
  426. Framework::logLine( "Verbindungstest zum Login Server..." );
  427. bool ok = klient->sendeEncrypted( "\x7", 1 );
  428. ok &= klient->getNachrichtEncrypted( &res, 1 );
  429. cs.unlock();
  430. if( res != 1 || !ok )
  431. {
  432. Framework::logLine( "Verbindungsabbruch." );
  433. trenne();
  434. }
  435. else
  436. Framework::logLine( "Verbindung besteht." );
  437. return res == 1;
  438. }
  439. bool LoginKlient::trenne() // trennt sich von dem Login Server
  440. {
  441. if( verbunden )
  442. {
  443. cs.lock();
  444. Framework::logLine( "Verbindung zum Login Server wird getrennt..." );
  445. if( brauchKick )
  446. klient->sendeEncrypted( "\0", 1 );
  447. brauchKick = 0;
  448. klient->sendeEncrypted( "\3", 1 );
  449. char serverReturn = 0;
  450. klient->getNachrichtEncrypted( &serverReturn, 1 );
  451. klient->trenne();
  452. verbunden = 0;
  453. cs.unlock();
  454. }
  455. return 1;
  456. }
  457. void LoginKlient::setLetzterFehler( char *err ) // setzt den letzten Fehler
  458. {
  459. if( fehler )
  460. delete[]fehler;
  461. fehler = new char[ textLength( err ) + 1 ];
  462. memcpy( fehler, err, textLength( err ) );
  463. fehler[ textLength( err ) ] = 0;
  464. }
  465. // constant
  466. bool LoginKlient::istVerbunden() const // prüft, ob mit Login Server verbunden
  467. {
  468. return verbunden;
  469. }
  470. int LoginKlient::getAccountId() const // gibt die AccountId zurück
  471. {
  472. return accountId;
  473. }
  474. char *LoginKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück
  475. {
  476. return fehler;
  477. }
  478. // Reference Counting
  479. LoginKlient *LoginKlient::getThis()
  480. {
  481. ref++;
  482. return this;
  483. }
  484. LoginKlient *LoginKlient::release()
  485. {
  486. ref--;
  487. if( !ref )
  488. delete this;
  489. return 0;
  490. }