Server.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. #include <openssl/ssl.h>
  2. #include "Server.h"
  3. #ifndef WIN32
  4. #include <string.h>
  5. #endif
  6. #include <Key.h>
  7. #include <Text.h>
  8. using namespace Network;
  9. // Inhalt der Server Klasse aus Server.h
  10. // Konstruktor
  11. Server::Server()
  12. {
  13. sock = 0;
  14. memset( &addresse, 0, sizeof( addresse ) ); // Adresse setzen
  15. addresse.sin_family = AF_INET;
  16. addresse.sin_addr.s_addr = ADDR_ANY;
  17. ref = 1;
  18. klients = 0;
  19. }
  20. // Destruktor
  21. Server::~Server()
  22. {
  23. trenne();
  24. }
  25. // nicht constant
  26. bool Server::verbinde( unsigned short port, int warteschlangenLen ) // Öffnet das Socket
  27. {
  28. sock = socket( AF_INET, SOCK_STREAM, 0 ); // Socket erstellen
  29. addresse.sin_port = htons( port ); // port setzen
  30. if( bind( sock, ( struct sockaddr* )&addresse, sizeof( addresse ) ) == -1 ) // socket öffnen
  31. {
  32. trenne();
  33. return 0; // Fehler
  34. }
  35. if( listen( sock, warteschlangenLen ) == -1 ) // Klients annehmen
  36. {
  37. trenne();
  38. return 0; // Fehler
  39. }
  40. return 1;
  41. }
  42. SKlient *Server::getKlient() // nimmt Klient an
  43. {
  44. if( !sock )
  45. return 0;
  46. sockaddr_in client;
  47. int len = sizeof( addresse );
  48. #ifdef WIN32
  49. SOCKET cls = accept( sock, (sockaddr*)&client, &len ); // Klient empfangen
  50. if( cls == INVALID_SOCKET )
  51. {
  52. trenne();
  53. return 0;
  54. }
  55. #else
  56. SOCKET cls = accept( sock, (sockaddr*)&client, (socklen_t*)&len ); // Klient empfangen
  57. if( !cls )
  58. {
  59. if( errno == ECONNABORTED || errno == EBADF )
  60. trenne();
  61. return 0;
  62. }
  63. #endif
  64. client.sin_port = addresse.sin_port;
  65. klients++;
  66. return new SKlient( client, cls ); // Klient Handle Klasse zurückgeben
  67. }
  68. int Server::getKlients( bool reset ) // gibt die Anzahl der Klients zurück
  69. {
  70. int ret = klients;
  71. if( reset )
  72. klients = 0;
  73. return ret;
  74. }
  75. bool Server::trenne() // beendet den Server
  76. {
  77. if( !sock )
  78. return 1;
  79. if( closesocket( sock ) < 0 ) // socket schließen
  80. return 0;
  81. sock = 0;
  82. return 1;
  83. }
  84. // constant
  85. unsigned short Server::getPort() const // gibt den Port zurück
  86. {
  87. return htons( addresse.sin_port );
  88. }
  89. bool Server::isConnected() const // giebt 1 zurück, falls der Server verbunden ist
  90. {
  91. return sock != 0;
  92. }
  93. // Reference Counting
  94. Server *Server::getThis()
  95. {
  96. ref++;
  97. return this;
  98. }
  99. Server *Server::release()
  100. {
  101. ref--;
  102. if( !ref )
  103. delete this;
  104. return 0;
  105. }
  106. // Inhalt der SKlient Klasse aus Server.h
  107. // Konstruktor
  108. SKlient::SKlient( sockaddr_in addresse, SOCKET sock )
  109. {
  110. clientAddr = addresse;
  111. this->sock = sock;
  112. ref = 1;
  113. downStreamBytes = 0;
  114. upStreamBytes = 0;
  115. sendeKey = 0;
  116. empfangKey = 0;
  117. }
  118. // Destruktor
  119. SKlient::~SKlient()
  120. {
  121. trenne();
  122. if( sendeKey )
  123. sendeKey->release();
  124. if( empfangKey )
  125. empfangKey->release();
  126. }
  127. // nicht constant
  128. void SKlient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
  129. {
  130. if( sendeKey )
  131. sendeKey->release();
  132. sendeKey = key;
  133. }
  134. void SKlient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
  135. {
  136. if( empfangKey )
  137. empfangKey->release();
  138. empfangKey = key;
  139. }
  140. void SKlient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
  141. {
  142. if( !sendeKey )
  143. sendeKey = new Encryption::Key();
  144. sendeKey->setKey( key, len );
  145. }
  146. void SKlient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
  147. {
  148. if( !empfangKey )
  149. empfangKey = new Encryption::Key();
  150. empfangKey->setKey( key, len );
  151. }
  152. bool SKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  153. {
  154. if( !sock )
  155. return 0;
  156. int ll = 0;
  157. while( len > 0 )
  158. {
  159. #ifdef WIN32
  160. int l = send( sock, nachricht + ll, len, 0 );
  161. #else
  162. int l = (int)send( sock, nachricht + ll, len, MSG_NOSIGNAL );
  163. #endif
  164. if( l <= 0 )
  165. return 0; // Fehler
  166. len -= l;
  167. ll += l;
  168. }
  169. upStreamBytes += ll;
  170. return 1;
  171. }
  172. bool SKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  173. {
  174. if( !sock )
  175. return 0;
  176. int ll = 0;
  177. while( len > 0 )
  178. {
  179. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  180. if( l <= 0 )
  181. return 0; // Fehler
  182. len -= l;
  183. ll += l;
  184. }
  185. downStreamBytes += ll;
  186. return 1;
  187. }
  188. bool SKlient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
  189. {
  190. if( !sendeKey )
  191. return sende( nachricht, len );
  192. Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
  193. sendeKey->codieren( n->getThis() ); int ll = 0;
  194. while( len > 0 )
  195. {
  196. #ifdef WIN32
  197. int l = send( sock, n->getBytes() + ll, len, 0 );
  198. #else
  199. int l = (int)send( sock, n->getBytes() + ll, len, MSG_NOSIGNAL );
  200. #endif
  201. if( l <= 0 )
  202. {
  203. n->release();
  204. return 0; // Fehler
  205. }
  206. len -= l;
  207. ll += l;
  208. }
  209. upStreamBytes += ll;
  210. n->release();
  211. return 1;
  212. }
  213. bool SKlient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
  214. {
  215. if( !empfangKey )
  216. return getNachricht( nachricht, len );
  217. int ll = 0;
  218. while( len > 0 )
  219. {
  220. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  221. if( l <= 0 )
  222. return 0; // Fehler
  223. len -= l;
  224. ll += l;
  225. }
  226. Encryption::Bytes *n = new Encryption::Bytes();
  227. n->setBytesZ( nachricht, ll );
  228. empfangKey->decodieren( n );
  229. downStreamBytes += ll;
  230. return 1;
  231. }
  232. int SKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  233. {
  234. int ret = downStreamBytes;
  235. if( reset )
  236. downStreamBytes = 0;
  237. return ret;
  238. }
  239. int SKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  240. {
  241. int ret = upStreamBytes;
  242. if( reset )
  243. upStreamBytes = 0;
  244. return ret;
  245. }
  246. bool SKlient::trenne() // trennt die Verbindung zum Klient
  247. {
  248. if( !sock )
  249. return 0;
  250. if( closesocket( sock ) < 0 ) // trennen
  251. return 0;
  252. sock = 0;
  253. return 1;
  254. }
  255. // constant
  256. unsigned short SKlient::getPort() const // gibt den Port zurück
  257. {
  258. return htons( clientAddr.sin_port );
  259. }
  260. const char *SKlient::getIp() const // gibt die Ip des Klients zurück
  261. {
  262. return inet_ntoa( clientAddr.sin_addr );
  263. }
  264. // Reference Counting
  265. SKlient *SKlient::getThis()
  266. {
  267. ref++;
  268. return this;
  269. }
  270. SKlient *SKlient::release()
  271. {
  272. ref--;
  273. if( !ref )
  274. delete this;
  275. return 0;
  276. }
  277. int pem_passwd_cb( char *buf, int size, int rwflag, void *userdata )
  278. {
  279. const char *passw = ( (Text*)userdata )->getText();
  280. memcpy( buf, passw, MIN( (unsigned int)size, strlen( passw ) + 1 ) );
  281. return (int)strlen( buf );
  282. }
  283. // Inhalt der SSLServer Klasse
  284. // Konstruktor
  285. SSLServer::SSLServer()
  286. {
  287. s = 0;
  288. ctx = SSL_CTX_new( SSLv23_server_method() );
  289. SSL_CTX_set_default_passwd_cb( ctx, pem_passwd_cb );
  290. passw = new Text();
  291. SSL_CTX_set_default_passwd_cb_userdata( ctx, passw );
  292. addr.sin_family = AF_INET;
  293. addr.sin_addr.s_addr = htonl( INADDR_ANY );
  294. klients = 0;
  295. ref = 1;
  296. }
  297. // Destruktor
  298. SSLServer::~SSLServer()
  299. {
  300. trenne();
  301. SSL_CTX_free( ctx );
  302. passw->release();
  303. #ifdef WIN32
  304. OPENSSL_thread_stop();
  305. #endif
  306. }
  307. // nicht constant
  308. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  309. bool SSLServer::setCertificateFile( const char *file )
  310. {
  311. return SSL_CTX_use_certificate_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  312. }
  313. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  314. bool SSLServer::setPrivateKeyFile( const char *file )
  315. {
  316. return SSL_CTX_use_PrivateKey_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  317. }
  318. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen werden)
  319. void SSLServer::setPrivateKeyPassword( const char *password )
  320. {
  321. passw->setText( password );
  322. }
  323. // Öffnet das Socket
  324. bool SSLServer::verbinde( unsigned short port, int warteschlangenLen )
  325. {
  326. addr.sin_port = htons( port );
  327. s = socket( AF_INET, SOCK_STREAM, 0 );
  328. if( s < 0 )
  329. {
  330. s = 0;
  331. return 0;
  332. }
  333. if( bind( s, ( struct sockaddr* )&addr, sizeof( addr ) ) < 0 )
  334. {
  335. trenne();
  336. return 0;
  337. }
  338. if( listen( s, warteschlangenLen ) < 0 )
  339. {
  340. trenne();
  341. return 0;
  342. }
  343. return 1;
  344. }
  345. // nimmt Klient an
  346. SSLSKlient *SSLServer::getKlient()
  347. {
  348. if( !s )
  349. return 0;
  350. int len = sizeof( addr );
  351. struct sockaddr_in addr;
  352. #ifdef WIN32
  353. SOCKET client = accept( s, ( struct sockaddr* )&addr, &len );
  354. if( client == INVALID_SOCKET )
  355. {
  356. trenne();
  357. return 0;
  358. }
  359. #else
  360. SOCKET client = accept( s, (sockaddr*)&addr, (socklen_t*)&len ); // Klient empfangen
  361. if( !client )
  362. {
  363. if( errno == ECONNABORTED || errno == EBADF )
  364. trenne();
  365. return 0;
  366. }
  367. #endif
  368. addr.sin_port = this->addr.sin_port;
  369. SSL *ssl = SSL_new( ctx );
  370. SSL_set_fd( ssl, (int)client );
  371. if( SSL_accept( ssl ) <= 0 )
  372. {
  373. SSL_free( ssl );
  374. closesocket( client );
  375. return 0;
  376. }
  377. klients++;
  378. return new SSLSKlient( addr, ssl, client );
  379. }
  380. // gibt die Anzahl der Klients zurück
  381. int SSLServer::getKlients( bool reset )
  382. {
  383. int ret = klients;
  384. if( reset )
  385. klients = 0;
  386. return ret;
  387. }
  388. // beendet den Server
  389. bool SSLServer::trenne()
  390. {
  391. if( !s )
  392. return 1;
  393. if( closesocket( s ) < 0 ) // socket schließen
  394. return 0;
  395. s = 0;
  396. return 1;
  397. }
  398. // constant
  399. // gibt den Port zurück
  400. unsigned short SSLServer::getPort() const
  401. {
  402. return htons( addr.sin_port );
  403. }
  404. // giebt 1 zurück, falls der Server verbunden ist
  405. bool SSLServer::isConnected() const
  406. {
  407. return s != 0;
  408. }
  409. // Reference Counting
  410. SSLServer *SSLServer::getThis()
  411. {
  412. ref++;
  413. return this;
  414. }
  415. SSLServer *SSLServer::release()
  416. {
  417. if( !--ref )
  418. delete this;
  419. return 0;
  420. }
  421. // Inhalt der SSLSKlient Klasse
  422. // Konstruktor
  423. SSLSKlient::SSLSKlient( sockaddr_in client, SSL *ssl, SOCKET s )
  424. {
  425. this->s = s;
  426. clientAddr = client;
  427. this->ssl = ssl;
  428. downStreamBytes = 0;
  429. upStreamBytes = 0;
  430. ref = 1;
  431. }
  432. // Destruktor
  433. SSLSKlient::~SSLSKlient()
  434. {
  435. trenne();
  436. #ifdef WIN32
  437. OPENSSL_thread_stop();
  438. #endif
  439. }
  440. // nicht constant
  441. bool SSLSKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  442. {
  443. if( !ssl )
  444. return 0;
  445. int ll = 0;
  446. while( len > 0 )
  447. {
  448. int l = SSL_write( ssl, nachricht + ll, len );
  449. if( l <= 0 )
  450. return 0; // Fehler
  451. len -= l;
  452. ll += l;
  453. }
  454. upStreamBytes += ll;
  455. return 1;
  456. }
  457. bool SSLSKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  458. {
  459. if( !ssl )
  460. return 0;
  461. int ll = 0;
  462. while( len > 0 )
  463. {
  464. int l = (int)SSL_read( ssl, nachricht + ll, len );
  465. if( l <= 0 )
  466. return 0; // Fehler
  467. len -= l;
  468. ll += l;
  469. }
  470. downStreamBytes += ll;
  471. return 1;
  472. }
  473. int SSLSKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  474. {
  475. int ret = downStreamBytes;
  476. if( reset )
  477. downStreamBytes = 0;
  478. return ret;
  479. }
  480. int SSLSKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  481. {
  482. int ret = upStreamBytes;
  483. if( reset )
  484. upStreamBytes = 0;
  485. return ret;
  486. }
  487. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  488. {
  489. if( !ssl )
  490. return 0;
  491. SSL_free( ssl );
  492. if( closesocket( s ) < 0 ) // trennen
  493. return 0;
  494. ssl = 0;
  495. s = 0;
  496. return 1;
  497. }
  498. // constant
  499. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  500. {
  501. return htons( clientAddr.sin_port );
  502. }
  503. const char *SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  504. {
  505. return inet_ntoa( clientAddr.sin_addr );
  506. }
  507. // Reference Counting
  508. SSLSKlient *SSLSKlient::getThis()
  509. {
  510. ref++;
  511. return this;
  512. }
  513. SSLSKlient *SSLSKlient::release()
  514. {
  515. if( !--ref )
  516. delete this;
  517. return 0;
  518. }