login: RemoveArcData() removes new directory location
Revised Chrome-side change will send cryptohome ID with
RemoveArcData D-Bus method call.
https://codereview.chromium.org/1966133002/
BUG=b:26700652
TEST=cros_run_unit_tests --board $BOARD --packages chromeos-login
Change-Id: Iae56f3773c8399c15607012fec4346cf37d50f6a
Reviewed-on: https://chromium-review.googlesource.com/352382
Commit-Ready: Shuhei Takahashi <nya@chromium.org>
Tested-by: Shuhei Takahashi <nya@chromium.org>
Reviewed-by: Shuhei Takahashi <nya@google.com>
diff --git a/login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml b/login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml
index f928ecd..c796f22 100644
--- a/login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml
+++ b/login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml
@@ -446,11 +446,14 @@
</method>
<!--
RemoveArcData:
+ @email_address: Human-readable ID of the user whose ARC data is
+ removed.
Removes ARC data from the user's profile. This does not remove ARC
system data such as root images.
-->
<method name="RemoveArcData">
+ <arg type="s" name="email_address" direction="in" />
</method>
</interface>
<!-- ********************************************************************* -->
diff --git a/login_manager/session_manager_dbus_adaptor.cc b/login_manager/session_manager_dbus_adaptor.cc
index c518c54..20fd3cc 100644
--- a/login_manager/session_manager_dbus_adaptor.cc
+++ b/login_manager/session_manager_dbus_adaptor.cc
@@ -641,8 +641,13 @@
scoped_ptr<dbus::Response> SessionManagerDBusAdaptor::RemoveArcData(
dbus::MethodCall* call) {
+ dbus::MessageReader reader(call);
+ std::string user_id;
+ if (!reader.PopString(&user_id))
+ return CreateInvalidArgsError(call, call->GetSignature());
+
SessionManagerImpl::Error error;
- impl_->RemoveArcData(&error);
+ impl_->RemoveArcData(user_id, &error);
if (error.is_set())
return CreateError(call, error.name(), error.message());
diff --git a/login_manager/session_manager_impl.cc b/login_manager/session_manager_impl.cc
index a742698..f9fdf1b 100644
--- a/login_manager/session_manager_impl.cc
+++ b/login_manager/session_manager_impl.cc
@@ -70,13 +70,6 @@
const base::FilePath::CharType SessionManagerImpl::kAndroidDataDirName[] =
FILE_PATH_LITERAL("android-data");
-// TODO(dspaid): Migrate to using /home/root/$hash once it is supported
-// see http://b/26700652
-const base::FilePath::CharType SessionManagerImpl::kArcDataDir[] =
- FILE_PATH_LITERAL("/home/chronos/user/android-data/data");
-const base::FilePath::CharType SessionManagerImpl::kArcCacheDir[] =
- FILE_PATH_LITERAL("/home/chronos/user/android-data/cache");
-
namespace {
// Constants used in email validation.
@@ -110,6 +103,13 @@
(lower_case_id == SessionManagerImpl::kDemoUser);
}
+#if USE_ARC
+base::FilePath GetAndroidDataDirForUser(const std::string& normalized_user_id) {
+ return GetRootPath(normalized_user_id).Append(
+ SessionManagerImpl::kAndroidDataDirName);
+}
+#endif // USE_ARC
+
} // namespace
SessionManagerImpl::Error::Error() : set_(false) {}
@@ -608,8 +608,8 @@
return;
}
- const base::FilePath& android_data_dir =
- GetRootPath(actual_user_id).Append(kAndroidDataDirName);
+ const base::FilePath android_data_dir =
+ GetAndroidDataDirForUser(actual_user_id);
const std::vector<std::string>& keyvals = {
base::StringPrintf("ANDROID_DATA_DIR=%s",
android_data_dir.value().c_str()),
@@ -686,14 +686,21 @@
error->Set(dbus_error::kContainerShutdownFail, msg);
}
-void SessionManagerImpl::RemoveArcData(Error* error) {
+void SessionManagerImpl::RemoveArcData(const std::string& user_id,
+ Error* error) {
#if USE_ARC
if (!arc_start_time_.is_null()) {
error->Set(dbus_error::kArcInstanceRunning, "ARC is currently running.");
return;
}
- system_->RemoveDirTree(base::FilePath(SessionManagerImpl::kArcDataDir));
- system_->RemoveDirTree(base::FilePath(SessionManagerImpl::kArcCacheDir));
+
+ std::string actual_user_id;
+ if (!NormalizeUserId(user_id, &actual_user_id, error)) {
+ return;
+ }
+ const base::FilePath android_data_dir =
+ GetAndroidDataDirForUser(actual_user_id);
+ system_->RemoveDirTree(android_data_dir);
#else
error->Set(dbus_error::kNotAvailable, "ARC not supported.");
#endif // USE_ARC
diff --git a/login_manager/session_manager_impl.h b/login_manager/session_manager_impl.h
index 07aa55e..0251dd2 100644
--- a/login_manager/session_manager_impl.h
+++ b/login_manager/session_manager_impl.h
@@ -67,10 +67,6 @@
// Name of android-data directory.
static const base::FilePath::CharType kAndroidDataDirName[];
- // ARC data directories to be deleted on opt-out.
- static const base::FilePath::CharType kArcDataDir[];
- static const base::FilePath::CharType kArcCacheDir[];
-
// Name of the Android container.
static const char kArcContainerName[];
@@ -197,7 +193,7 @@
void StartArcInstance(const std::string& user_id, Error* error);
void StopArcInstance(Error* error);
base::TimeTicks GetArcStartTime(Error* error);
- void RemoveArcData(Error* error);
+ void RemoveArcData(const std::string& user_id, Error* error);
// PolicyService::Delegate implementation:
void OnPolicyPersisted(bool success) override;
diff --git a/login_manager/session_manager_impl_unittest.cc b/login_manager/session_manager_impl_unittest.cc
index 7f44b67..8f54fba 100644
--- a/login_manager/session_manager_impl_unittest.cc
+++ b/login_manager/session_manager_impl_unittest.cc
@@ -67,6 +67,7 @@
using ::testing::StrEq;
using ::testing::_;
+using brillo::cryptohome::home::GetRootPath;
using brillo::cryptohome::home::SanitizeUserName;
using brillo::cryptohome::home::SetSystemSalt;
using brillo::cryptohome::home::kGuestUserName;
@@ -904,17 +905,13 @@
}
TEST_F(SessionManagerImplTest, ArcRemoveData) {
- base::FilePath arc_data_dir(SessionManagerImpl::kArcDataDir);
- base::FilePath arc_cache_dir(SessionManagerImpl::kArcCacheDir);
- EXPECT_TRUE(utils_.AtomicFileWrite(arc_data_dir.Append("foo"), "test"));
- EXPECT_TRUE(utils_.AtomicFileWrite(arc_cache_dir.Append("bar").Append("baz"),
- "test"));
- EXPECT_TRUE(utils_.Exists(arc_data_dir));
- EXPECT_TRUE(utils_.Exists(arc_cache_dir));
- impl_.RemoveArcData(&error_);
+ base::FilePath android_data_dir(
+ GetRootPath(kSaneEmail).Append(SessionManagerImpl::kAndroidDataDirName));
+ EXPECT_TRUE(utils_.AtomicFileWrite(android_data_dir.Append("foo"), "test"));
+ EXPECT_TRUE(utils_.Exists(android_data_dir));
+ impl_.RemoveArcData(kSaneEmail, &error_);
#if USE_ARC
- EXPECT_FALSE(utils_.Exists(arc_data_dir));
- EXPECT_FALSE(utils_.Exists(arc_cache_dir));
+ EXPECT_FALSE(utils_.Exists(android_data_dir));
#else
EXPECT_EQ(dbus_error::kNotAvailable, error_.name());
#endif
@@ -923,18 +920,14 @@
TEST_F(SessionManagerImplTest, ArcRemoveData_ArcRunning) {
#if USE_ARC
ExpectAndRunStartSession(kSaneEmail);
- base::FilePath arc_data_dir(SessionManagerImpl::kArcDataDir);
- base::FilePath arc_cache_dir(SessionManagerImpl::kArcCacheDir);
- EXPECT_TRUE(utils_.AtomicFileWrite(arc_data_dir.Append("foo"), "test"));
- EXPECT_TRUE(utils_.AtomicFileWrite(arc_cache_dir.Append("bar").Append("baz"),
- "test"));
- EXPECT_TRUE(utils_.Exists(arc_data_dir));
- EXPECT_TRUE(utils_.Exists(arc_cache_dir));
+ base::FilePath android_data_dir(
+ GetRootPath(kSaneEmail).Append(SessionManagerImpl::kAndroidDataDirName));
+ EXPECT_TRUE(utils_.AtomicFileWrite(android_data_dir.Append("foo"), "test"));
+ EXPECT_TRUE(utils_.Exists(android_data_dir));
impl_.StartArcInstance(kSaneEmail, &error_);
- impl_.RemoveArcData(&error_);
+ impl_.RemoveArcData(kSaneEmail, &error_);
EXPECT_EQ(dbus_error::kArcInstanceRunning, error_.name());
- EXPECT_TRUE(utils_.Exists(arc_data_dir));
- EXPECT_TRUE(utils_.Exists(arc_cache_dir));
+ EXPECT_TRUE(utils_.Exists(android_data_dir));
#endif
}