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
 }