Skip to content

Commit 0905a6e

Browse files
committed
Refactor the webserver server class to separate the HTTP and HTTPS
implementation, and gather all server settings in the new server_settings and ssl_server_settings.
1 parent f3ad94b commit 0905a6e

13 files changed

+619
-268
lines changed

History.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Version 2.4xxx
4343
- Changed: OpenZwave, kWh sensor now maybe compatible with more hardware
4444
- Changed: OpenZwave, not sending cold-white in the colorclass, solved issues on different Zipato bulbs
4545
- Changed: OpenZWave, Renamed internally 'Color Control' to 'Color"
46+
- Changed: Webserver, Refactor the webserver server class to separate the HTTP and HTTPS implementation, and gather all server settings in the new server_settings and ssl_server_settings.
4647
- Fixed: Alert Sensor, displaying sValue again
4748
- Fixed: Blockly, Set user variables (you need to resave your blockly's)
4849
- Fixed: Blockly, string uservariables where saved with quotes when not using with set-after

main/WebServer.cpp

Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -148,34 +148,27 @@ namespace http {
148148
{
149149
if (!m_bDoStop)
150150
{
151-
if (!m_bIsSecure)
152-
_log.Log(LOG_ERROR, "WebServer(HTTP) stopped by exception, starting again..., %s",e.what());
153-
else
154-
_log.Log(LOG_ERROR, "WebServer(SSL) stopped by exception, starting again..., %s", e.what());
155-
if (m_pWebEm)
151+
_log.Log(LOG_ERROR, "WebServer(%s) stopped by exception, starting again..., %s", m_server_alias.c_str(), e.what());
152+
if (m_pWebEm) {
156153
m_pWebEm->Stop();
154+
}
157155
continue;
158156
}
159157
}
160158
catch (...)
161159
{
162160
if (!m_bDoStop)
163161
{
164-
if (!m_bIsSecure)
165-
_log.Log(LOG_ERROR, "WebServer(HTTP) stopped by exception, starting again...");
166-
else
167-
_log.Log(LOG_ERROR, "WebServer(SSL) stopped by exception, starting again...");
168-
if (m_pWebEm)
162+
_log.Log(LOG_ERROR, "WebServer(%s) stopped by exception, starting again...", m_server_alias.c_str());
163+
if (m_pWebEm) {
169164
m_pWebEm->Stop();
165+
}
170166
continue;
171167
}
172168
}
173169
break;
174170
}
175-
if (!m_bIsSecure)
176-
_log.Log(LOG_STATUS, "WebServer(HTTP) stopped...");
177-
else
178-
_log.Log(LOG_STATUS, "WebServer(SSL) stopped...");
171+
_log.Log(LOG_STATUS, "WebServer(%s) stopped...", m_server_alias.c_str());
179172
}
180173

181174
void CWebServer::ReloadCustomSwitchIcons()
@@ -273,66 +266,55 @@ namespace http {
273266
}
274267
}
275268

