Commit 26a6b0bb authored by Toni Barzic's avatar Toni Barzic Committed by Commit Bot

Remove demo mode resources when a user logs in on a managed device

Device getting enterprise enrolled, and then used should be a good
signal that demo mode resources are no longer needed.

An exception is made for demo mode implemented through public sessions
(as it's the case today) - in that case retailer might attempt to swich
to the revamped demo mode sessions, so might need the resources after
all.

BUG=827368

Change-Id: Ia5645b059050f9d7858ba34acd84201969b88b71
Reviewed-on: https://chromium-review.googlesource.com/1176652
Commit-Queue: Toni Baržić <tbarzic@chromium.org>
Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584222}
parent fe045298
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/chromeos/login/demo_mode/demo_mode_resources_remover.h" #include "chrome/browser/chromeos/login/demo_mode/demo_mode_resources_remover.h"
#include <memory>
#include <utility> #include <utility>
#include "base/files/file_path.h" #include "base/files/file_path.h"
...@@ -13,10 +14,19 @@ ...@@ -13,10 +14,19 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dbus_thread_manager.h"
#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_type.h"
#include "third_party/re2/src/re2/re2.h"
namespace chromeos { namespace chromeos {
...@@ -28,6 +38,14 @@ DemoModeResourcesRemover* g_instance = nullptr; ...@@ -28,6 +38,14 @@ DemoModeResourcesRemover* g_instance = nullptr;
// have been removed from the device. // have been removed from the device.
constexpr char kDemoModeResourcesRemoved[] = "demo_mode_resources_removed"; constexpr char kDemoModeResourcesRemoved[] = "demo_mode_resources_removed";
// Regex matching legacy demo retail mode domains.
constexpr char kLegacyDemoRetailModeDomainRegex[] =
"[[:alpha:]]{2}-retailmode.com";
// An extra legacy demo retail mode domain that does not match
// |kLegacyDemoRetailModeDomainRegex|.
constexpr char kExtraLegacyDemoRetailModeDomain[] = "us2-retailmode.com";
// Deletes directory at |path| from the device. // Deletes directory at |path| from the device.
DemoModeResourcesRemover::RemovalResult RemoveDirectory( DemoModeResourcesRemover::RemovalResult RemoveDirectory(
const base::FilePath& path) { const base::FilePath& path) {
...@@ -40,6 +58,22 @@ DemoModeResourcesRemover::RemovalResult RemoveDirectory( ...@@ -40,6 +58,22 @@ DemoModeResourcesRemover::RemovalResult RemoveDirectory(
return DemoModeResourcesRemover::RemovalResult::kSuccess; return DemoModeResourcesRemover::RemovalResult::kSuccess;
} }
// Tests whether the session with user |user| is part of legacy demo mode -
// a public session in a legacy demo retail mode domain.
// Note that DemoSession::IsDeviceInDemoMode will return false for these
// sessions.
bool IsLegacyDemoRetailModeSession(const user_manager::User* user) {
if (user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT)
return false;
const std::string enrollment_domain =
g_browser_process->platform_part()
->browser_policy_connector_chromeos()
->GetEnterpriseEnrollmentDomain();
return DemoModeResourcesRemover::IsLegacyDemoRetailModeDomain(
enrollment_domain);
}
} // namespace } // namespace
// static // static
...@@ -64,15 +98,46 @@ DemoModeResourcesRemover* DemoModeResourcesRemover::Get() { ...@@ -64,15 +98,46 @@ DemoModeResourcesRemover* DemoModeResourcesRemover::Get() {
return g_instance; return g_instance;
} }
// static
bool DemoModeResourcesRemover::IsLegacyDemoRetailModeDomain(
const std::string& domain) {
return RE2::FullMatch(domain, kLegacyDemoRetailModeDomainRegex) ||
domain == kExtraLegacyDemoRetailModeDomain;
}
DemoModeResourcesRemover::~DemoModeResourcesRemover() { DemoModeResourcesRemover::~DemoModeResourcesRemover() {
CHECK_EQ(g_instance, this); CHECK_EQ(g_instance, this);
g_instance = nullptr; g_instance = nullptr;
ChromeUserManager::Get()->RemoveSessionStateObserver(this);
} }
void DemoModeResourcesRemover::LowDiskSpace(uint64_t free_disk_space) { void DemoModeResourcesRemover::LowDiskSpace(uint64_t free_disk_space) {
AttemptRemoval(RemovalReason::kLowDiskSpace, RemovalCallback()); AttemptRemoval(RemovalReason::kLowDiskSpace, RemovalCallback());
} }
void DemoModeResourcesRemover::ActiveUserChanged(
const user_manager::User* user) {
// Ignore user activity in guest sessions.
if (user->GetType() == user_manager::USER_TYPE_GUEST)
return;
// Do not remove resources if the device is in a legacy derelict demo session,
// which is implemented as kiosk - note that this is different than sessions
// detected by IsLegacyDemoRetailModeSession().
if (DemoAppLauncher::IsDemoAppSession(user->GetAccountId()))
return;
// Attempt resources removal if the device is managed, and not in a retail
// mode domain.
if (g_browser_process->platform_part()
->browser_policy_connector_chromeos()
->IsEnterpriseManaged() &&
!IsLegacyDemoRetailModeSession(user)) {
AttemptRemoval(RemovalReason::kEnterpriseEnrolled, RemovalCallback());
}
}
void DemoModeResourcesRemover::AttemptRemoval(RemovalReason reason, void DemoModeResourcesRemover::AttemptRemoval(RemovalReason reason,
RemovalCallback callback) { RemovalCallback callback) {
if (local_state_->GetBoolean(kDemoModeResourcesRemoved)) { if (local_state_->GetBoolean(kDemoModeResourcesRemoved)) {
...@@ -115,6 +180,7 @@ DemoModeResourcesRemover::DemoModeResourcesRemover(PrefService* local_state) ...@@ -115,6 +180,7 @@ DemoModeResourcesRemover::DemoModeResourcesRemover(PrefService* local_state)
g_instance = this; g_instance = this;
cryptohome_observer_.Add(DBusThreadManager::Get()->GetCryptohomeClient()); cryptohome_observer_.Add(DBusThreadManager::Get()->GetCryptohomeClient());
ChromeUserManager::Get()->AddSessionStateObserver(this);
} }
void DemoModeResourcesRemover::OnRemovalDone(RemovalResult result) { void DemoModeResourcesRemover::OnRemovalDone(RemovalResult result) {
...@@ -124,6 +190,7 @@ void DemoModeResourcesRemover::OnRemovalDone(RemovalResult result) { ...@@ -124,6 +190,7 @@ void DemoModeResourcesRemover::OnRemovalDone(RemovalResult result) {
if (result == RemovalResult::kNotFound || result == RemovalResult::kSuccess) { if (result == RemovalResult::kNotFound || result == RemovalResult::kSuccess) {
local_state_->SetBoolean(kDemoModeResourcesRemoved, true); local_state_->SetBoolean(kDemoModeResourcesRemoved, true);
cryptohome_observer_.RemoveAll(); cryptohome_observer_.RemoveAll();
ChromeUserManager::Get()->RemoveSessionStateObserver(this);
} }
UMA_HISTOGRAM_ENUMERATION("DemoMode.ResourcesRemoval.Result", result); UMA_HISTOGRAM_ENUMERATION("DemoMode.ResourcesRemoval.Result", result);
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_MODE_RESOURCES_REMOVER_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_MODE_RESOURCES_REMOVER_H_
#include <memory> #include <memory>
#include <string>
#include <vector> #include <vector>
#include "base/callback_forward.h" #include "base/callback_forward.h"
...@@ -13,6 +14,7 @@ ...@@ -13,6 +14,7 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "chromeos/dbus/cryptohome_client.h" #include "chromeos/dbus/cryptohome_client.h"
#include "components/user_manager/user_manager.h"
class PrefRegistrySimple; class PrefRegistrySimple;
class PrefService; class PrefService;
...@@ -28,10 +30,12 @@ namespace chromeos { ...@@ -28,10 +30,12 @@ namespace chromeos {
// Demo mode resources are deleted if the device is not in demo mode, and any // Demo mode resources are deleted if the device is not in demo mode, and any
// of the following conditions are satisfied: // of the following conditions are satisfied:
// * device is running low on disk space // * device is running low on disk space
// * TODO(crbug.com/827368): device is enrolled in a non-demo-mode domain // * device is enrolled in a non-demo-mode domain
// * TODO(crbug.com/827368): enough non-demo-mode user activity has been // * TODO(crbug.com/827368): enough non-demo-mode user activity has been
// detected on the device // detected on the device
class DemoModeResourcesRemover : public CryptohomeClient::Observer { class DemoModeResourcesRemover
: public CryptohomeClient::Observer,
public user_manager::UserManager::UserSessionStateObserver {
public: public:
// The reason a removal was requested. // The reason a removal was requested.
// DO NOT REORDER - used to report metrics. // DO NOT REORDER - used to report metrics.
...@@ -85,11 +89,21 @@ class DemoModeResourcesRemover : public CryptohomeClient::Observer { ...@@ -85,11 +89,21 @@ class DemoModeResourcesRemover : public CryptohomeClient::Observer {
static std::unique_ptr<DemoModeResourcesRemover> CreateIfNeeded( static std::unique_ptr<DemoModeResourcesRemover> CreateIfNeeded(
PrefService* local_state); PrefService* local_state);
// Method used to determine whether a domain is associated with legacy demo
// retail mode, where demo mode sessions are implemented as public sessions.
// Exposed so the matching can be tested.
// TODO(crbug.com/874778): Remove after legacy retail mode domains have been
// disabled.
static bool IsLegacyDemoRetailModeDomain(const std::string& domain);
~DemoModeResourcesRemover() override; ~DemoModeResourcesRemover() override;
// CryptohomeClient::Observer: // CryptohomeClient::Observer:
void LowDiskSpace(uint64_t free_disk_space) override; void LowDiskSpace(uint64_t free_disk_space) override;
// user_manager::UserManager::UserSessionStateObserver:
void ActiveUserChanged(const user_manager::User* user) override;
// Requests demo mode resources removal from the disk. If a removal operation // Requests demo mode resources removal from the disk. If a removal operation
// is already in progress, this method will schedule the callback to be run // is already in progress, this method will schedule the callback to be run
// with the result of the operation in progress. // with the result of the operation in progress.
......
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