LoginK.cpp 15 KB

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