276-
bool CWebServer::StartServer(const std::string &listenaddress, const std::string &listenport, const std::string &serverpath, const bool bIgnoreUsernamePassword, const std::string &secure_cert_file, const std::string &secure_cert_passphrase)
269+
bool CWebServer::StartServer(const server_settings & settings, const std::string &serverpath, const bool bIgnoreUsernamePassword)
277270
{
271+
m_server_alias = (settings.is_secure() == true) ? "SSL" : "HTTP";
272+
278273
StopServer();
279274

280-
if (listenport.empty())
275+
if (settings.listening_port.empty())
281276
return true;
282277

283278
ReloadCustomSwitchIcons();
284279

285280
if (m_pWebEm != NULL)
286281
delete m_pWebEm;
287282

288-
m_bIsSecure = !secure_cert_file.empty();
289-
290283
int tries = 0;
291284
bool exception = false;
292-
std::string listen_address = listenaddress;
293285

286+
server_settings * settings_copy = settings.clone(); // copy to change listening address
287+
//_log.Log(LOG_STATUS, "CWebServer::StartServer() : settings_copy : %s", settings_copy->to_string().c_str());
294288
do {
295289
try {
296290
exception = false;
297-
m_pWebEm = new http::server::cWebem(
298-
listen_address.c_str(), // address
299-
listenport.c_str(), // port
300-
serverpath.c_str(), secure_cert_file, secure_cert_passphrase);
291+
m_pWebEm = new http::server::cWebem(*settings_copy, serverpath.c_str());
301292
}
302293
catch (std::exception& e) {
303294
exception = true;
304295
switch (tries) {
305296
case 0:
306-
listen_address = "::";
297+
settings_copy->listening_address = "::";
307298
break;
308299
case 1:
309-
listen_address = "0.0.0.0";
300+
settings_copy->listening_address = "0.0.0.0";
310301
break;
311302
case 2:
312303
_log.Log(LOG_ERROR, "Failed to start the web server: %s", e.what());
313-
if (atoi(listenport.c_str()) < 1024)
304+
if (atoi(settings_copy->listening_port.c_str()) < 1024)
314305
_log.Log(LOG_ERROR, "check privileges for opening ports below 1024");
315306
else
316-
_log.Log(LOG_ERROR, "check if no other application is using port: %s", listenport.c_str());
307+
_log.Log(LOG_ERROR, "check if no other application is using port: %s", settings_copy->listening_port.c_str());
317308
return false;
318309
}
319310
tries++;
320311
}
321312
} while (exception);
322-
if (!m_bIsSecure)
323-
{
324-
if (listen_address != "0.0.0.0" && listen_address != "::")
325-
_log.Log(LOG_STATUS, "Webserver(HTTP) started on address: %s, port: %s", listen_address.c_str(), listenport.c_str());
326-
else
327-
_log.Log(LOG_STATUS, "Webserver(HTTP) started on port: %s", listenport.c_str());
328-
}
313+
314+
if (settings_copy->listening_address != "0.0.0.0" && settings_copy->listening_address != "::")
315+
_log.Log(LOG_STATUS, "Webserver(%s) started on address: %s, port: %s", m_server_alias.c_str(), settings_copy->listening_address.c_str(), settings_copy->listening_port.c_str());
329316
else
330-
{
331-
if (listen_address != "0.0.0.0" && listen_address != "::")
332-
_log.Log(LOG_STATUS, "Webserver(SSL) started on address: %s, port: %s", listen_address.c_str(), listenport.c_str());
333-
else
334-
_log.Log(LOG_STATUS, "Webserver(SSL) started on port: %s", listenport.c_str());
335-
}
317+
_log.Log(LOG_STATUS, "Webserver(%s) started on port: %s", m_server_alias.c_str(), settings_copy->listening_port.c_str());
336318

337319
m_pWebEm->SetDigistRealm("Domoticz.com");
338320
m_pWebEm->SetSessionStore(this);

main/WebServer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CWebServer : public session_store
3131
};
3232
CWebServer(void);
3333
~CWebServer(void);
34-
bool StartServer(const std::string &listenaddress, const std::string &listenport, const std::string &serverpath, const bool bIgnoreUsernamePassword, const std::string &secure_cert_file = "", const std::string &secure_cert_passphrase = "");
34+
bool StartServer(const server_settings & settings, const std::string &serverpath, const bool bIgnoreUsernamePassword);
3535
void StopServer();
3636
void RegisterCommandCode(const char* idname, webserver_response_function ResponseFunction, bool bypassAuthentication=false);
3737
void RegisterRType(const char* idname, webserver_response_function ResponseFunction);
@@ -307,7 +307,7 @@ class CWebServer : public session_store
307307
std::vector<_tCustomIcon> m_custom_light_icons;
308308
std::map<int, int> m_custom_light_icons_lookup;
309309
bool m_bDoStop;
310-
bool m_bIsSecure;
310+
std::string m_server_alias;
311311

312312
void luaThread(lua_State *lua_state, const std::string &filename);
313313
static void luaStop(lua_State *L, lua_Debug *ar);

main/WebServerHelper.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,26 @@ namespace http {
3535
#endif
3636
}
3737

