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");