apmanager: store config files under /var/run/apmanager

This prevents non-root/apmanager users from modifying the files generated
by apmanager.

Also add a wrapper class for base::WriteFile to prevent any file writes
during unittest.

BUG=chromium:446679
TEST=USE="asan clang" FEATURES=test emerge-$BOARD apmanager
     Start an AP service using apmanager, verify hostapd and dhcp server
     config files are store in "/var/run/apmanager/hostapd" and
     "/var/run/apmanager/dnsmasq" respectively.

Change-Id: I2bf2d34a8c95c9493f2cf5d5eb4895fefcdae8dc
Reviewed-on: https://chromium-review.googlesource.com/239632
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Zeping Qiu <zqiu@chromium.org>
Trybot-Ready: Zeping Qiu <zqiu@chromium.org>
Tested-by: Zeping Qiu <zqiu@chromium.org>
diff --git a/service.cc b/service.cc
index f00a21e..5caa449 100644
--- a/service.cc
+++ b/service.cc
@@ -6,7 +6,6 @@
 
 #include <signal.h>
 
-#include <base/files/file_util.h>
 #include <base/strings/stringprintf.h>
 #include <chromeos/dbus/service_constants.h>
 #include <chromeos/errors/error.h>
@@ -22,7 +21,8 @@
 
 // static.
 const char Service::kHostapdPath[] = "/usr/sbin/hostapd";
-const char Service::kHostapdConfigPathFormat[] = "/tmp/hostapd-%d";
+const char Service::kHostapdConfigPathFormat[] =
+    "/var/run/apmanager/hostapd/hostapd-%d.conf";
 const int Service::kTerminationTimeoutSeconds = 2;
 
 Service::Service(Manager* manager, int service_identifier)
@@ -35,7 +35,8 @@
                              service_identifier)),
       dbus_path_(dbus::ObjectPath(service_path_)),
       config_(new Config(manager, service_path_)),
-      dhcp_server_factory_(DHCPServerFactory::GetInstance()) {
+      dhcp_server_factory_(DHCPServerFactory::GetInstance()),
+      file_writer_(FileWriter::GetInstance()) {
   SetConfig(config_->dbus_path());
   // TODO(zqiu): come up with better server address management. This is good
   // enough for now.
@@ -84,9 +85,9 @@
   }
 
   // Write configuration to a file.
-  base::FilePath file_path(base::StringPrintf(kHostapdConfigPathFormat,
-                                              service_identifier_));
-  if (base::WriteFile(file_path, config_str.c_str(), config_str.size()) == -1) {
+  string config_file_name = base::StringPrintf(kHostapdConfigPathFormat,
+                                               service_identifier_);
+  if (!file_writer_->Write(config_file_name, config_str)) {
     chromeos::Error::AddTo(
         error, FROM_HERE, chromeos::errors::dbus::kDomain, kServiceError,
         "Failed to write configuration to a file");
@@ -102,7 +103,7 @@
   }
 
   // Start hostapd process.
-  if (!StartHostapdProcess(file_path.value())) {
+  if (!StartHostapdProcess(config_file_name)) {
     chromeos::Error::AddTo(
         error, FROM_HERE, chromeos::errors::dbus::kDomain, kServiceError,
         "Failed to start hostapd");