38-
bool CWebServerHelper::StartServers(const std::string &listenaddress, const std::string &listenport, const std::string &secure_listenport, const std::string &serverpath, const std::string &secure_cert_file, const std::string &secure_cert_passphrase, const bool bIgnoreUsernamePassword, tcp::server::CTCPServer *sharedServer)
38+
bool CWebServerHelper::StartServers(const server_settings & web_settings, const ssl_server_settings & secure_web_settings, const std::string &serverpath, const bool bIgnoreUsernamePassword, tcp::server::CTCPServer *sharedServer)
3939
{
4040
bool bRet = false;
4141

4242
m_pDomServ = sharedServer;
4343

4444
#ifdef NS_ENABLE_SSL
4545
SSL_library_init();
46-
serverCollection.resize(secure_listenport.empty() ? 1 : 2);
46+
serverCollection.resize(secure_web_settings.listening_port.empty() ? 1 : 2);
4747
#else
4848
serverCollection.resize(1);
4949
#endif
5050
our_serverpath = serverpath;
5151
plainServer_ = new CWebServer();
5252
serverCollection[0] = plainServer_;
53-
bRet |= plainServer_->StartServer(listenaddress, listenport, serverpath, bIgnoreUsernamePassword);
53+
bRet |= plainServer_->StartServer(web_settings, serverpath, bIgnoreUsernamePassword);
5454
#ifdef NS_ENABLE_SSL
55-
if (!secure_listenport.empty()) {
55+
if (!secure_web_settings.listening_port.empty()) {
5656
secureServer_ = new CWebServer();
57-
bRet |= secureServer_->StartServer(listenaddress, secure_listenport, serverpath, bIgnoreUsernamePassword, secure_cert_file, secure_cert_passphrase);
57+
bRet |= secureServer_->StartServer(secure_web_settings, serverpath, bIgnoreUsernamePassword);
5858
serverCollection[1] = secureServer_;
5959
}
6060
#endif

main/WebServerHelper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace http {
1616
~CWebServerHelper();
1717

1818
// called from mainworker():
19-
bool StartServers(const std::string &listenaddress, const std::string &listenport, const std::string &secure_listenport, const std::string &serverpath, const std::string &secure_cert_file, const std::string &secure_cert_passphrase, const bool bIgnoreUsernamePassword, tcp::server::CTCPServer *sharedServer);
19+
bool StartServers(const server_settings & web_settings, const ssl_server_settings & secure_web_settings, const std::string &serverpath, const bool bIgnoreUsernamePassword, tcp::server::CTCPServer *sharedServer);
2020
void StopServers();
2121
#ifndef NOCLOUD
2222
void RestartProxy();

main/domoticz.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -585,15 +585,15 @@ int main(int argc, char**argv)
585585
sleep_seconds(DelaySeconds);
586586
}
587587

588+
http::server::server_settings webserver_settings;
588589
if (cmdLine.HasSwitch("-wwwbind"))
589590
{
590591
if (cmdLine.GetArgumentCount("-wwwbind") != 1)
591592
{
592593
_log.Log(LOG_ERROR, "Please specify an address");
593594
return 1;
594595
}
595-
std::string wwwbind = cmdLine.GetSafeArgument("-wwwbind", 0, "0.0.0.0");
596-
m_mainworker.SetWebserverAddress(wwwbind);
596+
webserver_settings.listening_address = cmdLine.GetSafeArgument("-wwwbind", 0, "0.0.0.0");
597597
}
598598

599599
if (cmdLine.HasSwitch("-www"))
@@ -606,9 +606,11 @@ int main(int argc, char**argv)
606606
std::string wwwport = cmdLine.GetSafeArgument("-www", 0, "8080");
607607
if (wwwport == "0")
608608
wwwport.clear();//HTTP server disabled
609-
m_mainworker.SetWebserverPort(wwwport);
609+
webserver_settings.listening_port = wwwport;
610610
}
611+
m_mainworker.SetWebserverSettings(webserver_settings);
611612
#ifdef NS_ENABLE_SSL
613+
http::server::ssl_server_settings secure_webserver_settings;
612614
if (cmdLine.HasSwitch("-sslwww"))
613615
{
614616
if (cmdLine.GetArgumentCount("-sslwww") != 1)
@@ -619,7 +621,7 @@ int main(int argc, char**argv)
619621
std::string wwwport = cmdLine.GetSafeArgument("-sslwww", 0, "443");
620622
if (wwwport == "0")
621623
wwwport.clear();//HTTPS server disabled
622-
m_mainworker.SetSecureWebserverPort(wwwport);
624+
secure_webserver_settings.listening_port = wwwport;
623625
}
624626
if (cmdLine.HasSwitch("-sslcert"))
625627
{
@@ -628,8 +630,7 @@ int main(int argc, char**argv)
628630
_log.Log(LOG_ERROR, "Please specify the file path");
629631
return 1;
630632
}
631-
std::string ca_cert = cmdLine.GetSafeArgument("-sslcert", 0, "./server_cert.pem");
632-
m_mainworker.SetSecureWebserverCert(ca_cert);
633+
secure_webserver_settings.cert_file_path = cmdLine.GetSafeArgument("-sslcert", 0, "./server_cert.pem");
633634
}
634635
if (cmdLine.HasSwitch("-sslpass"))
635636
{
@@ -638,9 +639,9 @@ int main(int argc, char**argv)
638639
_log.Log(LOG_ERROR, "Please specify a passphrase for your certificate file");
639640
return 1;
640641
}
641-
std::string ca_passphrase = cmdLine.GetSafeArgument("-sslpass", 0, "");
642-
m_mainworker.SetSecureWebserverPass(ca_passphrase);
642+
secure_webserver_settings.private_key_pass_phrase = cmdLine.GetSafeArgument("-sslpass", 0, "");
643643
}
644+
m_mainworker.SetSecureWebserverSettings(secure_webserver_settings);
644645
#endif
645646
if (cmdLine.HasSwitch("-nowwwpwd"))
646647
{

main/mainworker.cpp

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,24 @@ m_LastSunriseSet("")
145145

146146
m_bStartHardware=false;
147147
m_hardwareStartCounter=0;
148-
m_webserverport="8080";
149-
m_webserveraddress="::";
150-
m_secure_webserverport = "";
151-
m_secure_web_cert_file = "./server_cert.pem";
152-
m_secure_web_passphrase = "";
148+
149+
// Set default settings for web servers
150+
m_webserver_settings.listening_address = "::"; // listen to all network interfaces
151+
m_webserver_settings.listening_port = "8080";
152+
m_secure_webserver_settings.listening_address = "::"; // listen to all network interfaces
153+
m_secure_webserver_settings.listening_port = ""; // disabled
154+
m_secure_webserver_settings.ssl_method = "sslv23";
155+
m_secure_webserver_settings.certificate_chain_file_path = "./server_cert.pem";
156+
m_secure_webserver_settings.ca_cert_file_path = m_secure_webserver_settings.certificate_chain_file_path; // not used
157+
m_secure_webserver_settings.cert_file_path = m_secure_webserver_settings.certificate_chain_file_path;
158+
m_secure_webserver_settings.private_key_file_path = m_secure_webserver_settings.certificate_chain_file_path;
159+
m_secure_webserver_settings.private_key_pass_phrase = "";
160+
m_secure_webserver_settings.options = "default_workarounds,no_sslv2,single_dh_use";
161+
m_secure_webserver_settings.tmp_dh_file_path = m_secure_webserver_settings.certificate_chain_file_path;
162+
m_secure_webserver_settings.verify_peer = false;
163+
m_secure_webserver_settings.verify_fail_if_no_peer_cert = false;
164+
m_secure_webserver_settings.verify_file_path = "";
165+
153166
m_bIgnoreUsernamePassword=false;
154167

155168
time_t atime=mytime(NULL);
@@ -486,44 +499,29 @@ eVerboseLevel MainWorker::GetVerboseLevel()
486499
return m_verboselevel;
487500
}
488501

