PSKlient.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. #include "PSKlient.h"
  2. #include <Text.h>
  3. #include <Datei.h>
  4. #include <Zeit.h>
  5. #include <InitDatei.h>
  6. #include "Keys.h"
  7. // Inhalt der PSKlient Klasse aus PSKlient.h
  8. // Konstruktor
  9. PSKlient::PSKlient()
  10. {
  11. Datei *dat = new Datei();
  12. dat->setDatei( "data/tmp/k.id" );
  13. dat->open( Datei::Style::lesen );
  14. dat->lese( (char*)&id, 4 );
  15. dat->close();
  16. klient = 0;
  17. InitializeCriticalSection( &cs );
  18. verbunden = 0;
  19. dat->setDatei( "data/tmp/schlüssel.netw" );
  20. dat->open( Datei::Style::lesen );
  21. dat->lese( &schlüsselLän, 1 );
  22. schlüssel = new char[ schlüsselLän ];
  23. dat->lese( schlüssel, schlüsselLän );
  24. dat->close();
  25. dat = dat->release();
  26. fehler = new Text();
  27. ref = 1;
  28. }
  29. // Destruktor
  30. PSKlient::~PSKlient()
  31. {
  32. delete[] schlüssel;
  33. if( verbunden )
  34. trenne( 1 );
  35. if( klient )
  36. klient->release();
  37. fehler->release();
  38. DeleteCriticalSection( &cs );
  39. }
  40. // nicht constant
  41. void PSKlient::lock()
  42. {
  43. EnterCriticalSection( &cs );
  44. }
  45. void PSKlient::unlock()
  46. {
  47. LeaveCriticalSection( &cs );
  48. }
  49. bool PSKlient::verbinde()
  50. {
  51. lock();
  52. if( verbunden )
  53. {
  54. unlock();
  55. return 1;
  56. }
  57. if( !klient )
  58. {
  59. InitDatei *iniDat = new InitDatei( "data/optionen.ini" );
  60. iniDat->laden();
  61. Text *ipT = iniDat->getWert( "ServerIP" );
  62. Datei d;
  63. d.setDatei( "data/tmp/m.port" );
  64. d.open( Datei::Style::lesen );
  65. int port = 0;
  66. d.lese( (char*)&port, 4 );
  67. iniDat->release();
  68. d.close();
  69. int län = ipT->getLength();
  70. char *msIp = new char[ län + 1 ];
  71. msIp[ län ] = 0;
  72. for( int i = 0; i < län; i++ )
  73. msIp[ i ] = ipT->getText()[ i ];
  74. ipT->release();
  75. klient = new Klient();
  76. char *key;
  77. int length;
  78. Keys::getServerKey( &key, length, Keys::MAIN, Keys::SENDEN );
  79. klient->setSendeKey( key, length );
  80. delete[] key;
  81. Keys::getServerKey( &key, length, Keys::MAIN, Keys::EMPFANGEN );
  82. klient->setEmpfangKey( key, length );
  83. delete[] key;
  84. if( !klient->verbinde( port, msIp ) )
  85. {
  86. fehler->setText( "Fehler beim verbinden mit dem Main Server. Bitte versuche es Später erneut." );
  87. klient = klient->release();
  88. delete[] msIp;
  89. unlock();
  90. return 0;
  91. }
  92. delete[] msIp;
  93. klient->sende( "\0", 1 ); // verschlüsselung aktivieren
  94. klient->sendeEncrypted( "\1", 1 );
  95. klient->sendeEncrypted( (char*)&id, 4 );
  96. char serverReturn = 0;
  97. klient->getNachrichtEncrypted( &serverReturn, 1 );
  98. if( serverReturn == 3 )
  99. {
  100. char byte = 0;
  101. klient->getNachrichtEncrypted( &byte, 1 );
  102. char *err = new char[ byte + 1 ];
  103. err[ byte ] = 0;
  104. klient->getNachrichtEncrypted( err, byte );
  105. fehler->setText( err );
  106. delete[] err;
  107. klient->sendeEncrypted( "\3", 1 );
  108. klient->getNachrichtEncrypted( &serverReturn, 1 );
  109. klient->trenne();
  110. klient = klient->release();
  111. unlock();
  112. return 0;
  113. }
  114. klient->setSendeKey( schlüssel, schlüsselLän );
  115. klient->setEmpfangKey( schlüssel, schlüsselLän );
  116. klient->sendeEncrypted( "\6\2", 2 );
  117. char byte = 0;
  118. klient->getNachrichtEncrypted( &byte, 1 );
  119. if( byte == 2 )
  120. {
  121. unsigned char psIp[ 4 ];
  122. klient->getNachrichtEncrypted( (char *)psIp, 4 );
  123. unsigned short psPort = 0;
  124. klient->getNachrichtEncrypted( (char*)&psPort, 2 );
  125. klient->sendeEncrypted( "\3", 1 );
  126. klient->getNachrichtEncrypted( &serverReturn, 1 );
  127. klient->trenne();
  128. Text *psIpT = new Text( "" );
  129. psIpT->append( (int)psIp[ 0 ] );
  130. psIpT->append( "." );
  131. psIpT->append( (int)psIp[ 1 ] );
  132. psIpT->append( "." );
  133. psIpT->append( (int)psIp[ 2 ] );
  134. psIpT->append( "." );
  135. psIpT->append( (int)psIp[ 3 ] );
  136. if( verbinde( psPort, psIpT->getText() ) )
  137. {
  138. unlock();
  139. psIpT->release();
  140. return 1;
  141. }
  142. psIpT->release();
  143. }
  144. if( byte == 3 )
  145. {
  146. klient->getNachrichtEncrypted( &byte, 1 );
  147. char *err = new char[ byte + 1 ];
  148. err[ byte ] = 0;
  149. klient->getNachrichtEncrypted( err, byte );
  150. fehler->setText( err );
  151. delete[] err;
  152. klient->sendeEncrypted( "\3", 1 );
  153. klient->getNachrichtEncrypted( &serverReturn, 1 );
  154. klient->trenne();
  155. klient = klient->release();
  156. unlock();
  157. return 0;
  158. }
  159. }
  160. if( klient && verbinde( klient->getServerPort(), klient->getServerIp() ) )
  161. {
  162. unlock();
  163. return 1;
  164. }
  165. unlock();
  166. return 0;
  167. }
  168. bool PSKlient::verbinde( int port, const char *ip )
  169. {
  170. lock();
  171. if( verbunden )
  172. trenne( 1 );
  173. if( !klient )
  174. klient = new Klient();
  175. if( !klient->verbinde( (short)port, ip ) )
  176. {
  177. unlock();
  178. return 0;
  179. }
  180. char *key;
  181. int length;
  182. Keys::getServerKey( &key, length, Keys::PATCH, Keys::SENDEN );
  183. klient->setSendeKey( key, length );
  184. delete[] key;
  185. Keys::getServerKey( &key, length, Keys::PATCH, Keys::EMPFANGEN );
  186. klient->setEmpfangKey( key, length );
  187. delete[] key;
  188. klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
  189. klient->sendeEncrypted( "\1", 1 );
  190. klient->sendeEncrypted( (char*)&id, 4 );
  191. #ifdef _WIN64
  192. klient->sendeEncrypted( "\2", 1 ); // 64 Bit Client
  193. #else
  194. klient->sendeEncrypted( "\1", 1 ); // 32 Bit Client
  195. #endif
  196. char ret = 0;
  197. klient->getNachrichtEncrypted( &ret, 1 );
  198. if( ret == 3 )
  199. { // error
  200. klient->getNachrichtEncrypted( &ret, 1 );
  201. char *msg = new char[ ret + 1 ];
  202. msg[ ret ] = 0;
  203. if( ret )
  204. klient->getNachrichtEncrypted( msg, ret );
  205. fehler->setText( msg );
  206. delete[] msg;
  207. trenne( 0 );
  208. unlock();
  209. return 0;
  210. }
  211. klient->setSendeKey( schlüssel, schlüsselLän );
  212. klient->setEmpfangKey( schlüssel, schlüsselLän );
  213. verbunden = 1;
  214. unlock();
  215. return 1;
  216. }
  217. KSGTDatei *PSKlient::getDateiGruppenListe()
  218. {
  219. lock();
  220. if( !verbunden )
  221. {
  222. unlock();
  223. return 0;
  224. }
  225. klient->sendeEncrypted( "\xC", 1 );
  226. char ret = 0;
  227. klient->getNachrichtEncrypted( &ret, 1 );
  228. if( ret == 3 )
  229. { // error
  230. klient->getNachrichtEncrypted( &ret, 1 );
  231. char *msg = new char[ ret + 1 ];
  232. msg[ ret ] = 0;
  233. if( ret )
  234. klient->getNachrichtEncrypted( msg, ret );
  235. fehler->setText( msg );
  236. delete[] msg;
  237. unlock();
  238. return 0;
  239. }
  240. KSGTDatei *dgtb = new KSGTDatei();
  241. int id = 0;
  242. klient->getNachrichtEncrypted( (char*)&id, 4 );
  243. while( id )
  244. {
  245. RCArray< Text > *zeile = new RCArray< Text >();
  246. Text *idT = new Text();
  247. idT->append( id );
  248. zeile->set( idT, 0 );
  249. int län = 0;
  250. klient->getNachrichtEncrypted( (char*)&län, 4 );
  251. char *pfad = new char[ län + 1 ];
  252. pfad[ län ] = 0;
  253. if( län )
  254. klient->getNachrichtEncrypted( pfad, län );
  255. zeile->set( new Text( pfad ), 1 );
  256. delete[] pfad;
  257. int vs = 0;
  258. klient->getNachrichtEncrypted( (char*)&vs, 4 );
  259. Text *vsT = new Text();
  260. vsT->append( vs );
  261. zeile->set( vsT, 2 );
  262. dgtb->addZeile( 3, zeile );
  263. zeile->release();
  264. klient->getNachrichtEncrypted( (char*)&id, 4 );
  265. }
  266. klient->sendeEncrypted( "\1", 1 );
  267. unlock();
  268. return dgtb;
  269. }
  270. KSGTDatei *PSKlient::getDateiListe( int gruppe )
  271. {
  272. lock();
  273. if( !verbunden )
  274. {
  275. unlock();
  276. return 0;
  277. }
  278. klient->sendeEncrypted( "\x9", 1 );
  279. char ret = 0;
  280. klient->getNachrichtEncrypted( &ret, 1 );
  281. if( ret == 3 )
  282. { // error
  283. klient->getNachrichtEncrypted( &ret, 1 );
  284. char *msg = new char[ ret + 1 ];
  285. msg[ ret ] = 0;
  286. if( ret )
  287. klient->getNachrichtEncrypted( msg, ret );
  288. fehler->setText( msg );
  289. delete[] msg;
  290. unlock();
  291. return 0;
  292. }
  293. klient->sendeEncrypted( (char*)&gruppe, 4 );
  294. klient->getNachrichtEncrypted( &ret, 1 );
  295. if( ret == 3 )
  296. { // error
  297. klient->getNachrichtEncrypted( &ret, 1 );
  298. char *msg = new char[ ret + 1 ];
  299. msg[ ret ] = 0;
  300. if( ret )
  301. klient->getNachrichtEncrypted( msg, ret );
  302. fehler->setText( msg );
  303. delete[] msg;
  304. unlock();
  305. return 0;
  306. }
  307. KSGTDatei *dtb = new KSGTDatei();
  308. int län = 0;
  309. klient->getNachrichtEncrypted( (char*)&län, 4 );
  310. while( län )
  311. {
  312. RCArray< Text > *zeile = new RCArray< Text >();
  313. zeile->set( new Text( "1" ), 0 );
  314. char *pfad = new char[ län + 1 ];
  315. pfad[ län ] = 0;
  316. klient->getNachrichtEncrypted( pfad, län );
  317. zeile->set( new Text( pfad ), 1 );
  318. delete[] pfad;
  319. int vs = 0;
  320. klient->getNachrichtEncrypted( (char*)&vs, 4 );
  321. Text *vsT = new Text();
  322. vsT->append( vs );
  323. zeile->set( vsT, 2 );
  324. dtb->addZeile( 3, zeile );
  325. zeile->release();
  326. klient->getNachrichtEncrypted( (char*)&län, 4 );
  327. }
  328. klient->getNachrichtEncrypted( (char*)&län, 4 );
  329. while( län )
  330. {
  331. RCArray< Text > *zeile = new RCArray< Text >();
  332. zeile->set( new Text( "0" ), 0 );
  333. char *pfad = new char[ län + 1 ];
  334. pfad[ län ] = 0;
  335. klient->getNachrichtEncrypted( pfad, län );
  336. zeile->set( new Text( pfad ), 1 );
  337. delete[] pfad;
  338. dtb->addZeile( 2, zeile );
  339. zeile->release();
  340. klient->getNachrichtEncrypted( (char*)&län, 4 );
  341. }
  342. unlock();
  343. return dtb;
  344. }
  345. __int64 PSKlient::getDateiGröße( int gruppe, const char *pfad )
  346. {
  347. lock();
  348. if( !verbunden )
  349. {
  350. unlock();
  351. return 0;
  352. }
  353. klient->sendeEncrypted( "\xA", 1 );
  354. char ret = 0;
  355. klient->getNachrichtEncrypted( &ret, 1 );
  356. if( ret == 3 )
  357. { // error
  358. klient->getNachrichtEncrypted( &ret, 1 );
  359. char *msg = new char[ ret + 1 ];
  360. msg[ ret ] = 0;
  361. if( ret )
  362. klient->getNachrichtEncrypted( msg, ret );
  363. fehler->setText( msg );
  364. delete[] msg;
  365. unlock();
  366. return 0;
  367. }
  368. klient->sendeEncrypted( (char*)&gruppe, 4 );
  369. ret = 0;
  370. klient->getNachrichtEncrypted( &ret, 1 );
  371. if( ret == 3 )
  372. { // error
  373. klient->getNachrichtEncrypted( &ret, 1 );
  374. char *msg = new char[ ret + 1 ];
  375. msg[ ret ] = 0;
  376. if( ret )
  377. klient->getNachrichtEncrypted( msg, ret );
  378. fehler->setText( msg );
  379. delete[] msg;
  380. unlock();
  381. return 0;
  382. }
  383. if( ret == 2 )
  384. { // verweis auf anderen Server
  385. int port = 0;
  386. klient->getNachrichtEncrypted( (char*)&port, 4 );
  387. int län = 0;
  388. klient->getNachrichtEncrypted( (char*)&län, 4 );
  389. char *ip = new char[ län + 1 ];
  390. ip[ län ] = 0;
  391. klient->getNachrichtEncrypted( ip, län );
  392. if( !trenne( 0 ) )
  393. {
  394. delete[] ip;
  395. unlock();
  396. return 0;
  397. }
  398. if( !verbinde( port, ip ) )
  399. {
  400. delete[] ip;
  401. unlock();
  402. return 0;
  403. }
  404. delete[] ip;
  405. unlock();
  406. return getDateiGröße( gruppe, pfad );
  407. }
  408. int län = textLength( pfad );
  409. klient->sendeEncrypted( (char*)&län, 4 );
  410. klient->sendeEncrypted( pfad, län );
  411. __int64 größe = 0;
  412. klient->getNachrichtEncrypted( (char*)&größe, 8 );
  413. unlock();
  414. return größe;
  415. }
  416. bool PSKlient::downloadDatei( int gruppe, __int64 *start, const char *pfad, const char *zielPfad, FBalken *zFb, bool *abbruch, int maxbps )
  417. {
  418. lock();
  419. if( !verbunden )
  420. {
  421. unlock();
  422. return 0;
  423. }
  424. Datei *zielD = new Datei();
  425. zielD->setDatei( zielPfad );
  426. if( !zielD->existiert() )
  427. zielD->erstellen();
  428. bool ok = 0;
  429. if( !( *start ) ) // datei neu erstellen
  430. ok = zielD->open( Datei::Style::schreiben );
  431. else // datei weiterschreiben
  432. ok = zielD->open( Datei::Style::schreiben | Datei::Style::lesen );
  433. if( !ok )
  434. {
  435. zielD->release();
  436. unlock();
  437. return 0;
  438. }
  439. zielD->setSPosition( *start, 0 );
  440. klient->sendeEncrypted( "\xB", 1 );
  441. char ret = 0;
  442. klient->getNachrichtEncrypted( &ret, 1 );
  443. if( ret == 3 )
  444. { // error
  445. klient->getNachrichtEncrypted( &ret, 1 );
  446. char *msg = new char[ ret + 1 ];
  447. msg[ ret ] = 0;
  448. if( ret )
  449. klient->getNachrichtEncrypted( msg, ret );
  450. fehler->setText( msg );
  451. delete[] msg;
  452. zielD->close();
  453. zielD->release();
  454. unlock();
  455. return 0;
  456. }
  457. klient->sendeEncrypted( (char*)&gruppe, 4 );
  458. ret = 0;
  459. klient->getNachrichtEncrypted( &ret, 1 );
  460. if( ret == 3 )
  461. { // error
  462. klient->getNachrichtEncrypted( &ret, 1 );
  463. char *msg = new char[ ret + 1 ];
  464. msg[ ret ] = 0;
  465. if( ret )
  466. klient->getNachrichtEncrypted( msg, ret );
  467. fehler->setText( msg );
  468. delete[] msg;
  469. zielD->close();
  470. zielD->release();
  471. unlock();
  472. return 0;
  473. }
  474. if( ret == 2 )
  475. { // verweis auf anderen Server
  476. int port = 0;
  477. klient->getNachrichtEncrypted( (char*)&port, 4 );
  478. int län = 0;
  479. klient->getNachrichtEncrypted( (char*)&län, 4 );
  480. char *ip = new char[ län + 1 ];
  481. ip[ län ] = 0;
  482. klient->getNachrichtEncrypted( ip, län );
  483. if( !trenne( 0 ) )
  484. {
  485. delete[] ip;
  486. zielD->close();
  487. zielD->release();
  488. unlock();
  489. return 0;
  490. }
  491. if( !verbinde( port, ip ) )
  492. {
  493. delete[] ip;
  494. zielD->close();
  495. zielD->release();
  496. unlock();
  497. return 0;
  498. }
  499. delete[] ip;
  500. zielD->close();
  501. zielD->release();
  502. unlock();
  503. return downloadDatei( gruppe, start, pfad, zielPfad, zFb, abbruch, maxbps );
  504. }
  505. int län = textLength( pfad );
  506. klient->sendeEncrypted( (char*)&län, 4 );
  507. klient->sendeEncrypted( pfad, län );
  508. klient->sendeEncrypted( (char*)start, 8 );
  509. char *bytes = new char[ 2048 ];
  510. unsigned short byteLän = 0;
  511. klient->getNachricht( (char*)&byteLän, 2 );
  512. ZeitMesser *zMess = new ZeitMesser();
  513. zMess->messungStart();
  514. if( byteLän )
  515. {
  516. int bps = 0;
  517. double sec = 0;
  518. while( 1 )
  519. {
  520. klient->getNachricht( bytes, byteLän );
  521. zielD->schreibe( bytes, byteLän );
  522. if( zFb )
  523. zFb->aktionPlus( byteLän );
  524. ( *start ) += byteLän;
  525. bps += byteLän;
  526. if( byteLän == 2048 )
  527. {
  528. if( ( *abbruch ) )
  529. {
  530. zielD->close();
  531. zielD->release();
  532. klient->trenne();
  533. verbunden = 0;
  534. delete[] bytes;
  535. zMess->release();
  536. unlock();
  537. return 1;
  538. }
  539. klient->getNachricht( (char*)&byteLän, 2 ); // sendelänge empfangen
  540. if( !byteLän )
  541. break;
  542. }
  543. else
  544. break;
  545. if( maxbps )
  546. {
  547. zMess->messungEnde();
  548. sec += zMess->getSekunden();
  549. zMess->messungStart();
  550. if( sec >= 1 )
  551. {
  552. sec = 0;
  553. bps = 0;
  554. }
  555. while( bps >= maxbps )
  556. {
  557. Sleep( 10 );
  558. zMess->messungEnde();
  559. sec += zMess->getSekunden();
  560. zMess->messungStart();
  561. if( sec >= 1 )
  562. {
  563. sec = 0;
  564. bps = 0;
  565. }
  566. }
  567. }
  568. }
  569. }
  570. zMess->release();
  571. delete[] bytes;
  572. klient->sendeEncrypted( "\1", 1 );
  573. zielD->close();
  574. zielD->release();
  575. unlock();
  576. return 1;
  577. }
  578. bool PSKlient::trenne( bool abmelden )
  579. {
  580. lock();
  581. if( !verbunden )
  582. {
  583. unlock();
  584. return 1;
  585. }
  586. if( abmelden )
  587. {
  588. klient->sendeEncrypted( "\4", 1 );
  589. char ret = 0;
  590. klient->getNachrichtEncrypted( &ret, 1 );
  591. if( ret == 3 )
  592. { // error
  593. klient->getNachrichtEncrypted( &ret, 1 );
  594. char *msg = new char[ ret + 1 ];
  595. msg[ ret ] = 0;
  596. if( ret )
  597. klient->getNachrichtEncrypted( msg, ret );
  598. fehler->setText( msg );
  599. unlock();
  600. delete[] msg;
  601. }
  602. }
  603. klient->sendeEncrypted( "\3", 1 );
  604. char ret = 0;
  605. klient->getNachrichtEncrypted( &ret, 1 );
  606. if( ret == 3 )
  607. { // error
  608. klient->getNachrichtEncrypted( &ret, 1 );
  609. char *msg = new char[ ret + 1 ];
  610. msg[ ret ] = 0;
  611. if( ret )
  612. klient->getNachrichtEncrypted( msg, ret );
  613. unlock();
  614. fehler->setText( msg );
  615. delete[] msg;
  616. }
  617. klient->trenne();
  618. if( abmelden )
  619. klient = klient->release();
  620. verbunden = 0;
  621. unlock();
  622. return 1;
  623. }
  624. // constant
  625. bool PSKlient::istVerbunden() const
  626. {
  627. return verbunden;
  628. }
  629. bool PSKlient::istRegistriert() const
  630. {
  631. return klient != 0;
  632. }
  633. int PSKlient::getDownload() const
  634. {
  635. return klient ? (klient->getDownloadBytes( 1 ) + klient->getUploadBytes( 1 ) ) : 0;
  636. }
  637. Text *PSKlient::zError() const
  638. {
  639. return fehler;
  640. }
  641. // Reference Counting
  642. PSKlient *PSKlient::getThis()
  643. {
  644. ref++;
  645. return this;
  646. }
  647. PSKlient *PSKlient::release()
  648. {
  649. ref--;
  650. if( !ref )
  651. delete this;
  652. return 0;
  653. }