PSKlient.cpp 14 KB

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