]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#360,!305] Host header is included in all HA exchanges.
authorMarcin Siodelski <marcin@isc.org>
Tue, 16 Apr 2019 19:57:29 +0000 (21:57 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Mon, 29 Apr 2019 13:37:12 +0000 (15:37 +0200)
src/hooks/dhcp/high_availability/ha_service.cc
src/hooks/dhcp/high_availability/tests/ha_service_unittest.cc

index 470674eab025e8778811958aadb60977a42fc097..005cae4f06047ef3c6b9527f7363261e57276f64 100644 (file)
@@ -756,7 +756,8 @@ HAService::asyncSendLeaseUpdate(const QueryPtrType& query,
                           const ParkingLotHandlePtr& parking_lot) {
     // Create HTTP/1.1 request including our command.
     PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>
-        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11());
+        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11(),
+         HostHttpHeader(config->getUrl().getHostname()));
     request->setBodyAsJson(command);
     request->finalize();
 
@@ -917,7 +918,8 @@ HAService::asyncSendHeartbeat() {
 
     // Create HTTP/1.1 request including our command.
     PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>
-        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11());
+        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11(),
+         HostHttpHeader(partner_config->getUrl().getHostname()));
     request->setBodyAsJson(CommandCreator::createHeartbeat(server_type_));
     request->finalize();
 
@@ -1030,7 +1032,8 @@ HAService::asyncDisableDHCPService(HttpClient& http_client,
 
     // Create HTTP/1.1 request including our command.
     PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>
-        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11());
+        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11(),
+         HostHttpHeader(remote_config->getUrl().getHostname()));
 
     request->setBodyAsJson(CommandCreator::createDHCPDisable(max_period,
                                                              server_type_));
@@ -1098,7 +1101,8 @@ HAService::asyncEnableDHCPService(HttpClient& http_client,
 
     // Create HTTP/1.1 request including our command.
     PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>
-        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11());
+        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11(),
+         HostHttpHeader(remote_config->getUrl().getHostname()));
     request->setBodyAsJson(CommandCreator::createDHCPEnable(server_type_));
     request->finalize();
 
@@ -1225,7 +1229,8 @@ HAService::asyncSyncLeasesInternal(http::HttpClient& http_client,
 
     // Create HTTP/1.1 request including our command.
     PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>
-        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11());
+        (HttpRequest::Method::HTTP_POST, "/", HttpVersion::HTTP_11(),
+         HostHttpHeader(partner_config->getUrl().getHostname()));
     if (server_type_ == HAServerType::DHCPv4) {
         request->setBodyAsJson(CommandCreator::createLease4GetPage(
             boost::dynamic_pointer_cast<Lease4>(last_lease), config_->getSyncPageLimit()));
index cedc2164b672791f014cf62cc1a712232579a3b4..36f597d5059132dc802b705579e9dc00548e9a20 100644 (file)
@@ -336,6 +336,24 @@ private:
         // Remember the request received.
         requests_.push_back(request_json);
 
+        // The request must always contain non-empty Host header.
+        bool invalid_host = false;
+        try {
+            auto host_hdr = request_json->getHeader("Host");
+            if (host_hdr->getValue().empty()) {
+                invalid_host = true;
+            }
+
+        } catch (...) {
+            // Host header does not exist.
+            invalid_host = true;
+        }
+
+        // If invalid host then return Bad Request.
+        if (invalid_host) {
+            return (createStockHttpResponse(request, HttpStatusCode::BAD_REQUEST));
+        }
+
         int control_result = -1;
         ElementPtr arguments;