489-
void MainWorker::SetWebserverAddress(const std::string &Address)
490-
{
491-
m_webserveraddress = Address;
492-
}
493-
494-
void MainWorker::SetWebserverPort(const std::string &Port)
502+
void MainWorker::SetWebserverSettings(const server_settings & settings)
495503
{
496-
m_webserverport=Port;
504+
m_webserver_settings.set(settings);
497505
}
498506

499507
std::string MainWorker::GetWebserverAddress()
500508
{
501-
return m_webserveraddress;
509+
return m_webserver_settings.listening_address;
502510
}
503511

504512
std::string MainWorker::GetWebserverPort()
505513
{
506-
return m_webserverport;
507-
}
508-
509-
void MainWorker::SetSecureWebserverPort(const std::string &Port)
510-
{
511-
m_secure_webserverport = Port;
514+
return m_webserver_settings.listening_port;
512515
}
513516

514517
std::string MainWorker::GetSecureWebserverPort()
515518
{
516-
return m_secure_webserverport;
517-
}
518-
519-
void MainWorker::SetSecureWebserverCert(const std::string &CertFile)
520-
{
521-
m_secure_web_cert_file = CertFile;
519+
return m_secure_webserver_settings.listening_port;
522520
}
523521

524-
void MainWorker::SetSecureWebserverPass(const std::string &passphrase)
522+
void MainWorker::SetSecureWebserverSettings(const ssl_server_settings & ssl_settings)
525523
{
526-
m_secure_web_passphrase = passphrase;
524+
m_secure_webserver_settings.set(ssl_settings);
527525
}
528526

