Commit 5767ad9c authored by Bruno Kim Medeiros Cesar's avatar Bruno Kim Medeiros Cesar Committed by Commit Bot

Clear ARC data on regular->child transitions.

We will attempt to cherry-pick this change into M68, to finish support
of USM accounts in such release. Without this, accounts that transition
from regular to child will not be supervised if they already have an
initialized ARC container.

Bug: 836246
Change-Id: Ie4711f62614fa7b965f0b8fa1a33f69dc87b03ce
Reviewed-on: https://chromium-review.googlesource.com/1083471
Commit-Queue: Bruno Kim Medeiros Cesar <brunokim@chromium.org>
Reviewed-by: default avatarYury Khmel <khmel@chromium.org>
Reviewed-by: default avatarYusuke Sato <yusukes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#564998}
parent 576cf9e3
......@@ -40,9 +40,11 @@
#include "chromeos/dbus/session_manager_client.h"
#include "components/account_id/account_id.h"
#include "components/arc/arc_data_remover.h"
#include "components/arc/arc_features.h"
#include "components/arc/arc_instance_mode.h"
#include "components/arc/arc_prefs.h"
#include "components/arc/arc_session_runner.h"
#include "components/arc/arc_supervision_transition.h"
#include "components/arc/arc_util.h"
#include "components/arc/metrics/arc_metrics_service.h"
#include "components/prefs/pref_service.h"
......@@ -441,6 +443,18 @@ void ArcSessionManager::Initialize() {
if (g_enable_check_android_management_in_tests.value_or(g_ui_enabled))
ArcAndroidManagementChecker::StartClient();
// Request removing data if enabled for a regular->child transition.
if (GetSupervisionTransition(profile_) ==
ArcSupervisionTransition::REGULAR_TO_CHILD &&
base::FeatureList::IsEnabled(
kCleanArcDataOnRegularToChildTransitionFeature)) {
LOG(WARNING) << "User transited from regular to child, deleting ARC data";
data_remover_->Schedule();
profile_->GetPrefs()->SetInteger(
prefs::kArcSupervisionTransition,
static_cast<int>(ArcSupervisionTransition::NO_TRANSITION));
}
// Chrome may be shut down before completing ARC data removal.
// For such a case, start removing the data now, if necessary.
MaybeStartArcDataRemoval();
......
......@@ -17,6 +17,7 @@
#include "base/observer_list.h"
#include "base/run_loop.h"
#include "base/test/scoped_command_line.h"
#include "base/test/scoped_feature_list.h"
#include "base/values.h"
#include "chrome/browser/chromeos/arc/arc_optin_uma.h"
#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
......@@ -42,6 +43,7 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_session_manager_client.h"
#include "components/account_id/account_id.h"
#include "components/arc/arc_features.h"
#include "components/arc/arc_prefs.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/arc_session_runner.h"
......@@ -576,6 +578,50 @@ TEST_F(ArcSessionManagerTest, RemoveDataDir_Restart) {
arc_session_manager()->Shutdown();
}
TEST_F(ArcSessionManagerTest, RegularToChildTransition_Default) {
// Emulate the situation where a regular user has transitioned to a child
// account.
profile()->GetPrefs()->SetInteger(
prefs::kArcSupervisionTransition,
static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD));
arc_session_manager()->SetProfile(profile());
arc_session_manager()->Initialize();
EXPECT_TRUE(
profile()->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested));
EXPECT_EQ(
static_cast<int>(ArcSupervisionTransition::NO_TRANSITION),
profile()->GetPrefs()->GetInteger(prefs::kArcSupervisionTransition));
EXPECT_EQ(ArcSessionManager::State::REMOVING_DATA_DIR,
arc_session_manager()->state());
arc_session_manager()->Shutdown();
}
TEST_F(ArcSessionManagerTest, RegularToChildTransition_FlagOff) {
// Emulate the situation where a regular user has transitioned to a child
// account, but the feature flag is disabled.
profile()->GetPrefs()->SetInteger(
prefs::kArcSupervisionTransition,
static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD));
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
kCleanArcDataOnRegularToChildTransitionFeature);
arc_session_manager()->SetProfile(profile());
arc_session_manager()->Initialize();
arc_session_manager()->RequestEnable();
EXPECT_FALSE(
profile()->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested));
EXPECT_EQ(
static_cast<int>(ArcSupervisionTransition::REGULAR_TO_CHILD),
profile()->GetPrefs()->GetInteger(prefs::kArcSupervisionTransition));
base::RunLoop().RunUntilIdle();
EXPECT_EQ(ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
arc_session_manager()->state());
arc_session_manager()->Shutdown();
}
TEST_F(ArcSessionManagerTest, IgnoreSecondErrorReporting) {
arc_session_manager()->SetProfile(profile());
arc_session_manager()->Initialize();
......
......@@ -30,6 +30,7 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profiles_state.h"
#include "chromeos/chromeos_switches.h"
#include "components/arc/arc_features.h"
#include "components/arc/arc_prefs.h"
#include "components/arc/arc_util.h"
#include "components/prefs/pref_service.h"
......@@ -608,4 +609,32 @@ ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile(
return ash::mojom::AssistantAllowedState::ALLOWED;
}
ArcSupervisionTransition GetSupervisionTransition(const Profile* profile) {
DCHECK(profile);
DCHECK(profile->GetPrefs());
const ArcSupervisionTransition supervision_transition =
static_cast<ArcSupervisionTransition>(
profile->GetPrefs()->GetInteger(prefs::kArcSupervisionTransition));
const bool is_child_to_regular_enabled =
base::FeatureList::IsEnabled(kEnableChildToRegularTransitionFeature);
const bool is_regular_to_child_enabled =
base::FeatureList::IsEnabled(kEnableRegularToChildTransitionFeature);
switch (supervision_transition) {
case ArcSupervisionTransition::NO_TRANSITION:
// Do nothing.
break;
case ArcSupervisionTransition::CHILD_TO_REGULAR:
if (!is_child_to_regular_enabled)
return ArcSupervisionTransition::NO_TRANSITION;
break;
case ArcSupervisionTransition::REGULAR_TO_CHILD:
if (!is_regular_to_child_enabled)
return ArcSupervisionTransition::NO_TRANSITION;
break;
}
return supervision_transition;
}
} // namespace arc
......@@ -9,6 +9,7 @@
#include "ash/public/interfaces/voice_interaction_controller.mojom.h"
#include "base/callback_forward.h"
#include "components/arc/arc_supervision_transition.h"
// Most utility should be put in components/arc/arc_util.{h,cc}, rather than
// here. However, some utility implementation requires other modules defined in
......@@ -153,6 +154,9 @@ void UpdateArcFileSystemCompatibilityPrefIfNeeded(
ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile(
const Profile* profile);
// Returns the supervision transition status as stored in profile prefs.
ArcSupervisionTransition GetSupervisionTransition(const Profile* profile);
} // namespace arc
#endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_UTIL_H_
......@@ -16,6 +16,19 @@ const base::Feature kBootCompletedBroadcastFeature {
"ArcBootCompletedBroadcast", base::FEATURE_ENABLED_BY_DEFAULT
};
// Controls whether we should delete all ARC data before transitioning a user
// from regular to child account.
const base::Feature kCleanArcDataOnRegularToChildTransitionFeature{
"ArcCleanDataOnRegularToChildTransition", base::FEATURE_ENABLED_BY_DEFAULT};
// Controls whether ARC handles child->regular account transition.
const base::Feature kEnableChildToRegularTransitionFeature{
"ArcEnableChildToRegularTransition", base::FEATURE_ENABLED_BY_DEFAULT};
// Controls whether ARC handles regular->child account transition.
const base::Feature kEnableRegularToChildTransitionFeature{
"ArcEnableRegularToChildTransition", base::FEATURE_ENABLED_BY_DEFAULT};
// Controls experimental native bridge feature for ARC.
const base::Feature kNativeBridgeExperimentFeature {
"ArcNativeBridgeExperiment", base::FEATURE_ENABLED_BY_DEFAULT
......
......@@ -14,6 +14,9 @@ namespace arc {
// Please keep alphabetized.
extern const base::Feature kAvailableForChildAccountFeature;
extern const base::Feature kBootCompletedBroadcastFeature;
extern const base::Feature kCleanArcDataOnRegularToChildTransitionFeature;
extern const base::Feature kEnableChildToRegularTransitionFeature;
extern const base::Feature kEnableRegularToChildTransitionFeature;
extern const base::Feature kNativeBridgeExperimentFeature;
extern const base::Feature kUsbHostFeature;
extern const base::Feature kVpnFeature;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment