Server.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  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. passw->release();
  302. }
  303. // nicht constant
  304. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  305. bool SSLServer::setCertificateFile( const char *file )
  306. {
  307. return SSL_CTX_use_certificate_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  308. }
  309. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  310. bool SSLServer::setPrivateKeyFile( const char *file )
  311. {
  312. return SSL_CTX_use_PrivateKey_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  313. }
  314. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen werden)
  315. void SSLServer::setPrivateKeyPassword( const char *password )
  316. {
  317. passw->setText( password );
  318. }
  319. // Öffnet das Socket
  320. bool SSLServer::verbinde( unsigned short port, int warteschlangenLen )
  321. {
  322. addr.sin_port = htons( port );
  323. s = socket( AF_INET, SOCK_STREAM, 0 );
  324. if( s < 0 )
  325. {
  326. s = 0;
  327. return 0;
  328. }
  329. if( bind( s, ( struct sockaddr* )&addr, sizeof( addr ) ) < 0 )
  330. {
  331. trenne();
  332. return 0;
  333. }
  334. if( listen( s, warteschlangenLen ) < 0 )
  335. {
  336. trenne();
  337. return 0;
  338. }
  339. return 1;
  340. }
  341. // nimmt Klient an
  342. SSLSKlient *SSLServer::getKlient()
  343. {
  344. if( !s )
  345. return 0;
  346. int len = sizeof( addr );
  347. struct sockaddr_in addr;
  348. #ifdef WIN32
  349. SOCKET client = accept( s, ( struct sockaddr* )&addr, &len );
  350. if( client == INVALID_SOCKET )
  351. {
  352. trenne();
  353. return 0;
  354. }
  355. #else
  356. SOCKET client = accept( s, (sockaddr*)&addr, (socklen_t*)&len ); // Klient empfangen
  357. if( !client )
  358. {
  359. if( errno == ECONNABORTED || errno == EBADF )
  360. trenne();
  361. return 0;
  362. }
  363. #endif
  364. addr.sin_port = this->addr.sin_port;
  365. SSL *ssl = SSL_new( ctx );
  366. SSL_set_fd( ssl, (int)client );
  367. if( SSL_accept( ssl ) <= 0 )
  368. {
  369. SSL_free( ssl );
  370. closesocket( client );
  371. return 0;
  372. }
  373. klients++;
  374. return new SSLSKlient( addr, ssl, client );
  375. }
  376. // gibt die Anzahl der Klients zurück
  377. int SSLServer::getKlients( bool reset )
  378. {
  379. int ret = klients;
  380. if( reset )
  381. klients = 0;
  382. return ret;
  383. }
  384. // beendet den Server
  385. bool SSLServer::trenne()
  386. {
  387. if( !s )
  388. return 1;
  389. if( closesocket( s ) < 0 ) // socket schließen
  390. return 0;
  391. s = 0;
  392. return 1;
  393. }
  394. // constant
  395. // gibt den Port zurück
  396. unsigned short SSLServer::getPort() const
  397. {
  398. return htons( addr.sin_port );
  399. }
  400. // giebt 1 zurück, falls der Server verbunden ist
  401. bool SSLServer::isConnected() const
  402. {
  403. return s != 0;
  404. }
  405. // Reference Counting
  406. SSLServer *SSLServer::getThis()
  407. {
  408. ref++;
  409. return this;
  410. }
  411. SSLServer *SSLServer::release()
  412. {
  413. if( !--ref )
  414. delete this;
  415. return 0;
  416. }
  417. // Inhalt der SSLSKlient Klasse
  418. // Konstruktor
  419. SSLSKlient::SSLSKlient( sockaddr_in client, SSL *ssl, SOCKET s )
  420. {
  421. this->s = s;
  422. clientAddr = client;
  423. this->ssl = ssl;
  424. downStreamBytes = 0;
  425. upStreamBytes = 0;
  426. ref = 1;
  427. }
  428. // Destruktor
  429. SSLSKlient::~SSLSKlient()
  430. {
  431. trenne();
  432. }
  433. // nicht constant
  434. bool SSLSKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  435. {
  436. if( !ssl )
  437. return 0;
  438. int ll = 0;
  439. while( len > 0 )
  440. {
  441. int l = SSL_write( ssl, nachricht + ll, len );
  442. if( l <= 0 )
  443. return 0; // Fehler
  444. len -= l;
  445. ll += l;
  446. }
  447. upStreamBytes += ll;
  448. return 1;
  449. }
  450. bool SSLSKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  451. {
  452. if( !ssl )
  453. return 0;
  454. int ll = 0;
  455. while( len > 0 )
  456. {
  457. int l = (int)SSL_read( ssl, nachricht + ll, len );
  458. if( l <= 0 )
  459. return 0; // Fehler
  460. len -= l;
  461. ll += l;
  462. }
  463. downStreamBytes += ll;
  464. return 1;
  465. }
  466. int SSLSKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  467. {
  468. int ret = downStreamBytes;
  469. if( reset )
  470. downStreamBytes = 0;
  471. return ret;
  472. }
  473. int SSLSKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  474. {
  475. int ret = upStreamBytes;
  476. if( reset )
  477. upStreamBytes = 0;
  478. return ret;
  479. }
  480. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  481. {
  482. if( !ssl )
  483. return 0;
  484. SSL_free( ssl );
  485. if( closesocket( s ) < 0 ) // trennen
  486. return 0;
  487. ssl = 0;
  488. s = 0;
  489. return 1;
  490. }
  491. // constant
  492. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  493. {
  494. return htons( clientAddr.sin_port );
  495. }
  496. const char *SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  497. {
  498. return inet_ntoa( clientAddr.sin_addr );
  499. }
  500. // Reference Counting
  501. SSLSKlient *SSLSKlient::getThis()
  502. {
  503. ref++;
  504. return this;
  505. }
  506. SSLSKlient *SSLSKlient::release()
  507. {
  508. if( !--ref )
  509. delete this;
  510. return 0;
  511. }