529527
bool MainWorker::RestartHardware(const std::string &idx)
@@ -954,10 +952,10 @@ bool MainWorker::Stop()
954952

955953
bool MainWorker::StartThread()
956954
{
957-
if (!m_webserverport.empty())
955+
if (!m_webserver_settings.listening_port.empty())
958956
{
959957
//Start WebServer
960-
if (!m_webservers.StartServers(m_webserveraddress, m_webserverport, m_secure_webserverport, szWWWFolder, m_secure_web_cert_file, m_secure_web_passphrase, m_bIgnoreUsernamePassword, &m_sharedserver))
958+
if (!m_webservers.StartServers(m_webserver_settings, m_secure_webserver_settings, szWWWFolder, m_bIgnoreUsernamePassword, &m_sharedserver))
961959
{
962960
#ifdef WIN32
963961
MessageBox(0,"Error starting webserver, check if ports are not in use!", MB_OK, MB_ICONERROR);

main/mainworker.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "DataPush.h"
1313
#include "HttpPush.h"
1414
#include "concurrent_queue.h"
15+
#include "../webserver/server_settings.hpp"
1516

1617
enum eVerboseLevel
1718
{
@@ -46,14 +47,11 @@ class MainWorker
4647

4748
void SetVerboseLevel(eVerboseLevel Level);
4849
eVerboseLevel GetVerboseLevel();
49-
void SetWebserverAddress(const std::string &Address);
50-
void SetWebserverPort(const std::string &Port);
50+
void SetWebserverSettings(const http::server::server_settings & settings);
5151
std::string GetWebserverAddress();
5252
std::string GetWebserverPort();
53-
void SetSecureWebserverPort(const std::string &Port);
53+
void SetSecureWebserverSettings(const http::server::ssl_server_settings & ssl_settings);
5454
std::string GetSecureWebserverPort();
55-
void SetSecureWebserverCert(const std::string &CertFile);
56-
void SetSecureWebserverPass(const std::string &passphrase);
5755

5856
void DecodeRXMessage(const CDomoticzHardwareBase *pHardware, const unsigned char *pRXCommand, const char *defaultName, const int BatteryLevel);
5957
void PushAndWaitRxMessage(const CDomoticzHardwareBase *pHardware, const unsigned char *pRXCommand, const char *defaultName, const int BatteryLevel);
@@ -169,11 +167,8 @@ class MainWorker
169167

170168
std::vector<CDomoticzHardwareBase*> m_hardwaredevices;
171169
eVerboseLevel m_verboselevel;
172-
std::string m_webserverport;
173-
std::string m_webserveraddress;
174-
std::string m_secure_webserverport;
175-
std::string m_secure_web_cert_file;
176-
std::string m_secure_web_passphrase;
170+
http::server::server_settings m_webserver_settings;
171+
http::server::ssl_server_settings m_secure_webserver_settings;
177172

178173
volatile bool m_stoprequested;
179174
boost::shared_ptr<boost::thread> m_thread;

0 commit comments

Comments
 (0)