Use binder firewalld interface in binder mode

Test: Binder mode can successfully punch holes in the firewall
Bug: 27204884
Change-Id: I35852941afbd6091e396938eed03cc7ac3b2cea9
diff --git a/Android.mk b/Android.mk
index 971603d..25b5310 100644
--- a/Android.mk
+++ b/Android.mk
@@ -50,14 +50,12 @@
       libchrome \
       libmicrohttpd
 
-  # TODO(wiley) Uncomment these guards once firewalld moves to binder
-  #             b/25932807
-  # ifeq ($(system_webservd_use_dbus),true)
+  ifeq ($(system_webservd_use_dbus),true)
     LOCAL_SHARED_LIBRARIES += \
         libbrillo-dbus \
         libchrome-dbus \
         libdbus
-  # endif
+  endif
   ifeq ($(system_webservd_use_binder),true)
     LOCAL_SHARED_LIBRARIES += \
         libbrillo-binder \
diff --git a/webservd/Android.mk b/webservd/Android.mk
index 2224f0d..76240ec 100644
--- a/webservd/Android.mk
+++ b/webservd/Android.mk
@@ -25,12 +25,12 @@
 LOCAL_MODULE := webservd
 LOCAL_SHARED_LIBRARIES := \
     libcrypto \
-    libfirewalld-client \
     libwebserv
 
 ifeq ($(system_webservd_use_dbus),true)
 LOCAL_SHARED_LIBRARIES += \
-    libwebserv-proxies-internal
+    libwebserv-proxies-internal \
+    libfirewalld-client
 endif
 
 ifdef BRILLO
@@ -44,7 +44,6 @@
 LOCAL_SRC_FILES := \
     config.cc \
     error_codes.cc \
-    firewalld_firewall.cc \
     log_manager.cc \
     main.cc \
     protocol_handler.cc \
@@ -60,6 +59,8 @@
     ../aidl/android/webservd/IHttpRequest.aidl \
     binder_request.cc \
     binder_server.cc
+LOCAL_SHARED_LIBRARIES += \
+    libfirewalld-binder-client
 endif
 
 ifeq ($(system_webservd_use_dbus),true)
@@ -69,6 +70,7 @@
     dbus_bindings/org.chromium.WebServer.Server.dbus-xml \
     dbus_protocol_handler.cc \
     dbus_request_handler.cc \
+    firewalld_firewall.cc \
     server.cc
 endif
 
diff --git a/webservd/binder_server.cc b/webservd/binder_server.cc
index 98ea010..290c5ce 100644
--- a/webservd/binder_server.cc
+++ b/webservd/binder_server.cc
@@ -18,6 +18,8 @@
 #include <brillo/http/http_request.h>
 #include <brillo/mime_utils.h>
 
+#include <firewalld/firewall.h>
+
 #include <openssl/evp.h>
 #include <openssl/x509.h>
 
@@ -222,18 +224,32 @@
   }
 }
 
-BinderServer::BinderServer(const Config& config)
+BinderServer::BinderServer(const Config& config,
+                           android::BinderWrapper* binder_wrapper)
     : config_(config),
       default_encryptor_{Encryptor::CreateDefaultEncryptor()},
       encryptor_(default_encryptor_.get()) {
   InitTlsData();
 
+  unique_ptr<firewalld::Firewall> firewall =
+      firewalld::Firewall::Connect(binder_wrapper);
+
+  if (!firewall) {
+    LOG(ERROR) << "Could not connect to firewall.";
+  }
+
   for (const auto& handler_config : config_.protocol_handlers) {
     sp<BinderProtocolHandler> handler_ptr{
         new BinderProtocolHandler(handler_config.name, this)};
 
     if (handler_ptr->Start(handler_config)) {
       protocol_handlers_.push_back(handler_ptr);
+      if (firewall &&
+          !firewall->PunchTcpHole(handler_config.port,
+                                  handler_config.interface_name)) {
+          LOG(ERROR) << "Could not open port " << handler_config.port
+                     << " for protocol handler.";
+      }
     }
   }
 }
diff --git a/webservd/binder_server.h b/webservd/binder_server.h
index da3229d..d2e6654 100644
--- a/webservd/binder_server.h
+++ b/webservd/binder_server.h
@@ -26,12 +26,15 @@
 #include "android/webservd/BnServer.h"
 #include "android/webservd/IProtocolHandler.h"
 
+#include <binderwrapper/binder_wrapper.h>
+
 namespace webservd {
 
 class BinderServer : public android::webservd::BnServer,
                      public webservd::ServerInterface {
  public:
-  explicit BinderServer(const Config& config);
+  explicit BinderServer(const Config& config,
+                        android::BinderWrapper* binder_wrapper);
 
   // Overrides from BnServer
   android::binder::Status Ping(std::string* result) override;
diff --git a/webservd/main.cc b/webservd/main.cc
index b4691d4..8782e15 100644
--- a/webservd/main.cc
+++ b/webservd/main.cc
@@ -50,16 +50,19 @@
 #endif  // WEBSERV_USE_BINDER
 
 #if defined(__ANDROID__)
+#ifdef WEBSERV_USE_BINDER
+#include <firewalld/firewall.h>
+#else
 #include "webservd/firewalld_firewall.h"
 using FirewallImpl = webservd::FirewalldFirewall;
+#endif
 #else
 #include "webservd/permission_broker_firewall.h"
 using FirewallImpl = webservd::PermissionBrokerFirewall;
 #endif  // defined(__ANDROID__)
 
-using brillo::dbus_utils::AsyncEventSequencer;
-
 #ifdef WEBSERV_USE_DBUS
+using brillo::dbus_utils::AsyncEventSequencer;
 using BaseDaemon = brillo::DBusServiceDaemon;
 #else
 using BaseDaemon = brillo::Daemon;
@@ -121,7 +124,8 @@
         return EX_OSERR;
     }
 
-    server_.reset(new webservd::BinderServer(config_));
+    server_.reset(new webservd::BinderServer(config_,
+                  android::BinderWrapper::Get()));
 
     if (!android::BinderWrapper::Get()->RegisterService(
             webservd::kWebserverBinderServiceName,